Использование lighttpd, Mplayer/Mencoder и Flvtool2 для реализации потоковой раздачи Flash Video

Posted by Alexey Kovyrin under Uncategorized · english

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

Первым нашим шагом, как и при использовании любой другой технологии потоковой передачи видео, будет конвертация видео файлов в специализированный формат, предназначенный для передачи по сети в виде потока (этот формат называется “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.


Related posts:

  1. Стриминг Flash Video при помощи Nginx
  2. Образовательные семинары от Google (techtalks) и Сохранение Роликов из Google Video на Локальный Диск
  3. Варианты настройки Ruby On Rails на максимальную производительность: mongrel vs lighttpd vs nginx
  4. Использование X-Accel-Redirect с Nginx для реализации контролируемых скачиваний
  5. Обзор Неофициальных Репозитариев Пакетов Для Дистрибутива Debian GNU/Linux

Tags:

69 Comments » | Bookmark on del.icio.us

69 Responses to this entry

Scoundrel says:

2alex: Мы писали сами… Наш флеш-девелопер за день наколбасил хотя до этого ваще не видел флеш-фидео. Потому я уверен, что не сильно сложно. Хотя, может, есть и готовое.

lhotski says:

Спасибо за пост. mplayer forever.
Но flvtool2 в силу свой чистой скриптовости имхо жутко тормозная штука и на больших роликах массовую конвертацию делает тяжким трудом :) Достойной заменой может послужить Yamdi, делающая то же самое в контексте задачи и работающая в на порядки быстрее.

willy says:

Здравствуйте! Спасибо за информацию! Есть вопрос – какая конфигурация сервера подойдёт для создания работоспособного сайта с видеоконтентом (на начальной стадии)?
Спасибо.

Adi says:

Hi, I have use the same mencoder command above listed and it works fine. But my video player is a bit big, and when I play the converted flv video, its pixelated,i.e the quality is not good.

What are the things I need to change to make it a size of 407×305 and quality will be better.

Kos says:

Есть проблема при конвертации mov (QuickTime) файла в flv. Вот такая команда.
mencoder input.mov -o output.flv -of lavf \
-oac mp3lame -lameopts abr:br=56 -srate 22050 -ovc lavc \
-lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 \
i_certify_that_my_video_stream_does_not_use_b_frames

С -nosound работает. То есть как я понял проблема с
аудио кодеком.
Opening audio decoder: [faad] AAC (MPEG2/4 Advanced Audio Coding)
AUDIO: 44100 Hz, 2 ch, s16le, 64.0 kbit/4.54% (ratio: 8000->176400)
Selected audio codec: [faad] afm: faad (FAAD AAC (MPEG-2/MPEG-4 Audio) decoder)

Но итоге получаю ошибку.
Cannot initialize muxer.
Exiting…

Кто-нибудь сталкивался с подобным?