- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF124:UPnP
Материал из Linuxformat.
- Hardcore Linux Проверьте себя на крутом проекте для продвинутых пользователей
Содержание |
UPnP: Вещаем медиа
- Передавайте музыку, видео и фотографии с вашей Linux-машины на все ящики с логотипом DLNA, под руководством Грэма Моррисона.
Мобильные телефоны, игровые консоли, телевизоры и десятки других современных устройств теперь умеют воспроизводить поток медиа-данных с вашей Linux-машины. Это стало возможным благодаря магии стандарта UPnP, или, полностью, Universal Plug and Play. В отличие от решения проблем Вселенной масштаба Стивена Хокинга, на что намекает имя спецификации, UPnP создан, чтобы помочь медиа-совместимым устройствам общаться друг с другом, не тратя всю свою жизнь на изучение командной строки. Например, в прошлом номере в статье Семь крутых Linux-проектов мы настроили UPnP-сервер на базе популярного приложения MediaTomb, и пояснения заняли всего страницу. Если вы не сталкивались с этой программой ранее, то она тесно связана со стандартом DLNA – сертифицированной реализацией протокола UPnP, применяемой различных телевизионных и игровых приставках.
Больше, чем с виду
Но установка пакета и его настройка – лишь вершина айсберга. Как и в большинстве случаев, на первый взгляд все просто, а внимательное изучение обнаруживает скрытую сложность. С UPnP это становится очевидным, как только вы захотите подстроить медиа-данные под свое оборудование или даже заставить работать проблемную аппаратуру. Последним мы и займемся.
Хотя UPnP претендует на решение вопросов взаимодействия, проблема совместимости форматов остается. Иными словами, если ваш UPnP-клиент не совместим с каким-либо форматом, ничего не поделаешь – поможет только ручная настройка, и MediaTomb тут особенно подходит благодаря всеохватывающему конфигурационному файлу. Если вы установили MediaTomb через менеджер пакетов, то скорее всего этот файл находится в /etc/mediatomb/config.xml. А если вы запускаете MediaTomb от имени обычного пользователя (что целесообразно, с учетом непредсказуемой природы сервера), файл можно найти в домашней директории спрятанным под .mediatomb. Сделайте его копию и сохраните в надежном месте, чтобы позднее вернуться к рабочей конфигурации, если приключится беда. Потом откройте файл в вашем любимом текстовом редакторе.
Борьба с эксцессами
При виде конфигурационного файла легко и оробеть: в установке по умолчанию он содержит 112 строк и написан как вложенный XML. Но редактирование параметров в нем не сложнее, чем в обычном файле подобного рода. Просто следите, чтобы добавляемые или изменяемые записи были привязаны к правильным элементам и не ломали структуру файла. К примеру, можно исправить раздражающую манеру MediaTomb использовать при запуске каждый раз другой порт, просто добавив одну строку. Ее нужно вставить после строки <server>, так как она имеет тот же уровень вложенности, что и <name> с <home>, но не ниже; то есть она не должна попасть в секцию <storage>. Отступив несколько строк после <server>, наберите следующее:
<port>5050</port>
Для быстрой проверки, что вставленное вами работает как планировалось, сохраните конфигурационный файл и наберите в консоли mediatomb. Сервер запустится, и в выводе консоли должно появиться нечто вроде
2009-08-13 08:42:58 INFO: 192.168.160.128:5050
В данной строке обычно виден номер случайного порта для доступа к web-интерфейсу MediaTomb, но отныне вы можете безбоязненно создать в своем браузере закладку http://192.168.160.128:5050, потому что порт теперь навеки будет 5050. По идее, MediaTomb следовало бы вести себя так по умолчанию; но хорошо уже и то, что такое поведение поддается настройке.
Передаем на PlayStation 3
MediaTomb использует JavaScript для организации различных медиа-файлов в коллекции и представления их списков клиенту. В результате вы можете модифицировать JS-файлы «под себя», задав нужные параметры.
После задания статического порта, следующим важным исправлением, в котором нуждается конфигурационный файл, будет добавление совместимости с PlayStation 3. Как и игровая приставка Microsoft Xbox 360, PS3 может воспроизводить поток фильмов, музыки и фотографий с UPnP-сервера, но в отличие от 360, эта возможность по умолчанию выключена. К счастью, заставить ее работать легко в любой существующей версии. Найдите строку, содержащую <protocolInfo extend= “no”/> и замените “no” на “yes”, а потом перезапустите сервер для включения совместимости с PlayStation 3. Вы должны увидеть сервер MediaTomb в списке Photos [Фото], Music [Музыка] или Videos [Видео] меню PlayStation.
Но здесь-то и проявляют себя ограничения клиента типа PS3. Если у вас смешанная коллекция медиа-файлов, есть хороший шанс нарваться на формат, который PS3 не сможет распознать и, как результат, воспроизвести. UPnP задает протокол для взаимного общения устройств, но не гарантирует совместимость форматов. Для воспроизведения на PS3 лучшим форматом будет DivX – а он не работает при использовании конфигурационного файла MediaTomb по умолчанию. Так вот, пролистайте строки в закомментированных разделах и найдите там <mappings>. Эта секция используется MediaTomb для сопоставления расширения файлов MIME-типу, чтобы при передаче файла на медиа-клиент использовались корректные переводы и мета-данные. MIME-тип уникален для каждого формата и используется для описания его частных особенностей, таких как аудио, видео и изображение, а также кодеков, необходимых для воспроизведения файла.
Единственная строка, которую нужно раскомментировать для работы на PlayStation с AVI-файлами, проецирует их на MIME-тип DivX. AVI, как и OGG, может инкапсулировать медиа-данные, сжатые различными кодеками, и эту информацию нельзя извлечь из расширения файла. Например, нет способа определить, что некий AVI-файл закодирован DivX. MediaTomb хладнокровно передает все AVI-файлы на клиент, не разбирая, DivX они или нет; в результате PlayStation или другой клиент выдают ошибку, пытаясь декодировать файл как DivX. Это подводит нас к следующей теме: обходу этой проблемы за счет перекодирования неподдерживаемого формата в поддерживаемый, в реальном времени.
Тест на совместимость с FIFO
Если вы хотите протестировать, работает ли выбранный вами конвертор с FIFO и MediaTomb, воспользуйтесь командой mkfifo из командной строки. Для создания специального FIFO-файла, пригодного для передачи данных в плейер и из него, наберите
mkfifo /tmp/fifo
Учтите, что вам нужен доступ на чтение и запись к директории /tmp. Обычно это уже настроено в большинстве дистрибутивов. Заглянув в директорию /tmp с помощью команды ls -l, вы увидите там новый файл с типом p (от pipe) в первой колонке вывода. Этот расшифровывается как «именованный канала» и показывает, что команда mkfifo сработала правильно. Теперь воспользуемся той же командой flac, что и при перекодировании в основной части урока. Для этого запустите ее и задайте вывод в наш FIFO-файл:
flac -d -s -f file.flac -o /tmp/fifo
Без прикрепления процесса к выводу в файл /tmp/fifo ничего не произойдет. Процесс flac ожидает считывания данных, и мы можем сделать это с помощью новой версии vlc или простой команды aplay из пакета утилит ALSA. Наберите для примера
aplay /tmp/fifo
Появится сообщение, что aplay обнаружил аудиопоток, и вы услышите звук из файла. Когда проигрывание закончится, оба процесса завершат работу, тем самым удостоверив, что ваш конвертор и MediaTomb будут работать по принятой FIFO-схеме.
Перекодируем медиа-форматы
Возможность конвертации одного формата в другой – одна из лучших сторон MediaTomb. Многие другие серверы UPnP не способны выполнить трюк, который мы продемонстрируем, использовав все те же описания MIME-типов, чтобы включить проигрывание DivX на PS3. Идея такая: создать собственный MIME-тип и затем употребить дополнительную секцию в конфигурационном файле на объяснение MediaTomb способа конверта ции нашего MIME-типа в поддерживаемый клиентом. Внутри этой секции мы вызовем внешний инструмент, который и проделает всю черную работу. Сгодится любая знакомая вам утилита, которая поддерживает FIFO. Это особый вид перенаправления вывода, доступный как часть файловой системы, а не как результат одиночной команды. MediaTomb использует канал FIFO для передачи данных в и из инструмента, выполняющего преобразование. Основными FIFO-совместимыми медиа-конверторами являются FFmpeg, Mencoder и VLC, но вы можете также использовать инструменты командной строки – например, Oggdec или Flac; на последнем мы и построим наш профиль.
Если в вашей системе включен Inotify и MediaTomb скомпилирован с опцией Inotify, то он не будет требовать запускать сканирование папок вручную и сможет добавлять файлы без привлечения сторонних средств.
Файлы FLAC – это сжатые аудиоданные, которые не жертвуют качеством звука в угоду экономии места. Это великолепный формат для музыки с широким частотным диапазоном исходной записи, например, для джаза или классической, но распространяется он вяло, и большинство UPnP-клиентов не воспроизводят FLAC-файлы. Перекодирование FLAC в формат, понимаемый вашим UPnP-клиентом – лучшее из возможных решений (в отсутствие родной поддержки), потому что оно позволяет хранить любимую музыку во FLAC и одновременно воспроизводить ее на требуемом устройстве. Единственной модификацией будет добавление параметров перекодирования в MediaTomb. Если вы планируете перекодировать FLAC-файлы для использования на PS3, то вам нужен самый последний релиз MediaTomb (0.12). Мы создадим профиль под данную версию MediaTomb и PlayStation 3, но он также должен сработаться с большинством других клиентов UPnP. А если этого не произойдет, его легко адаптировать.
Создаем профиль
Для начала добавим новый MIME-тип для нашего преобразования внутри раздела <mimetype-profile-mappings> конфигурационного файла. Например, для конвертации FLAC-аудиофайлов в WAV допишите следующую строку:
<transcode mimetype=”audio/x-Flac” using=”Flac2wav”/>
Она указывает MediaTomb на профиль перекодирования Flac2wav, который мы собрались создать, и чтобы MediaTomb не пропускал данную секцию, измените «no» на «yes» в вышележащей строке <transcoding enabled=«no»>. Новый профиль должен быть добавлен в раздел <profiles>, чуть ниже раздела, в котором мы работаем. Там мы зададим команды для перекодирования одного медиа-формата в другой. В конфигурационном файле предусмотрено несколько примеров, и их легко скопировать или пересоздать. Один из них мы адаптировали для передачи потока FLAC на PS3:
<profile name=”Flac2wav” enabled=”yes” type=”external”> <mimetype>audio/L16</mimetype> <accept-url>no</accept-url> <first-resource>no</first-resource> <hide-original-resource>yes</hide-original-resource> <sample-frequency>44100</sample-frequency> <audio-channels>2</audio-channels> <agent command=”flac” arguments=”-dfs ----force-raw-format ----endian=big ----sign=signed -o %out %in”/> <buffer size=”1048576” chunk-size=”131072” fill- size=”262144”/> </profile>
Первая строка этого фрагмента задает описание профиля, активирует его и присваивает ему имя. Оно должно совпадать с указанным для MIME-типа audio/x-Flac, а мы там использовали Flac2wav. Следующая строка задает MIME-тип, создаваемый нашим процессом конвертации. Мы бы охотнее переконвертировали наш FLAC в WAV-файл, audio/x-wav, но PS3 пока не воспроизводит их. Вместо этого используем «сырые» (raw) аудиоданные: их PS3 поддерживает. Если вы захотите создать WAV-совместимый вывод, просто измените MIME-тип.
Передаем радио
Строка <accept-url> интересна сама по себе, потому что позволяет MediaTomb действовать как прокси между онлайн-ресурсами и клиентом UPnP. Самой частое применение этого параметра – передача потока интернет-радио, который затем можно перекодировать в родной формат, поддерживаемый вашим UPnP-клиентом – конечно, при наличии конвертора. Ссылки можно добавить в базу данных MediaTomb нажатием символа плюс (+) в web-интерфейсе и выбором Внешняя ссылка [External Link [URL] из выпадающего меню Тип ресурса [Resource Type]. Затем вам нужно вставить URL, дать потоку имя и указать MIME-тип, если он вам известен. Так как вы конвертируете не FLAC-радиостанцию (а мы таких даже не знаем), можете оставить параметр accept-url установленным в no.
Параметр first-resource выпихивает перекодированную версию файла в начало списка, если ваш плейер поддерживает более одного формата. Это требуется некоторым проигрывателям, умеющим отображать только первый файл, но о PS3 беспокоиться нечего, поскольку мы вдобавок задали <hide-original-resource>, который и скрывает от PS3 исходные файлы. Теоретически они и так не должны бы отображаться в PS3, потому что формат FLAС здесь не поддерживается, но PlayStation иногда игнорирует эту логику и отображает файлы как поврежденные, если их не скрыть.
Особенности raw-формата
Раз мы конвертируем звук в формат raw, нужно точно описать наш поток битов, чтобы плейер распознал их смысл. Для большинства форматов этот шаг не нужен, потому что они разумно включают эту информацию в заголовок потока, но «сырые» данные лишены подобной роскоши. В итоге понадобится указать как частоту дискретизации, так и число каналов в потоке; это делается с помощью элементов <sample-frequency> и <audio-channels>. Заданные здесь числа обычно берутся из вывода команды, используемой для конвертации, и нам даже не обязательно вникать в формат исходного FLAC-файла. А вот в следующей строке творится самое волшебство – она задает команду и параметры для генерации ожидаемого вывода:
<agent command=”flac” arguments=”-d -s -f ----force-raw-format ----endian=big ----sign=signed -o %out %in”/>
В этом примере использована команда flac, которая является частью стандартного пакета Flac и по идее устанавливается вместе с библиотеками Flac. Вы можете набрать flac -h в командной строке, чтобы убедиться в ее присутствии и посмотреть доступные аргументы. Параметры -d -s -f велят Flac молча распаковать поток и в любом случае перезаписать им файл назначения. Это необходимо, потому что MediaTomb использует FIFO, и Flac увидит, что файл уже существует. Мы также задаем параметры вывода, которые для формата raw зависят от вашей аппаратной конфигурации. MediaTomb заменит %out и %in исходным файлом и FIFO-каналом назначения для конвертации, и вы можете протестировать команду, подставив реальные пути к файлам. Наконец, элемент <buffer size> скопирован сюда из других профилей. Он дает перекодировщику время на обработку файла, пока в вашей системе происходят другие вещи. Правда, добавится задержка воспроизведения, зато исчезнут заикания. Это важно, если вы перекодируете видео или используете маломощный сервер, так как параметр дает MediaTomb больше времени на декодирование сложных участков, и размер буфера задает максимальный размер участка.
Воспроизведение
Единственная проблема при добавлении нового профиля заключается в том, что получение работающей конфигурации достигается методом проб и ошибок, поскольку MediaTomb дает очень мало информации о том, что было неправильно в очередном формате. Лучший способ протестировать новый профиль – это попробовать его.
Чтобы убедиться в его работоспособности, запустите сервер и удалите материалы из базы, которую хотите протестировать. Теперь добавьте туда один файл в формате, который вы хотите перекодировать. Это заставит MediaTomb обновить параметры формата, и вы сможете затем протестировать клиент UPnP и увидеть, работает ли конвертация. Запустив вышеприведенные команды на сервере, вы сможете отследить работу инструментов декодирования и определить его проблемы. Вы должны увидеть, что команда flac на какие-то секунды заберет максимум ресурсов, а затем ваш UPnP-клиент должен начать проигрывать звук. На PS3 наши файлы FLAC предстанут, к примеру, как файлы PCM, и понадобится пара секунд для начала их перекодирования, но после этого вы услышите звук и убедитесь, что MediaTomb делает свое дело.
Клиенты UPnP
Как ни странно, существует не так много клиентов UPnP, пригодных для Linux. Лучшим из используемых нами была комбинация музыкального плейера Rhythmbox из Gnome с модулем расширения Coherence. Coherence – это построенный на Python каркас UPnP, предоставляющий при его индивидуальном использовании функциональность сервера, а при использовании с Rhythmbox – еще и функциональность клиента. Он позволяет Rhythmbox проигрывать ваш контент с сервера, но также может передавать его на другие плейеры сети, даже на Microsoft Media Player. Установить Coherence можно через менеджер пакетов вашего дистрибутива (или с http://coherence.beebits.net); затем загляните в меню Edit > Plugins [Правка > Модули] окна Rhythmbox. Вы найдете его в списке как DNLA/UPnP Sharing And Control Support.
VLC также можно заставить сработаться с клиентом UPnP, применив его совместно с престарелым модулем расширения от CyberLink, но нам это не удалось. Проект Kinsky (http://oss.linn.co.uk/trac/wiki/kinsky) будет лучшим решением, если вы не боитесь сборки приложений из исходников. Это полноценный UPnP-портал, позволяющий контролировать ваше содержимое, а также проигрывать контент с других ресурсов. Лучшим решением будет использование Linux-совместимого NAS, который сделает за вас всю грязную работу. Многие такие устройства могут передавать поток различным клиентам, а также проигрывать ваш контент через USB-динамики, подключенные к NAS.
Если вы хотите использовать альтернативный сервер, то и тут есть выбор. MythTV, к примеру, может передавать контент с использованием протокола UPnP, что будет оптимальным решением, если вы хотите транслировать записи на игровую консоль помимо вашего телевизора. Другой проект, с именем Fuppes, похож на MediaTomb. Оба проекта пытаются обскакать друг друга в возможностях, но в данный момент Fuppes выступает в роли догоняющего. LXF