magnify
Home arrow Posts tagged "coder"
formats

Потоковое Flash-Video + ClipShare

Опубликовано: 16.05.2008 Автор: в

Один из моих недавних проектов был посвящен проблеме передачи потокового flash-видео.На сайте был установлен ClipShare (кто не знает — это клон популярного видеосервиса YouTube). Необходимо было исправить проблему загрузки файлов и настроить потоковую раздачу через HTTP загруженных видеороликов.

Объясню вкратце, что такое такое «потоковая» раздача flash-видео (HTTP flv streaming). Вообще говоря, передача видеороликов возможна несколькими способами:

  • Как обычный flv-файл, через flash-плеер браузера. При такой передаче файл кэшируется.
  • Как вложение в swf-файле. В этом случае, файл должен быть полностью загружен до начала проигрывания.
  • Прогрессивная загрузка по HTTP (Progressive download via HTTP). К преимуществам этого метода можно отнести буферизацию, использование обычных веб-серверов, возможность использовать один SWF-плеер для проигрывания различных роликов.Передача потока flash-video возможно только при наличии специальных метаданных в файле, описывающих стартовые позиции каждого ключевого кадра видео. Благодаря этому, Flash-плеер может запрашивать и получать любую часть видео до того как буферизация закончится. Другими словами, «перемотка» видеролика возможна без томительного ожидания закачки файла, что согласитесь, очень удобно. Вы наверняка замечали это при просмотре роликов на YouTube.
  • Поток RMTP. Реальная потоковая раздача, используя специализированные серверы, например Flash Media Server, Red5.

Так вот задача была как раз была реализовать 3-ий способ.

К тому же, непонятно почему файлы не загружались на сервер.

Проблема загрузки фалов решилась следующим способом:

Запустив ‘/usr/bin/php /path/to/public_html/convert.php test.mpeg test /path/to/public_html/video/test.mpeg‘, я обнаружил, что mencoder, как раз использующийся для конвертации видеофайла не знает ничего про параметр -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames, что и указало на причину проблемы. Новые версии mencoder больше не поддерживают эту опцию. После того, как я убрал всякие вхождения этого параметра в php-файлах ClipShare (convert.php и upload.php) и заменил еще одну опцию -vop на -vf (чтобы сильно не ругался), аплоад заработал на ура.

Теперь про псевдо-потоковую раздачу видео. На стороне сервера, самым простым способом, является установка веб-сервера lighttpd. Все что нужно, это наличие такого куска в конфигурационном файле lighttpd:

server.modules = ( 
  ...,
  "mod_secdownload", ## optional
  "mod_flv_streaming",
  ...
)
flv-streaming.extensions = ( ".flv" )

К сожалению, в случае ClipShare,модуль загрузки файлов (Uber-Uploader, кстати) вместо отображения текущего процесса загрузки выплевывает ‘Failed To Find Flength File, но файл все-таки загружает. Поэтому я пошел другим путем и решил поставить модуль раздачи flash-видео mod_flvx. Для установки необходимо скачать сам модуль, запустить ‘apxs -i -a -c mod_flvx.c‘ и добавить директиву ‘AddHandler flv-stream .flv‘ в конфиг апача.

Принцип работы этих модулей довольно прост. Они лишь добавляют необходимый заголовок Content-Type и парсят запрос GET а наличие праметра start.Если этот параметр задан, то модуль сначала выдает FLV-заголовок, а затем начинает передавать файл с нужной позиции, заданной этим параметром.

Я уже отметил, что для использования возможности «перемотки» без полной буферизации необходимо наличие определенных метаданных в видеофайле. Для этого используется небольшая, но очень полезная утилитка flvtool2. Для обновления файла необходимо лишь запустить ‘flvtool2 -UP <файл>.flv‘ и после этого файл готов к HTTP-раздаче. В ClipShare при загрузке видеоролика эта утилита запускается, поэтому дополнительных телодвижений производить не надо.

Проделав необходимые манипуляции, и запустив Apachе, я столкнулся с еще одной неприятной проблемой, а именно «корявостью» интегрированного в ClipShare flash-плеера Agriya. «Перемотка» отказывалась работать.

Пришлось интегрировать другой плеер — JW FLV Media Player. Для ClipShare это было сделано следующим образом:

В файле templates/view_video.tpl заменить (не забыв, конечно скачать сам плеер)

<script type="text/javascript">
   var so1 = new SWFObject("/FLVplayer/flvplayer.swf", "flvplayer", "559", "444", "7",  null, true);
   so1.addParam("allowFullScreen", "true");
   so1.addParam("wmode", "transparent");
   so1.addParam("allowSciptAccess", "always");
   so1.addVariable("themes", "/FLVplayer/themes.xml");
   so1.addVariable("config", "/FLVplayer/playerXml.php?flv={$vinfo[0].flvdoname}");
   so1.write("playerDiv");
</script>

на

<script type="text/javascript">
   var so1 = new SWFObject("/FLVplayer/mediaplayer.swf", "flvplayer", "559", "444", "7",  null, true);
   so1.addParam("allowFullScreen", "true");
   so1.addParam("wmode", "transparent");
   so1.addParam("allowSciptAccess", "always");
   so1.addVariable('autostart','true');
   so1.addVariable('file','/flvideo/{$vinfo[0].flvdoname}');
   so1.addVariable('streamscript','lighttpd');
   so1.write("playerDiv");
</script>

Можно, и даже, наверное, нужно генерировать плейлист на лету через PHP, но я с этим играться не стал, поскольку надо было получить просто работающий вариант.

После этого потоковая раздача+»перемотка» заработали на ура.

Ссылки:

  1. http://en.wikipedia.org/wiki/Flash_Video
  2. http://blog.lighttpd.net/articles/2006/03/09/flv-streaming-with-lighttpd
  3. http://inlet-media.de/flvtool2
  4. http://www.jeroenwijering.com/?item=JW_FLV_Player
  5. http://journal.paul.querna.org/articles/2006/07/11/mod_flvx/
  6. http://apachedev.ru/2006/07/13/mod_flvx-peredacha-potokovogo-flash-video/
 
Просмотров: 7 805 | 6 комментариев  comments 
Просмотров: 402 | Комментариев нет  comments