суббота, 9 августа 2014 г.

Настройка Linux-сервера в качестве UPNP (DLNA) Media Server для телевизоров Samsung

Дано:
  • Телевизор Samsung LE-40C550J1W(R)
  • Файл-сервер на Debian Lenny Linux, хранящий архив музыки в MP3 и FLAC
Задача:
  • Подключить телевизор к локальной сети
  • Настроить доступ телевизора к музыкальной библиотеке для прослушивания музыки
  • Настроить воспроизведение видео по сети
Решение:

Подключение телевизора проще всего делать обычным проводом, т.к. Wi-Fi адаптер для него небыстрый и по цене сравним с сетевым HD-плеером.
Раз телевизор сам не умеет "ходить" по сетевым ресурсам, других вариантов, кроме настройки UPNP-сервера вроде как и не предвидится. Из всего многообразия  UPNP-серверов, приведенного на википедии, после сравнения их характеристик, я выбрал MediaTomb, как максимально "упакованный" из бесплатных с развитой поддержкой перекодирования, что в данном случае крайне важно, т.к. телевизоры, в отличие от ПК, почему-то не умеют проигрывать FLAC.
Установка MediaTomb под Debian очень простая и описывается в один абзац тут. Конфигурация по-умолчанию уже годится для использования, добавить папки можно через WEB-GUI (ярлык в меню "Программы" создается автоматически). В результате, Windows Media Player видит UPNP-сервер, видит на нем файлы, умеет играть FLAC с отображением тэгов. А вот телевизор не увидел сервера вообще. Лечится раскомментированием следующих строчек в файле конфигурации config.xml:

<custom-http-headers><add header="X-User-Agent: redsonic"/>
<add header="transferMode.dlna.org: Streaming"/>
<add header="contentFeatures.dlna.org: DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=017000 00000000000000000000000000"/>
</custom-http-headers>
И перезапуском демона командой #/etc/init.d/mediatomb restart, причем сразу можно увидеть есть ли ошибки в конфиге.
Теперь телевизор все видит, но играет только MP3, а на FLAC ругается "неизвестный формат".
Попутно обнаружилась одна проблема - русские файлы нормально не отображаются. Решение очень простое и заключается в добавлении следующих трех строк в файл config.xml вмежду тэгами </server> и <import hidden-files="no">
<filesystem-charset>UTF-8</filesystem-charset>
<metadata-charset>UTF-8</metadata-charset>
<playlist-charset>UTF-8</playlist-charset>
Для воспроизведения FLAC на устройствах, его неподдерживающих, положено настраивать перекодирование на лету в удобоваримый формат. Сразу же выяснилось, что кодеков в Debian Lenny не предусмотрено из-за лицензионной политики, но их можно поставить с отдельного репозитория. Инструкция по установке кодеков есть прямо на сайте Debian.org.
Перекодирование включается опцией <transcoding enabled="yes">, далее, в зависимости от форматов, в конфигурационном файле прописывается команда перекодирования. Конфигурация по-умолчанию не заработала. Пришлось попрыгать вечер с бубном, в итоге, самое простое решение -- внешний скрипт для кодирования, на вход которому подаются параметры входных/выходных потоков. Скрипт намного более универсален -- при подборе нет необходимости в перезапуске демона, его можно отладить в консоли и он обходит ограничение MediaTomb, не позволяющее запускать цепочку команд.
В результате у меня получились три версии скрипта:
  • с использованием ffmpeg и переводом FLAC -> MP2
  • Комбинация FLAC->WAV->LAME (MP3)
  • с использованием Gstreamer и переводом FLAC->MP3 (сохраняет тэги и встроенные обложки)
К сожалению, при любом варианте выхода в MP3 были проблемы с буферизацией на телевизоре, пляски с бубном вокруг параметров буферизации MediaTomb результатов не давали, в худших случаях телевизор просто отказывался воспроизводить поток. При этом ПК уверенно все переваривал. Возможно, это было вызванно недостатком вычислительной мощности Linux-сервера, хотя по моим замерам, перекодирование FLAC->MP3 происходило в три раза быстрее длительности файла. Так что в итоге я оставил перекодировку звука в формат MP2 с битрейтом 320кбит/с. Был даже произведен вариант скрипта, сохраняющий тэги и вложенные обложки, но, к сожалению, телевизор их не распознал в таком виде, в отличие от UPNP-клиентов на обычном ПК. При этом, из обычных MP3 файлов  телевизор прекрасно получает тэги, обложки и т.п. Возможно, проблема где-то еще, но на музыку это не влияет.
Часть моего конфига, отвечающая за перекодирование:
<transcoding enabled="yes">
<mimetype-profile-mappings>
<transcode mimetype="audio/x-flac" using="audio-flac"/>
</mimetype-profile-mappings>
<profiles>
<profile name="audio-flac" enabled="yes" type="external">
<mimetype>audio/mpeg</mimetype>
<accept-url>no</accept-url>
<first-resource>yes</first-resource>
<hide-original-resource>yes</hide-original-resource>
<accept-ogg-theora>no</accept-ogg-theora>
<sample-frequency>44100</sample-frequency>
<audio-channels>2</audio-channels>
<agent command="/usr/bin/flac2mp3_vt.sh" arguments="%in %out"/>
<buffer size="1048576" chunk-size="262144" fill-size="262144"/>
</profile>
</profiles>
</transcoding>
Скрипт для перекодирования (работают все варианты, неиспользуемые закомментированы) flac2mp3_vt.sh:
#!/bin/sh
#flac -d -f -c -s "$1" | lame -S --noreplygain --strictly-enforce-ISO --cbr -b 256 - "$2"
#flac -d -f -c -s "$1" | lame -S --cbr -b 128 - "$2"
#ffmpeg -y -i "$1" -acodec mp2 -ab 320k -ac 2 -f mp3 "$2"
#flac -d -f -c -s "$1" | lame -S --cbr -b 320 - "$2"
#flac -d -f -c -s "$1" | lame -S --cbr -b 128 - "$2"
#gst-launch filesrc location = "$1" ! flacdec ! audioconvert! lame vbr=0 bitrate=320 ! id3mux name=tag v2-tag=true v1-tag=true ! filesink location = "$2"
ffmpeg -y -i "$1" -acodec mp2 -ab 320k -ac 2 -f mp3 "$2"
Итоговый файл конфигурации (некоторые поля заменены на ***) MediaTomb config for Samsung TV, 2 kB .
PS: Видео он тоже выдает, только вот некоторые файлы телевизор видит, а играть отказывается, ссылаясь на неподдерживаемый формат, хотя будучи скопированными на USB-носитель телевизором они прекрасно играются.
Дополнение от 27.10.10:
Формат MKV (Matroska)  с первой версией конфига не проигрывался. Оказывается, телевизорам Samsung нужно выдавать в описании потока X-MKV вместо X-MATROSKA. Правится корректировкой строки файла конфигурации (вложение обновил) с

<map from="mkv" to="video/x-matroska"/>

на

<map from="mkv" to="video/x-mkv"/>

Дополнение от 02.11.10:
Неожиданно "умер" ffmpeg. При любой попытке обращения к FLAC-файлам возникает ошибка сегментирования (segmentation fault), в качестве решения подходит такая команда

Взято тут http://blog.timofeyev.ru/2010/10/18/linux_samsung_upnp_dlna_server

  1. 1. Олег пишет:
    У меня Samsung UE37C6000RW, Kubuntu 10 + MediaTomb.
    Пока заставить их работать не удаётся. На телике видно медиафайлы, но при попытке воспроизведения — «Неподдерживаемый формат». На все типы контента.
    Зато точно выявлено, что предложенный здесь (и в др источниках) add header содействует крушению MediaTomb´а после неудачных попыток воспроизведения.
    Vasiliy Reply:

    В качестве первого шага, все должно работать и с Windows Media Player. После установки MediaTomb c конфигурацией «по умолчанию», ПК все отрабатывает, в отличие от телевизора. За все время ковыряний падений не происходило ни при каких условиях.
    hal69 Reply:

    Если установлен KiS11 обязательно настрой сетевой экран.Найди в нем PC Share Manager-сеть,найди свою локальную сеть измени статус сети на «доверенная»и будет тебе счастье. содержимое папок увидишь!
  2. 2. Олег пишет:
    Медиасервер под Windows7 работает и воспроизводит всё нормально. MediaTomb по-умолчанию вел себя также как и сейчас. Только сейчас он превьюшки показывает.
    Vasiliy Reply:

    Возможно, крушения вызваны другой сборкой/версией MediaTomb в Kubuntu.
    У меня версии пакетов такие:
    main 0.11.0-3
    base 0.11.0-3+b4
    daemon 0.11.0-3
    max Reply:

    На телевизоре есть система Media Play ?
  3. 3. max пишет:
    все установил, учел все инструкции
    но комп с Медиа плеером ничего не видит.
    Телик видит только списки директорий, а фаилов внутри нет(
    В лог пишется странное сообщение:
    tail /var/log/mediatomb.log
    2010-11-12 00:16:16 ERROR: ActionRequest::update(): response is nil, code -115
    2010-11-12 00:16:18 ERROR: ActionRequest::update(): response is nil, code -115
    2010-11-12 00:16:18 ERROR: ActionRequest::update(): response is nil, code -115
    Посмотрел на сайте mediatomb
    http://mediatomb.cc/doxygen/upnp_8h.html
    #define UPNP_E_BAD_RESPONSE -113
    UPNP_E_INVALID_ACTION [-115]
    { UPNP_E_INVALID_ACTION} signifies that the SOAP action message is invalid. This can be because the DOM document passed to the function was malformed or the action message is not correct for the given action.
    Есть идеи?
    Vasiliy Reply:

    Идея: в WEB-GUI файлы видны в соответствующих ветках деревьев Audio, Video?
  4. 4. max пишет:
    Да на сервере все нормально, показывает что сохранил все фаилы. Стартует и все ок. С VLC на сервере показывает но вот с телека видит только папки и говорит что в них пусто. Уже перегуглил весь инет, проверял конфиг 10 раз) Где-то вычитал, что в Samsung в 6 серии по дурацки сделано DLNA, смотрел обновление прошивок, но там с DLNA никаких фиксов не производилось
    Vasiliy Reply:

    А если в дереве на web-gui посмотреть свойства элементов, у них будет class=object.item.videoItem; Mimetype=video/что-то там?
    Я для известных типов файлов правил mimetype секцию в файле конфигураций, т.к. каждый производитель желает видеть свои тэги.
    Ну и тоже интересно, MP3 играются? У них, соответственно, должно быть object.item.audioItem.musicTrack и audio/mpeg
  5. 5. max пишет:
    mp3 не пробовал, в конфиге вроде все типы тоже подправлял, сегодня ближе к вечеру гляну
  6. 6. max пишет:
    Вот конфиг который я юзаю
    http://coherence-project.org/attachment/ticket/248/config.xml
    не mp3 фаилы тоже не видит. Как-то очень странно
    Vasiliy Reply:

    Если вообще файлы не видит, то либо это глобальная проблема с сервером (что маловероятно, т.к., как я понял, VLC играет), либо локальная проблема с конфигурацией. На первый взгляд видны отличия в секции «сustom -http-headers» и чуть ниже. Нужно убедиться, что в WEB-GUI файлы определились с правильными аттрибутами.
    Еще можно попробовать Coherence UPNP Server, телевизор его тоже видит, включая все файлы на диске, но детально я глубоко не копался. И, если проводить корректировку параметров типов, нужно не только перезапускать MediaTomb, но и переиндексировать файлы, иначе аттрибуты не обновляются.
  7. 7. max пишет:
    ок, понял, спасибо) покопаюсь еще, если что нить интересное откопаю — отпишусь в вашем блоге
  8. 8. max пишет:
    Вчера доразбирался с Медиатомбом, стал проигрывать все ок) Но ошибка в лог все равно пишется.
    Дело было не в этой ошибке о которой я писал выше. Надо очень серьезно подойти вот к этой секции параметров и правильно выставить mime type
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    пока точно знаю что данная секция содержит ошибки!
    Буду искать нормальные контент тайпы и править.
    Пауза и перемотка работают отлично без перекодировки.
    Но вот я так и не понял как воспользоваться ffmpegtumbanaller в debian lenny пакет такой отсутствует.
    Можно скачать его в тестовых репах сквиза, но на ленни не собирается. Решали данную проблему как-нибудь?
    Vasiliy Reply:

    Поздравляю с успехом!
    Тоже хотел сделать, но ffmpeg неожиданно умер, оживить пока не смог, так что иконки к фильмам мне не сделать. Имхо, это актуально если хранить постоянную коллекцию фильмов и клипов.
    max Reply:

    удобно определять тот фильм который ты смотрел по тумбаналке, потому что она должна тормозиться и в следующий раз перегенериться на месте где была остановка ролика
  9. 9. max пишет:
    mimetype-contenttype>
    treat mimetype=»audio/mpeg» as=»mp3″
    treat mimetype=»application/ogg» as=»ogg»
    treat mimetype=»video/x-divx» as=»avi»
    вот теги порезались)) stripslashes — не очень красивая обработка))))
  10. 10. ujinsky пишет:
    А как можно схему проверить до подключения телека? я по вашей инструкции mdiatomb поднял, телека пока нет — а проверить надо. Дома только linux-машины, WMP нет. Какой клиент для этого есть? VLC? или что еще?
    Спасибо.
    vasiliy Reply:

    Обычно в таком случае ставится XBMC, но можно что-то еще (http://en.wikipedia.org/wiki/List_of_UPnP_AV_media_servers_and_clients#Linux).
    ujinsky Reply:

    спасибо. будем пробовать :)
  11. 11. ujinsky пишет:
    Еще раз спасибо за мануал!
    Телевизор увидел сервер и его содержимое.
    Но из видио показывает только MKV. На avi говорит «Формат файла не поддерживается». Формат файлов avi/XviD или divx.
    Что-нть с этим можно сделать?
    Спасибо.
    vasiliy Reply:

    Проверить AVI прямо на телевизоре через USB. Если не играет — дальше можно не мучиться, если напрямую играет, то смотреть конфиг mediatomb'а, там в моем примере есть настройки mimetype для телевизора.

Комментариев нет:

Отправить комментарий