Просмотр 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 такая проблема не наблюдается вообще, они умеют синхронизировать картинку со звуком, даже если в потоке есть потери фреймов.

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

  1. Добавил опцию “демонизации” rtmpgw. Теперь программу можно запускать с ключом -Z, и амперсанд в конце строки уже не нужен, т.е. примерно так:

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

    Новая версия доступна для скачивания по ссылке из поста.

  2. Спасибо за отличную статью и выполненную работу, очень помог! В принципе, в url можно не использовать ascii-коды, кроме знака амперсанда.

  3. Рад, что оно пригодилось не только мне. Кстати, собрал rtmpgw и для архитектуры arm. Если кто-то планирует запускать rtmpgw на сетевых хранилищах D-Link DNS 320 или DNS 320L, качайте на здоровье:

    http://www.bloged.org/downloads/arm/rtmpgw

  4. А можно попросить ваши исходники?
    Хочу попробовать собрать для запуска непосредственно на самом телевизоре.

  5. Можно, я выложил исходники. Изменения коснулись только файла rtmpgw.c , а остальное 1:1 осталось то, что есть на Github для версии 2.4.

    Для сборки под mips нужен соответствующий toolchain, и модификация Makefile под toolchain. Я могу помочь со сборкой, только мне надо выбрать правильный toolchain из имеющихся у меня:

    staging_dir_mips
    staging_dir_mips_pb42
    toolchain-mips_gcc-4.3.3+cs_uClibc-0.9.30.1
    toolchain-mips_r2_gcc-linaro_uClibc-0.9.32

    Проверить получившийся бинарник уже не смогу, т.к. у меня нет железки, которая бы это поддерживала.

  6. Спасибо!
    Я хочу пробовать как написано в инструкции http://wiki.samygo.tv/index.php5/Setting_up_a_cross-compilation_toolchain
    Не уверен правда, получится или нет, никогда ничего подобного не делал.
    Но охота как говорится пуще неволи.
    Если вы найдете время скомпилировать у себя, буду очень благодарен.
    Так же было бы замечательно если вы здесь в комментарии, или в рамках отдельной статьи опишете процесс подготовки и компиляции от начала и до конца, на данном конкретном примере, но это уже если у вас будет время и желание.

  7. Без проблем, я готов скомпилировать у себя. Вопрос только, под какую прошивку? Их там много, и какая используется у вас, мне неизвестно. Список доступных toolchains можно посмотреть тут, и они между собой могут быть несовместимы.

    Готовый пример у меня в принципе есть, но он заточен под прошивку роутера D-Link DIR 300 Rev B2. Не факт, что его можно использовать в телевизоре Samsung.

  8. У меня телевизор UE37D5500
    Прошивка T-MST5DEUC
    cat /proc/cpuinfo
    system type : MStar Chip
    processor : 0
    cpu model : MIPS 34Kc V5.5 FPU V0.0
    BogoMIPS : 447.48
    wait instruction : yes
    microsecond timers : yes
    tlb_entries : 64
    extra interrupt vector : yes
    hardware watchpoint : yes, count: 4, address/irw mask: [0x0c78, 0x0ff8, 0x0ffb, 0x0fb3]
    ASEs implemented : mips16 dsp mt
    shadow register sets : 1
    core : 0
    VCED exceptions : not available
    VCEI exceptions : not available
    Думаю T-MST10 должен подойти

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

  9. Хм, просто так не собралось. Я пробовал toolchain для T-MST10 из ссылки выше, но там не хватало uClibc, а без нее бинарник не соберется.

    Я попробовал альтернативный toolchain для OpenWRT (toolchain-mips_gcc-4.3.3+cs_uClibc-0.9.30.1), вот с ним бинарник получился – но проверить его я не могу. Пытался я его запустить на сервере, выдает ошибку – exec format error; у меня используется mipsel, а не mips – поэтому ничего удивительного.

    Если есть желание, можете проверить на своем железе, но т.к. toolchain используется другой, работоспособность гарантировать не могу. Бинарник лежит здесь, исходники для компиляции – тут. Еще надо скачать соответствующий toolchain и развернуть его в /usr/src. И да, этот toolchain предназначен для 64-битных операционок, в противном случае придется собирать свой.

    Буду признателен, если напишете – заработал ли бинарник. В лучшем случае он заработает, в худшем – ругнется на несовместимый формат файла или отсутствующие библиотеки.

  10. При запуске выдает line 1: syntax error: unexpected “(”
    На счет uClibc, в инструкции о которой я писал выше говорится о ключе -mglibc tells the compiler to use GNU/libc instead of uclibs, возможно с ним получится.
    Ради эксперимента решил попробовать позапускать бинарники из dep пакетов, оказалось что бинарник из пакета rtmpdump_2.3-2_mips.deb
    выдает ошибку line 1: syntax error: unexpected word (expecting “)”) в то время как из rtmpdump_2.3-2_mipsel.deb после добавления библиотек ругается на libgnutls.so.26: ELF file version does not match current one
    Так что я теперь и незнаю mips у меня или mipsel
    К слову, бинарник из поста при запуске просто пишет not found
    Продолжаю эксперименты.
    Спасибо.

  11. Похоже, что это не mips, а все-таки mipsel. Попробуй тогда вот этот бинарник. Я его для роутера собирал, но чем черт не шутит – библиотики я линковал статически, он вполне может запуститься без ошибок.

    В этих тулчейнах нет glibc, есть только uClib. Собирать тулчейн из исходников под железо, которого у меня нет, считаю нецелесообразным – т.к. я могу убить на это массу времени, а потом выяснится, что оно не работает. В любом случае, я желаю удачи в поиске решения для телевизора Samsung – к сожалению, на моем телевизоре приложения устанавливать не получится.

  12. К сожалению не заработал.
    Без параметров пишет not found, с ними ничего не пишет и не запускается.
    Буду пробовать дальше.
    Спасибо.

  13. Таки оказался mipsel
    С тулчайнами у меня не задалось, пошел другим путем, поднял в qemu машину на mipsel, поставил на неё debian соответствующий и в нем все собралось. Ничего даже менять не пришлось в исходникак которые вы в первый раз выложили.
    Ещё раз спасибо.

  14. А как с нагрузкой процессора при просмотре rtmp потоков в режиме демона ?
    Я переделывал исходники, чтобы нагрузки не было, а то при стандартной демонизации амперсандом нагрузк возрастала до 100% на DIR-300

  15. У меня нагрузка колебалась от 6 до 30% на DIR 300 Rev B2 при одном клиенте.

  16. Блин а, как же всё сложно, когда не владеешь системой)
    Вот просто, имеется Роутер Zyxel Keenetic и одна rtmp ссылка, можно её как нибудь воспроизвести на телевизоре, по WiFi? Без участия компьютера?

  17. vasvas, можно. Сначала на роутере перекодировать rtmp в http с помощью rtmpgw (как описано в статье), а дальше скормить плееру в телевизоре получившуюся ссылку. У меня это сделано с помощью udpxy и конфигурационного файла со списком каналов. И если тебе повезет (кодек будет поддерживаться телевизором и буферизация нормально отработает), сможешь посмотреть свою rtmp-ссылку на телевизоре без участия компьютера.

    У меня это все замечательно работает не по WiFi, т.к. по проводам всяко скорость больше и не забивается беспроводной канал для других устройств. Но и по WiFi будет работать – например. с ноутбука без проводов я смотрю те же каналы с помощью плеера vlc.

  18. Приветствую, опять =)
    Заимел роутер RT-N65U
    Снова встала проблема сборки уже под него, повторить предыдущий удачный опыт, не вышло, так что прошу помощи.
    Вроде разобрался с тулчeйном, и вроде даже скомпилировалось, но при запуске пишет что не может загрузить библиотеку, хотя она есть в папке lib.
    Пробовал тулчейны отсюда https://code.google.com/p/wl500g-repo/downloads/list и отсюда http://www.streamboard.tv/oscam/wiki/crosscompiling
    Никак не разберусь чтоже не так.
    Можно попросить патч для сборки в тулчейне или правленные под тулчейн исходники? Eсли не затруднит.
    А там я по аналогии может справлюсь.

  19. qazarius, я вернусь в город ближе к выходным (22-23 февраля). Тогда я посмотрю, что можно будет сделать.

  20. qazarius, исходники наверное целиком выкладывать смысла нет – т.к. там меняются только несколько строк вначале 2-х файлов Makefile. У меня это выглядит так. Сами тулчейны лежат тут:

    $ ls -1 /usr/src/dd-wrt
    armb-4.3.2
    sources
    staging_dir_i386.4.2.1
    staging_dir_mips
    staging_dir_mips_pb42
    staging_dir_powerpc
    toolchain-armeb_v5te_gcc-linaro_uClibc-0.9.32
    toolchain-arm_gcc4.2.3
    toolchain-arm_v6k_gcc-linaro_uClibc-0.9.32_eabi
    toolchain-i386_gcc-linaro_uClibc-0.9.32
    toolchain-laguna
    toolchain-mipsel_3.3.6_BRCM24
    toolchain-mipsel_4.1.1_BRCM24
    toolchain-mipsel_gcc4.1.2
    toolchain-mipsel_gcc-linaro_uClibc-0.9.32
    toolchain-mips_gcc-4.3.3+cs_uClibc-0.9.30.1
    toolchain-mips_r2_gcc-linaro_uClibc-0.9.32

    В директории с исходниками rtmpdump есть 2 файла Makefile, один в корне, а второй в поддиректории librtmp. В самом начале этих файлов я прописал пути к соответствующим библиотекам и экземплярам компилятора, выглядит это так:

    $ cat Makefile
    TOOLCHAIN_PATH=/usr/src/dd-wrt/toolchain-mipsel_4.1.1_BRCM24/
    TOOLCHAIN_BIN_PATH=$(TOOLCHAIN_PATH)bin/
    TOOLCHAIN_LIB_PATH=$(TOOLCHAIN_PATH)lib/
    AR=$(TOOLCHAIN_BIN_PATH)mipsel-linux-uclibc-ar
    AS=$(TOOLCHAIN_BIN_PATH)mipsel-linux-uclibc-as
    LD=$(TOOLCHAIN_BIN_PATH)mipsel-linux-uclibc-ld
    NM=$(TOOLCHAIN_BIN_PATH)mipsel-linux-uclibc-nm
    CC=$(TOOLCHAIN_BIN_PATH)mipsel-linux-uclibc-gcc
    CPP=$(TOOLCHAIN_BIN_PATH)mipsel-linux-uclibc-cpp
    GCC=$(TOOLCHAIN_BIN_PATH)mipsel-linux-uclibc-gcc
    CXX=$(TOOLCHAIN_BIN_PATH)mipsel-linux-uclibc-g++
    RANLIB=$(TOOLCHAIN_BIN_PATH)mipsel-linux-uclibc-ranlib
    ac_cv_linux_vers=2.6.23
    VERSION=v2.4
    prefix=/usr/src/dd-wrt/toolchain-mipsel_4.1.1_BRCM24
    ….

    Ну и ниже в Makefile я закомментировал те переменные, которые были определены выше, чтобы компилятор и пути к библиотекам цеплялись из правильных мест.

    Второй Makefile из директории librtmp был допилен аналогичным способом. Потом собрал так:

    make SHARED= CRYPTO=

    Первый параметр убирает использование расшаренных библиотек и статически линкует все в бинарники, второй отключает SSL (т.к. тулчейн не содержал собранных библиотек шифрования).

    А тулчейн я брал отсюда, ссылка на него есть в вики dd wrt. Этот тулчейн собран под x86_64.

  21. Спасибо!
    Все получилось.
    Не знал что можно обойтись без библиотек шифрования.

  22. Здравствуйте! Можете помочь со сборкой под роутер snr-cpe-w4n на MIPS. Проц такой:
    The RT3052 SOC combines Ralink’s 802.11n draft
    compliant 2T2R MAC/BBP/RF, a high performance
    384MHz MIPS24KEc CPU core,
    Я смотрел по вашей ссылке на тулчейны, получается может подойти http://svn.code.sf.net/p/samygo/code/develop/toolchains/T-TDT/

  23. Ruslik, тулчейн, который ты указал, относится к телевизору Samsung, а не к роутеру.

    Роутер твой – аналог D-Link DIR-615, и в теории rtmpgw моей сборки должен на нем нормально работать – при условии, что у тебя на роутере уже установлен DD-WRT версии v24-sp2 (08/07/10) std – build 14896. Один из двух бинарников может подойти – либо этот, либо этот. Скачай и попробуй запустить файл без параметров – возможно, что он заработает сразу и без дополнительных мучений.

  24. Спасибо за скорый ответ! У меня стоит прошивка wive-ng-rtnl и я думал что разницы то нет какая стоит, оказывается я заблуждался? Я пробовал запустить оба варианта под wive-ng-rtnl – ноль эмоций ).

  25. Ruslik, видимо, разница в версиях прошивок все же есть. Кстати, wive-ng-rtnl бывает двух видов – Rev A и Rev B, они заточены под разное железо. Мои бинарники скорее всего подойдут под Rev B. Но если у тебя другое железо, придется методом научного перебора подобрать подходящий toolchain и собрать версию бинарника под него.

    Так как у меня нет под рукой роутера с твоей прошивкой, проверить работоспособность получившегося бинарника я не смогу.

Обсуждение закрыто.