[lang_en]Using Lighttpd, Mplayer/Mencoder and Flvtool2 to Implement Flash Video Streaming[/lang_en][lang_ru]Использование lighttpd, Mplayer/Mencoder и Flvtool2 для реализации потоковой раздачи Flash Video[/lang_ru]
  • Posted in: Uncategorized
  • Tags:
8 Oct2006

[lang_en]

It will be really short post about using set of free tools to implement fully functional flash video streaming server. So, what we are going to get at the end of our setup? We are going to get some type of completely free streaming support that is available with Macromedia’s non-free Flash Communication Server (Flash Media Server) (FCS). 🙂

[/lang_en]

[lang_ru]

Это очень короткий пост о том, как при помощи набора бесплатных инструсментов реализовать полнофункциональный потоковый видео сервер, основанный на flash video. Итак, что же мы хотим получить после окончания настройки сервера? Все очень просто – мы хотим получить бесплатный функциональный аналог решения по стримингу видео, реализованного в Flash Communication Server (Flash Media Server) компании Macromedia. 🙂

[/lang_ru]

[lang_en]

First our step as in any video streaming technology will be to prepare some videos for streaming by converting them to specific video format called “Flash Video” (flv) and adding some meta-information there to make stream rewind posible. There lots of small articles in Internet, that saying “just use ffmpeg tool and everything will be fine”, but I should say “no” to these articles authors. Ffmpeg sucks because it supports only small subset of input video formats and we don’t want to do any transcoding of original video to some video formats that ffmpeg can handle (it takes lots of resources, etc). So, my choice for video transcoding is really cool free software called mplayer, that has converting utility mencoder and can handle almost any original format and convert video file to flv format very quickly.

First of all you will need to get mplayer sources from mplayer we site and compile them. I will not describe how to do it because there are lots of articles about this process, but I want to get your attention to simple fact: Try to minimize set of disabled video codecs in compile time by installing all required libraries from your distribution repositories or from sources, because more codecs you will have, more videos you will be able to handle”.

When you’ve installed your mplayer/mencoder tools, you will need to install Ruby language interpreter to be able to run flvtool2 software. Please, ensure, that you have 1.8.4+ version of Ruby.

Next step is to install flvtool2 – tool, that allows us to inject meta-information to video files to make possible video stream rewinds in flash players. You can get it from its home page, but I would suggest you to install this software from SVN repository as described on its home page.

Small notice: current version of flvtool2 has really annoying bug, that prevents it from working with mencoder generated flv files. When you are trying to use it, you’ll get something like this:

1
/usr/local/lib/site_ruby/1.8/flv/amf_string_buffer.rb:163: [BUG] Segmentation fault

To solve this problem you can go to lib/flv/amf_string_buffer.rb file in flvtool2 source tree and change line 163 from

    write [(time.to_i * 1000.0)].pack('G')

to

    write [(time.to_f * 1000.0)].pack('G')

I want to say BIG THANKS to Dmytro Steflyuk for this fix.

So, as for now you are ready to convert your movies from any video format to flv. You can use following set of command to produce file for streaming:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ mencoder \\
orig_file.ext \\
-ofps 25 \\
-o dest_file.flv \\
-of lavf \\
-oac mp3lame \\
-lameopts abr:br=64 \\
-srate 22050 \\
-ovc lavc \\
-lavfopts i_certify_that_my_video_stream_does_not_use_b_frames \\
-lavcopts vcodec=flv:keyint=50:vbitrate=300:mbd=2:mv0:trell:\\
v4mv:cbp:last_pred=3 -vop scale=320:240
....
....
$ flvtool2 -UP dest_file.flv
...

This set of commands will convert orig_file.ext

file to dest_file.flv and will add meta flash information there.

Last thing you should do is to get Lighttpd web server from their site and install it. Then, enable flv-streaming module in its config and you’ll be able to use any flash player, that understands flash streaming idea to create your own Youtube and to get your our own billion of US dollars. 😉 And to thank author of this article, you can simply support it on digg.com.

Notice: Read my new article about flash streaming “Flash Video (FLV) Streaming with Nginx” to learn, how to implement streaming server with nginx.

[/lang_en]

[lang_ru]

Первым нашим шагом, как и при использовании любой другой технологии потоковой передачи видео, будет конвертация видео файлов в специализированный формат, предназначенный для передачи по сети в виде потока (этот формат называется “Flash Video” (flv)) и добавление в него специализированной мета-информации, предназначенной для плееров, которые реализуют “перемотку” видео потока до нужного вам места в видео файле. В интернете есть множество статей, авторы которых смело заявляют “просто запустите ffmpeg и все будет отлично”, но я вынужден не согласиться с ними. Ffmpeg – это не подходящий инструмент для поставленной задачи, т.к. он поддерживает очень маленькое количество входных форматов видео-файлов, а мы не хотим организовывать двухэтапное перекодирование видео через промежуточных формат, понятный ffmpeg. Именно поэтому мой выбор – это бесплатное ПО со скромным именем mplayer, содержащее в себе утилиту mencoder, предназначенную для перекодирования видео-файлов из одного формата в другой и понимающей огромное количество входных форматов.

В первую очередь вам нужно будет скачать пакет исходных кодов для mplayer с официального сайта mplayer и скомпилировать их. Я не буду описывать здесь, как это сделать, т.к. существует море статей, рассказывающий ою этом, но хочу привлечь ваше внимание к просому факту: Постарайтесь минимизировать набор выключенных кодеков на этапе компиляции установив все требующиеся библиотеки из репозитория вашего дистрибутива или соберите их самостоятельно, т.к. чем больше кодеков у вас будет, тем больше форматов видео файлов вы сможете обрабатывать”.

После установки mplayer/mencoder вам будет нужно установить интерпретатор языка Ruby чтобы запустить ПО flvtool2. Пожалуйста, убедитесь, что у вас стоит версия Ruby не ниже 1.8.4.

Следующим шагом будет инсталляция flvtool2 – небольшой утилиты, позволяющей вставлять meta-информацию в видео-файлы и позволяющую использовать “перемотку” видео потока во flash плеерах. Исходные тексты можно получить на домашней странице проекта, но я хочу посоветовать вам использовать последнюю версию flvtool2 из SVN-репозитория (процесс описан на домашней странице проекта).

Небольшое замечание: текущая версия flvtool2 содержит маленькую, но очень неприятную ошибку, не дающую использовать данное ПО с файлами, сгенерированными mencoder’ом. Когда вы запустите flvtool2, вы получите следующий результат:

1
/usr/local/lib/site_ruby/1.8/flv/amf_string_buffer.rb:163: [BUG] Segmentation fault

Для решения этой проблемы откройте файл lib/flv/amf_string_buffer.rb в исходных текстах flvtool2 и измените строку 163 с

    write [(time.to_i * 1000.0)].pack('G')

на

    write [(time.to_f * 1000.0)].pack('G')

Хочу сказать ОГРОМНОЕ СПАСИБО Дмитрию Штефлюку за это исправление.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ mencoder \\
orig_file.ext \\
-ofps 25 \\
-o dest_file.flv \\
-of lavf \\
-oac mp3lame \\
-lameopts abr:br=64 \\
-srate 22050 \\
-ovc lavc \\
-lavfopts i_certify_that_my_video_stream_does_not_use_b_frames \\
-lavcopts vcodec=flv:keyint=50:vbitrate=300:mbd=2:mv0:trell:\\
v4mv:cbp:last_pred=3 -vop scale=320:240
....
....
$ flvtool2 -UP dest_file.flv
...

Эти команды конвертируют файл orig_file.ext

в dest_file.flv и добавляют meta информацию в него.

Последнее, что вам нужно будет сделать – это скачать Lighttpd web server с его официального сайта и установить его . После этого, включите стриминг-модуль в config-файле и вы сможете ипользовать любой flash player, понимающий идею стриминга видео для создания вашего союственного сервиса Youtube и зарабатывания вашего первого миллиарда долларов. 😉 А для того, чтобы отблагодарить автора статьи, поддержите ее на digg.com

Notice: Читайте мою новую статью о стриминге видео “Стриминг Flash Video при помощи Nginx” чтобы узнать, как реализовать стриминг сервер на nginx.

[/lang_ru]