18
Дек

Каким бы хорошим не был Wowza Media Server, но у него есть одно очень неприятное (но вполне справедливое) неудобство — версия для разработчика ограничена 10 одновременными подключениями, а финансирование некоторых проектов не позволяет приобретать полноценную версию. Поэтому с самого момента работы с RTMP мною рассматривались различные варианты использования открытых разработок. Увы, более-менее рабочим решением до недавнего момента был Red5 — медиа-сервер, сделанный на платформе J2EE, который оставлял впечатление тяжелого и неповоротливого монстра, а остальное и вовсе не выдерживало никакой критики.

Прежде чем перейти к найденному решению, напомню задачу — посредством PBI DCH-4000P-42S в сеть ретранслируется ТВ-каналы со спутника SD-качества в MPEG-2. Каналы поступают на VLC-проигрыватель, который гонит MPEG-TS поток поверх HTTP (это сделано для того, чтобы успешно преодолевать многочисленные брандмауэры и трансляции адресов, за которыми ютятся конечные потребители). Задача же собственно состоит в том, чтобы вещать приходящие ТВ-каналы в сеть еще и поверх RTMP, т.е. доставлять до посетителя посредством Flash-проигрывателя, который, увы, предпочитает H.264.

Ранее это было сделано при помощи VLC и Wowza Media Server. VLC забирал данные с ретранслятора, перекодировал поток и отдавал данные поверх RTP на Wowza, которое благополучно оборачивала их в RTMP. К сожалению, опыт тут же показал, что на используемый сервер вряд ли возможно повесить более одного канала — процесс сжатия в реальном времени довел уровень загрузки всех четырех ядер до 40-50%. Но и одного канала было достаточно для демонстрации технологии.

Новое решение, не ограниченное числом соединений, базируется на erlyvideo, на которое я наткнулся в поисках альтернативы. Проект был одним из многочисленных заброшенных проектов на Google Code, пока за него не взялся Максим Лапшин и не начал активно его развивать. В результате проект динамично обрастает функционалом и уже на данном этапе вполне может быть использован для вышеупомянутой задачи.

Erlyvideo написан на Erlang-е и требует установки соответствующей среды исполнения и библиотек. Помимо этого потребуется VLC, который и данном случает будет заниматься перекодированием потока. К сожалению, стандартный VLC поставки Debian Lenny ничего не знает о x264-кодировщике, поэтому пришлось собрать медиа-комбайн из исходников с добавлением требуемых библиотек.

Строка конфигурации для сборки VLC может выглядеть следующим образом:

1
./configure --enable-live555 --with-live555-tree=/usr/src/live --enable-libdvbpsi --disable-nls --disable-mozilla --disable-postproc --disable-dbus --disable-mad --disable-swscale --disable-glx --disable-fribidi --disable-qt4 --disable-skins2 --enable-x264 --disable-libtool

Далее, необходимо собрать erlyvideo прямо из git-репозитария:

1
2
3
4
git clone git://github.com/maxlapshin/erlyvideo.git
cd erlyvideo
mkdir ebin
make

Erlyvideo так же умеет принимать MPEG-TS поток и переоборачивать его в RTMP, но пока это делает в пассивном режиме — необходимо заставить VLC отдавать перекодированный поток поверх HTTP и при помощи специального сценария на Erlang-е из состава erlyvideo пробросить этот поток на сервис так же поверх HTTP при помощи метода PUT.

Перекодирование с выходом на вещание поверх HTTP в VLC делается следующей командой (поскольку мы делаем все автономно на сервере, используем опцию —daemon, при отладку лучше применять -vvv):

1
su vlc -c "/usr/local/bin/vlc --daemon http://vlc-tv:8001/ '--sout=#transcode{vcodec=h264,venc=x264{me=dia,merange=16,subme=1,analyse=none,direct=spatial,pbratio=1.5,bframes=1,vbv-maxrate=400,vbv-bufsize=400,ratetol=400.0},vb=400,deinterlace=yes,nohurry-up,acodec=mp4a,ab=64,channels=1}:std{access=http,mux=ts{pid-video=101,pid-audio=100},dst=127.0.0.1:8090}'"

Особо отмечу, что параметры подобраны для обеспечения максимальной скорости перекодирования контента — в этом случае нагрузка на процессоры сервера не такая значительная, как при использовании конфигурации кодера, ориентированной на качество картинки.

После чего необходимо запустить erlyvideo. Отредактировав конфигурационный файл ebin/erlymedia.app, вписав наше доменное имя в один из виртуальных хостов, сделаем make start, что запустит сервис как демон (make run произведет запуск в Erlang-консоли с выводом всей отладочной информации). Теперь можно запустить утилиту проброса потока (первый параметр — откуда, второй — куда пробрасываем):

1
2
cd conrib
./reverse_mpegts http://127.0.0.1:8090 http://имя_хоста:8082/stream/название_потока

Однако мы запускаем утилиту на сервере и держать ради нее постоянную консоль было бы не «ком-иль-фо». Поэтому достаточно добавить опцию -detached в третью строку данного сценария — это позволит запускать ее отвязанной от терминала.

Если все сделано корректно — можно попробовать просмотреть поток при помощи JW Media Player (последняя, 5 версия как раз подойдет) — в качестве параметров необходимо указать streamer как rtmp://имя_хоста/, file — название потока (которое после stream в URL назначения). К сожалению, тут есть неудобство, в котором я подозреваю плеер — после начала проигрывания начинает проигрываться только звук без видео, если нажать на паузу, а потом снова на воспроизведение — все будет работать без проблем. Впрочем, это неудобство еще подлежит детальному изучению и устранению.

У меня на tulavideo.net erlivideo таким образом успешно ретранслирует канал РБК. Выглядит это примерно вот так:

tv

15 ком.
  1. Erlyvideo может сам обратиться за MPEG TS потоком, просто сейчас он это делает только если во флеш-плеере указать ему HTTP урл.

    Если есть идеи как именно это сделать получше — я сделаю.

    Максим Крентовский

    Ну, тут, на мой взгляд, два варианта:

    1. посредством промежуточного файла описаний — плеер обращается к файлу что-то-там.link, внутри которого ссылка на MPEG-TS поток. Соответственно, поднимается поток и отдается пользователю. (как с RTP у Wowza, когда они анонсят по SDP)

    2. через админку, простую формочку c с полями «название потока» и «URL»

  2. makcn:

    Удалось ли решить проблему с JW Player? Сам столкнулся с такой же…

    Максим Крентовский

    Пока нет, рассчитываю на праздниках проработать этот вопрос.

  3. Karasur:

    А почему именно JW Player?
    flowplayer не пробовали, он тоже поддерживает rtmp через плугин. Я хотя и не пробовал потоковое с этими плеерами, но после того как мне не удалось нормально запустить псевдостриминг на JW (ролик игрался до половины и зависал), flow без проблем все сделал, даже прикрутил скрытый линк к файлу через плугин.

    Максим Крентовский

    Ну, это вопрос того, с чем больше практика общения. У меня история с точностью до наоборот — там, где JW работал, Flow — капризничал. Наверное, это что-то кармическое… :)

  4. Easy.Mutant:

    Максим, вопрос:
    Вы заведомо исключили связку ffmpeg + ffserver, если да, то почему?

    Дело в том, что к vlc у меня потому и отрицательное отношение, что работает отвратительно — систему грузит, нестабилен.

    Максим Крентовский

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

  5. Atata:

    А не подскажете, что за движок у вас используется на tulavideo.net ??

  6. Atata:

    Интересно :)
    Тогда такой вопрос — кто его писал? И можно ли как то данный двиг заполучить (я думаю можно, раз уж я его встречал на других хостах)?

    Максим Крентовский

    Я его писал. А что значит — на других хостах? На каких, если не секрет?

  7. Atata:

    hdin.tv (был раньше)
    Ну и в нашей лок. сети — оооочень уж напоминает ваш двиг. (хотя ваш я изнутри не видел — сужу по скриншотам)
    Ниже — скрин
    http://clip2net.com/clip/m33318/1285239230-clip-235kb.png

    Максим Крентовский

    Ну, hdin.tv — тоже мой проект, так что не страшно. А в локальной сети ребята, наверное, просто сделали похожий дизайн, а код переписали (да его там и немного, и не так это сложно). Спасибо за информацию.

    В остальном — движок продавать смысла нет, а открывать — стыдно. Ко написан давно и весьма костылен.

Максим Крентовский
системный архитектор
E-mail / GTalk: mkrentovskiy@gmail.com
Skype: mkrentovskiy