Erlyvideo — Erlang RTMPD

69 views
Skip to first unread message

Max Lapshin

unread,
Sep 4, 2009, 7:07:31 AM9/4/09
to Erlang в России
Моё знакомство с эрлангом началось с того, что я решил оживить RTMP
сервер erlyvideo: http://code.google.com/p/erlyvideo/
Авторы его забросили совсем, так что я решил его актуализировать --
многое стало известно про этот закрытый протокол.

В данный момент репозиторий находится тут: http://github.com/maxlapshin/erlyvideo

Из того, что я дописал -- он теперь всё таки умеет рассылать сообщения
по флеш-клиентам (вариации на тему push-канала)
и я начал учить его чтению mp4 файлов. Сейчас они не играются,
предположительно из-за неправильного хендшейка.
Если кому интересно -- смотрите.

Garanin Michael

unread,
Sep 5, 2009, 4:29:10 AM9/5/09
to erlang-...@googlegroups.com
кстати: протокол RTMP уже открыли. спецификация на сайте адоба.
я делал rmtp-стриминг правда на питоне, и в этом плане для понимания как
парсить mp4-файлы rubyizumi более понятен.

Max Lapshin

unread,
Sep 5, 2009, 5:07:47 AM9/5/09
to erlang-...@googlegroups.com
2009/9/5 Garanin Michael <m-ga...@yandex.ru>:

> кстати: протокол RTMP уже открыли. спецификация на сайте адоба.
> я делал rmtp-стриминг правда на питоне, и в этом плане для понимания как
> парсить mp4-файлы rubyizumi более понятен.

Не хочу огорчать, но протокол открыли лишь частично. Это больше
напоминает умышленную дезинформацию,
чем публикация протокола. Ruby izumi не просто так генерирует
специфичный handshake,
именно в нём кроется включение h264 стриминга.

Max Lapshin

unread,
Sep 5, 2009, 5:12:14 AM9/5/09
to erlang-...@googlegroups.com
2009/9/5 Garanin Michael <m-ga...@yandex.ru>:

> кстати: протокол RTMP уже открыли. спецификация на сайте адоба.
> я делал rmtp-стриминг правда на питоне, и в этом плане для понимания как
> парсить mp4-файлы rubyizumi более понятен.

Да, Михаил, у вас видео то показывалось? rtmpy это ваш?

Garanin Michael

unread,
Sep 5, 2009, 6:40:56 AM9/5/09
to erlang-...@googlegroups.com
да у нас оно показывается, затачивали конкретно под mp4. всё таки
rubyizumi под рукой был :-) но это закрытый проект.
rtmpy - поделка, у них даже номера стримов аудио\видео путались от
версии к версии
насчёт хендшейка - взял из rubyizumi.
сейчас тоже собираюсь на erlang'е сделать rtmp-сервер для конференций.
поскольку тема rtmp к рассылке неотноситься предлагаю обсуждать в личке.

Garanin Michael

unread,
Sep 7, 2009, 7:40:03 AM9/7/09
to erlang-...@googlegroups.com
да, действительно на плеере 10.0.32.18 картинки нет.
но патч пары строк заставил её появиться:
http://osflash.org/pipermail/red5_osflash.org/2009-August/035534.html

05.09.09, 13:12, "Max Lapshin" <max.l...@gmail.com>:

> 2009/9/5 Garanin Michael :


> > кстати: протокол RTMP уже открыли. спецификация на сайте адоба.
> > я делал rmtp-стриминг правда на питоне, и в этом плане для понимания как
> > парсить mp4-файлы rubyizumi более понятен.
> Да, Михаил, у вас видео то показывалось? rtmpy это ваш?
>

--
Яндекс.Почта. Поищите спам где-нибудь еще http://mail.yandex.ru/nospam/sign

Dmitrii Dimandt

unread,
Sep 7, 2009, 10:57:27 AM9/7/09
to erlang-...@googlegroups.com
Я сообщение о реанимации erlyvideo зкинул в
erlang questions.

Насчет mp4 появилась такая инфа (на
англ., нет времени переводить. если
надо будет перевести, попросите :) )

The problem with playing mp4 files is quite possibly a lack of AVC
sequence
header (check the official flash file format spec). The AVC sequence
header
needs to be sent to the client before any h264 video frame, otherwise
flash
will not display the video.
This is something that needs to be generated from the encoded video
frames,
because it is not present in the mp4 file format.
Look at the ffmpeg source code to see how to generate the avc sequence
header. It's in libavformat/flvenc.c a call to ff_isom_write_avcc(...)
does
and it is defined in libavformat/avc.c

Max Lapshin

unread,
Sep 7, 2009, 11:03:25 AM9/7/09
to erlang-...@googlegroups.com
2009/9/7 Dmitrii Dimandt <dmit...@gmail.com>:

>
> Я сообщение о реанимации erlyvideo зкинул в
> erlang questions.
>
> Насчет mp4 появилась такая инфа (на
> англ., нет времени переводить. если
> надо будет перевести, попросите :) )
>


О, спасибо большое.

Dmitrii Dimandt

unread,
Sep 7, 2009, 11:05:50 AM9/7/09
to erlang-...@googlegroups.com
Меня не благодарить надо, а ругать :) Я
иногда опережаю события и лезу
попередь батьков в разные пекла :)

Max Lapshin

unread,
Sep 16, 2009, 6:48:42 AM9/16/09
to erlang-...@googlegroups.com
Ну вот и радость: erlyvideo научился проигрывать mp4.
Для этого пришлось полностью выглядеть как RubyIzumi, была доделана
куча вещей, оставленных в сыром виде авторами
и отсутствует seek. Его сделать можно, но вот вопрос:

При считывании mp4 файла я полностью загружаю в память его moov атом,
т.е. заголовок.
В нём
что бы сделать seek, надо выявить по заявленной секунде ближайший
ключевой кадр перед ней.
Если бы я писал на C, то самой подходящей структурой для такого
поиска, пожалуй, было бы какое-нибудь B-tree,
если бы мне надо было достать из БД, я бы выполнил:
SELECT * FROM frames WHERE pts < ? AND is_keyframe = 't' AND type =
'Video' ORDER BY pts DESC LIMIT 1; // pts — время кадра

В каком виде хранить список фреймов на эрланге, что бы можно было
быстро сделать такой seek?
Выглядит, будто ets подходит.

Andrey Nikolaev

unread,
Sep 16, 2009, 3:17:16 PM9/16/09
to erlang-...@googlegroups.com
Для деревьев есть стандартный модуль gb_trees. Для key-value кроме ets
есть еще dict.

Если речь идет об обработке потоковых бинарных данных, то наверно
оптимальнее будет воспользоваться обычным binary pattern matching'ом
(вроде у Армстронга в Concurrent programming in Erlang был пример с
разбором видео формата).

2009/9/16 Max Lapshin <max.l...@gmail.com>:

Max Lapshin

unread,
Sep 16, 2009, 3:22:01 PM9/16/09
to erlang-...@googlegroups.com
2009/9/16 Andrey Nikolaev <niko...@gmail.com>:

> Для деревьев есть стандартный модуль gb_trees. Для key-value кроме ets
> есть еще dict.
>

> Если речь идет об обработке потоковых бинарных данных, то наверно
> оптимальнее будет воспользоваться обычным binary pattern matching'ом
> (вроде у Армстронга в Concurrent programming in Erlang был пример с
> разбором видео формата).

Сам разбор mp4 формата у меня так и происходит. Атом вычитывается (эх,
не позволяет компилятор эрланга матчить такое:
AtomLength:32/big, Atom:(AtomLength - 4)/binary ), все данные
разбираются, обрабатываются и в памяти строятся.

Хочется понять, как потом по этому искать. Насчет gb_trees понял, спасибо.

Andrey Nikolaev

unread,
Sep 17, 2009, 5:13:55 AM9/17/09
to erlang-...@googlegroups.com
AtomLegth:32/big, Atom:(AtomLength - 4)/binary )

Ну мы вроде не обязаны матчить всё и только в вызове ф-ции.
Поэтому можно переписать.

parse_stream(<<AtomLength:32, Rest/binary>> = Stream, Acc) ->
AtomSize = AtomLength - 4,
<<Atom:AtomSize/binary, RestCrap>> = Rest,
%% Here we should decide what to do with found Atom
...
%% proceed further
parse_stream(RestCrap, [Atom | Acc]).

2009/9/16 Max Lapshin <max.l...@gmail.com>:

Max Lapshin

unread,
Sep 17, 2009, 5:15:49 AM9/17/09
to erlang-...@googlegroups.com
2009/9/17 Andrey Nikolaev <niko...@gmail.com>:

> AtomLegth:32/big, Atom:(AtomLength - 4)/binary )
>
> Ну мы вроде не обязаны матчить всё и только в вызове ф-ции.
> Поэтому можно переписать.

Конечно не обязаны, но так чертовски удобно =)

faust45

unread,
Oct 20, 2009, 7:47:14 AM10/20/09
to Erlang в России
Привет
Слушай а етот erly video он с audio работает?
Мне надо real time аудио поток раздавать клиентам с етой штукой можно
чтото придумать?

Max Lapshin

unread,
Oct 20, 2009, 7:50:34 AM10/20/09
to erlang-...@googlegroups.com
2009/10/20 faust45 <faus...@gmail.com>:

> Привет
> Слушай а етот erly video он с audio работает?
> Мне надо real time аудио поток раздавать клиентам с етой штукой  можно
> чтото придумать?

Аудио файлы отдавать не пробовал, но доработки нужны очень небольшие.
Аудио стримы попробовать можно, но какой источник аудио потока?

faust45

unread,
Oct 20, 2009, 7:55:50 AM10/20/09
to Erlang в России
Flash NetStream

On 20 окт, 15:50, Max Lapshin <max.laps...@gmail.com> wrote:
> 2009/10/20 faust45 <faust...@gmail.com>:

Max Lapshin

unread,
Oct 20, 2009, 7:58:18 AM10/20/09
to erlang-...@googlegroups.com
2009/10/20 faust45 <faus...@gmail.com>:
> Flash  NetStream
>

Не, это то, что будет с RTMP сервера звук принимать. А откуда ты
хочешь в RTMP сервер звук засовывать?
Из файлов или откуда-нибудь ещё?

faust45

unread,
Oct 20, 2009, 8:00:46 AM10/20/09
to Erlang в России
оттудаже NetStream и отдавать будет и принимать

On 20 окт, 15:58, Max Lapshin <max.laps...@gmail.com> wrote:
> 2009/10/20 faust45 <faust...@gmail.com>:
>

Max Lapshin

unread,
Oct 20, 2009, 8:41:32 AM10/20/09
to erlang-...@googlegroups.com
Как выяснилось, вопрос был в том: можно ли слить звук от клиентов
через встроенные микрофоны и раздать им. Т.е. аудиочат.
Вопрос тут сводится скорее к тому как микшировать звук с выравниванием
громкости.

Дмитрий Омелечко

unread,
Oct 20, 2009, 9:01:57 AM10/20/09
to erlang-...@googlegroups.com
ой не давно как вчера столкнулся с выравниванием звука - это жжжж.

20 октября 2009 г. 15:41 пользователь Max Lapshin <max.l...@gmail.com> написал:

Max Lapshin

unread,
Oct 20, 2009, 9:03:03 AM10/20/09
to erlang-...@googlegroups.com
2009/10/20 Дмитрий Омелечко <dva...@gmail.com>:

> ой не давно как вчера столкнулся с выравниванием звука - это жжжж.
>

Охотно верю. Кстати, какими средствами пользовались? Что-то открытое?

Дмитрий Омелечко

unread,
Oct 20, 2009, 9:26:16 AM10/20/09
to erlang-...@googlegroups.com
да нам надо был сделать банальный аля веб конф через скайп, но со звукового пульта и микрофонов в зале... сказать что это было все плохо - это ничего не сказать. слава богу была запись а не прямик :) И ни одного звукача как на зло на выезд не взяли, хоть и не  знаю даже чем бы он нам помог.

20 октября 2009 г. 16:03 пользователь Max Lapshin <max.l...@gmail.com> написал:

Max Lapshin

unread,
Oct 20, 2009, 9:35:16 AM10/20/09
to erlang-...@googlegroups.com
2009/10/20 Дмитрий Омелечко <dva...@gmail.com>:

> да нам надо был сделать банальный аля веб конф через скайп, но со звукового
> пульта и микрофонов в зале... сказать что это было все плохо - это ничего не
> сказать. слава богу была запись а не прямик :) И ни одного звукача как на
> зло на выезд не взяли, хоть и не  знаю даже чем бы он нам помог.

Не, я имел ввиду для обработки этого пользовались потом ручными
платными программами или какими-то библиотеками?

Дмитрий Омелечко

unread,
Oct 20, 2009, 9:38:00 AM10/20/09
to erlang-...@googlegroups.com
не пока дальше постпродакшн лабает все ручками на бешенном оборудование за бешеные деньги. все что связанно с тв почемуто стоит всегда  Денег.

20 октября 2009 г. 16:35 пользователь Max Lapshin <max.l...@gmail.com> написал:
Reply all
Reply to author
Forward
0 new messages