Просмотр RTMP-потока на телевизорах Samsung

Мой телевизор Samsung UE46C5000QW не умеет просматривать видео, транслируемое в UDP или в RTMP. Зато он умеет смотреть фильмы по сети с использованием DLNA, поэтому я решил попробовать настроить связку телевизора UE46C5000QW и роутера D-Link DIR 300 Rev b для просмотра IPTV без использования компьютера — это не так уж и сложно.

Родная прошивка DIR 300 вполне справлялась с UDP потоками, но преобразовать UDP поток в DLNA-совместимый HTTP поток ей не по зубам. Пришлось сменить прошивку роутера на DD-WRT v24-sp2 (build 14896). Прошивка хороша тем, что под нее можно собирать много линуксовых приложений, загружать их при необходимости и использовать по прямому назначению. Под прошивку были найдены udpxy (преобразователь udp потока в tcp), и upnpd — маленький демон, который публикует плейлисты в DLNA-совместимом формате. Информации о том, как это можно сделать, в сети навалом; так же как и сборок этих приложений под большинство роутеров, работающих под DD WRT или OpenWRT.

Все бы хорошо, но вот потоки RTMP по-прежнему смотреть на телевизоре было невозможно. Для преобразования RTMP в HTTP был давным-давно написан пакет rtmpdump, в составе которого есть маленький прокси — rtmpgw, который в теории должен справляться с задачей.

Но тут есть три проблемы. Во-первых, чистый rtmpgw не добавляет правильные заголовки в http-поток, в результате чего телевизор разрывает соединение и ругается на неподдерживаемый формат файла (даже если видео и аудио кодеки абсолютно точно поддерживаются им). Любой расово правильный медиаплеер (mplayer, vlc) показывают такие потоки, но не телевизоры Samsung.

Во вторых, из-за одной довольно криво написанной функции оригинальный rtmpgw очень нехило кушает CPU, что не есть хорошо.

В-третьих, я так и не нашел готовой сборки rtmpgw для dd-wrt своего роутера. Поэтому пришлось качать исходники, ковыряться в исходном коде и собирать свой вариант rtmpgw. И в результате у меня получился вот такой бинарник rtmpgw (mipsel, не путать с mips — он не совместим) — качайте на здоровье и можете ставить его в свой роутер.

Использовать его можно примерно так. На роутере сохраняются команды, выполняемые при каждой загрузке:

cd /tmp
wget http://www.bloged.org/downloads/rtmpgw
chmod +x rtmpgw
/tmp/rtmpgw --buffer 120000 -v -g 8082 -D 192.168.1.1 >/dev/null 2>/dev/null &

где 192.168.1.1 — внутренний IP роутера

Если запуск прошел успешно, то по адресу http://192.168.1.1:8082 будет транслироваться RTMP поток, который можно передать в качестве параметра. Проверить работоспособность можно из локальной сети за роутером:

vlc "http://192.168.1.1:8082/?r=rtmp:%2F%2Fvipwowza.yacast.net%2Ffrance24_live_en&s=http:%2F%2Fwww.france24.com%2Fen%2Fsites%2Fall%2Fmodules%2Fmaison%2Faef_player%2Fflash%2Fplayer_new.swf&t=rtmp:%2F%2Fvipwowza.yacast.net%2Ffrance24_live_en&p=http:%2F%2Fwww.france24.com&y=f24_liveen.stream"

VLC покажет англоязычную трансляцию France 24, если мой бинарник совместим с вашей прошивкой и вы все сделали правильно. К сожалению, транслировать такое в телевизор Cамсунг не получится — конкретно в этом потоке он не поймет кодеки (по крайней мере мой телевизор ругается на них). Тут нужен транскодинг, но это уже совсем другая тема для разговора.

Остальные каналы, которые я нашел с кодеками H264 – MPEG-4 AVC / Mpeg Audio Layer (mpga), транслируются без проблем.

Заметил одну особенность в некоторых трансляциях. Часть из них транслируются нормально, у другой части наблюдается прогрессирующее отставание звука от картинки на телевизорах Samsung. Убогий самсунговский плеер почему-то не может синхронизировать видео и звук при длительной работе на таких потоках. Причем если поток сохранить в файл и открыть его через DLNA, отставания нет даже в телевизоре; оно наблюдается только при онлайн трансляции. А в vlc или mplayer такая проблема не наблюдается вообще, они умеют синхронизировать картинку со звуком, даже если в потоке есть потери фреймов.