Мой телевизор 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 такая проблема не наблюдается вообще, они умеют синхронизировать картинку со звуком, даже если в потоке есть потери фреймов.
Добавил опцию “демонизации” 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
Новая версия доступна для скачивания по ссылке из поста.
Спасибо за отличную статью и выполненную работу, очень помог! В принципе, в url можно не использовать ascii-коды, кроме знака амперсанда.
Рад, что оно пригодилось не только мне. Кстати, собрал rtmpgw и для архитектуры arm. Если кто-то планирует запускать rtmpgw на сетевых хранилищах D-Link DNS 320 или DNS 320L, качайте на здоровье:
http://www.bloged.org/downloads/arm/rtmpgw
супер!
А можно попросить ваши исходники?
Хочу попробовать собрать для запуска непосредственно на самом телевизоре.
ну или бинарник под mips
Можно, я выложил исходники. Изменения коснулись только файла 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
Проверить получившийся бинарник уже не смогу, т.к. у меня нет железки, которая бы это поддерживала.
Спасибо!
Я хочу пробовать как написано в инструкции http://wiki.samygo.tv/index.php5/Setting_up_a_cross-compilation_toolchain
Не уверен правда, получится или нет, никогда ничего подобного не делал.
Но охота как говорится пуще неволи.
Если вы найдете время скомпилировать у себя, буду очень благодарен.
Так же было бы замечательно если вы здесь в комментарии, или в рамках отдельной статьи опишете процесс подготовки и компиляции от начала и до конца, на данном конкретном примере, но это уже если у вас будет время и желание.
Без проблем, я готов скомпилировать у себя. Вопрос только, под какую прошивку? Их там много, и какая используется у вас, мне неизвестно. Список доступных toolchains можно посмотреть тут, и они между собой могут быть несовместимы.
Готовый пример у меня в принципе есть, но он заточен под прошивку роутера D-Link DIR 300 Rev B2. Не факт, что его можно использовать в телевизоре Samsung.
У меня телевизор 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 должен подойти
И пример выложите пожалуйста, я посмотрю может хоть пойму в каком направлении надо двигаться.
Спасибо.
Хм, просто так не собралось. Я пробовал 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-битных операционок, в противном случае придется собирать свой.
Буду признателен, если напишете – заработал ли бинарник. В лучшем случае он заработает, в худшем – ругнется на несовместимый формат файла или отсутствующие библиотеки.
При запуске выдает 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
Продолжаю эксперименты.
Спасибо.
Похоже, что это не mips, а все-таки mipsel. Попробуй тогда вот этот бинарник. Я его для роутера собирал, но чем черт не шутит – библиотики я линковал статически, он вполне может запуститься без ошибок.
В этих тулчейнах нет glibc, есть только uClib. Собирать тулчейн из исходников под железо, которого у меня нет, считаю нецелесообразным – т.к. я могу убить на это массу времени, а потом выяснится, что оно не работает. В любом случае, я желаю удачи в поиске решения для телевизора Samsung – к сожалению, на моем телевизоре приложения устанавливать не получится.
К сожалению не заработал.
Без параметров пишет not found, с ними ничего не пишет и не запускается.
Буду пробовать дальше.
Спасибо.
Таки оказался mipsel
С тулчайнами у меня не задалось, пошел другим путем, поднял в qemu машину на mipsel, поставил на неё debian соответствующий и в нем все собралось. Ничего даже менять не пришлось в исходникак которые вы в первый раз выложили.
Ещё раз спасибо.
А как с нагрузкой процессора при просмотре rtmp потоков в режиме демона ?
Я переделывал исходники, чтобы нагрузки не было, а то при стандартной демонизации амперсандом нагрузк возрастала до 100% на DIR-300
У меня нагрузка колебалась от 6 до 30% на DIR 300 Rev B2 при одном клиенте.
Блин а, как же всё сложно, когда не владеешь системой)
Вот просто, имеется Роутер Zyxel Keenetic и одна rtmp ссылка, можно её как нибудь воспроизвести на телевизоре, по WiFi? Без участия компьютера?
vasvas, можно. Сначала на роутере перекодировать rtmp в http с помощью rtmpgw (как описано в статье), а дальше скормить плееру в телевизоре получившуюся ссылку. У меня это сделано с помощью udpxy и конфигурационного файла со списком каналов. И если тебе повезет (кодек будет поддерживаться телевизором и буферизация нормально отработает), сможешь посмотреть свою rtmp-ссылку на телевизоре без участия компьютера.
У меня это все замечательно работает не по WiFi, т.к. по проводам всяко скорость больше и не забивается беспроводной канал для других устройств. Но и по WiFi будет работать – например. с ноутбука без проводов я смотрю те же каналы с помощью плеера vlc.
Приветствую, опять =)
Заимел роутер RT-N65U
Снова встала проблема сборки уже под него, повторить предыдущий удачный опыт, не вышло, так что прошу помощи.
Вроде разобрался с тулчeйном, и вроде даже скомпилировалось, но при запуске пишет что не может загрузить библиотеку, хотя она есть в папке lib.
Пробовал тулчейны отсюда https://code.google.com/p/wl500g-repo/downloads/list и отсюда http://www.streamboard.tv/oscam/wiki/crosscompiling
Никак не разберусь чтоже не так.
Можно попросить патч для сборки в тулчейне или правленные под тулчейн исходники? Eсли не затруднит.
А там я по аналогии может справлюсь.
qazarius, я вернусь в город ближе к выходным (22-23 февраля). Тогда я посмотрю, что можно будет сделать.
Благодарю.
Буду ждать.
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.
Спасибо!
Все получилось.
Не знал что можно обойтись без библиотек шифрования.
Здравствуйте! Можете помочь со сборкой под роутер 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/
Ruslik, тулчейн, который ты указал, относится к телевизору Samsung, а не к роутеру.
Роутер твой – аналог D-Link DIR-615, и в теории rtmpgw моей сборки должен на нем нормально работать – при условии, что у тебя на роутере уже установлен DD-WRT версии v24-sp2 (08/07/10) std – build 14896. Один из двух бинарников может подойти – либо этот, либо этот. Скачай и попробуй запустить файл без параметров – возможно, что он заработает сразу и без дополнительных мучений.
Спасибо за скорый ответ! У меня стоит прошивка wive-ng-rtnl и я думал что разницы то нет какая стоит, оказывается я заблуждался? Я пробовал запустить оба варианта под wive-ng-rtnl – ноль эмоций ).
Ruslik, видимо, разница в версиях прошивок все же есть. Кстати, wive-ng-rtnl бывает двух видов – Rev A и Rev B, они заточены под разное железо. Мои бинарники скорее всего подойдут под Rev B. Но если у тебя другое железо, придется методом научного перебора подобрать подходящий toolchain и собрать версию бинарника под него.
Так как у меня нет под рукой роутера с твоей прошивкой, проверить работоспособность получившегося бинарника я не смогу.