Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Серверные службы Linux

Создайте свой собственный видеосервис с помощью Lighttpd и FlowPlayer (Ubuntu 9.10)

Оригинал: "Build Your Own Video Community With Lighttpd And FlowPlayer (Ubuntu 9.10)"
Автор: Falko Timme
Дата публикации:04/03/2010
Перевод: Н.Ромоданов
Дата перевода: 14 апреля 2010 г.

В данной статье показано, как можно в системе Ubuntu 9.10 построить ваш собственный видеосервис с использованием lighttpd с его модулем mod_flv_streaming (для работы с видеопотоками в формате .flv, используемом в большинстве крупных видеосервисов, таких как YouTube) и его модулем mod_secdownload (для предотвращения использования постоянных прямых ссылок на видеозаписи). Я буду использовать в качестве видеоплеера FlowPlayer - бесплатный Flash-видеоплейер, поддерживающий использование модуля mod_flv_streaming, имеющегося в lighttpd. Я также покажу, как вы можете перекодировать видеозаписи (в форматах .mp4 .mov .mpg .3gp .mpeg .wmv .avi) в формат FLV, поддерживаемый Adobe Flash.

Эта статья приводится без каких-либо гарантий! Я хочу сказать, что это не единственный способ создания подобной системы. Есть много способов достижения этой цели, но здесь описывается тот, который использую я. Я не даю никаких гарантий, что он будет работать и у вас!

1. Предварительное замечание

В настоящем руководстве я использую хост с именем server1.example.com и IP адресом 192.168.0.100. Эта настройка может отличаться от той, которую используете вы, поэтому замените ее своей.

Нам нужен инсталлятор lighttpd с поддержкой PHP, такой как описан в статье Установка Lighttpd на Ubuntu 9.10 с поддержкой PHP5 и MySQL. Я не рассматриваю здесь этот вопрос, так что, пожалуйста, посмотрите указанное руководство, если вы еще не знаете, как настраивать lighttpd с поддержкой PHP.

Поскольку все шаги настоящего руководства мы делать с правами пользователя root, мы должны либо предварять каждую команду префиксом sudo , либо мы можем сразу сейчас набрать следующую команду:

sudo su 

2. Установка ffmpeg

Мы будем использовать ffmpeg для конвертирования видеофайлов в формат FLV. Проблема с официальным пакетом ffmpeg, имеющимся в Ubuntu, состоит в том, что не поддерживается кодировка MP3, а это означает, что в наших видеозаписях в формате FLV после перекодировки пропадет звук. Поэтому мы добавим репозитарий Debian-Multimedia в файл sources.list и установим пакет ffmpeg из этого репозитария — этот вариант по умолчанию поддерживает формат MP3. Вы можете спросить, почему мы используем репозитарий Debian-Multimedia, а не репозитарий Medibuntu, но в репозитарии Medibuntu вообще нет пакета ffmpeg.

vi /etc/apt/sources.list

Добавляем репозитарий Debian-Multimedia (более близкое к вам зеркало вы можете найти по следующей ссылке), например, следующим образом:

[...]
deb http://ftp-stud.hs-esslingen.de/pub/Mirrors/debian-multimedia/ stable main
deb-src http://ftp-stud.hs-esslingen.de/pub/Mirrors/debian-multimedia/ stable main

Затем загружаем пакет debian-multimedia-keyring и устанавливаем его:

wget http://www.debian-multimedia.org/pool/main/d/debian-multimedia-keyring/debian-multimedia-keyring_2008.10.16_all.deb
dpkg -i debian-multimedia-keyring_2008.10.16_all.deb

Затем для того, чтобы дать пакетам Debian-Multimedia более высокий приоритет, чем пакетам из репозитария Ubuntu Karmic, мы создаем файл /etc/apt/preferences со следующим содержанием (удостоверьтесь в том, что пакет ffmpeg со всеми его зависимостями был установлен из репозитария Debian-Multimedia, а не из репозитария Karmic):

vi /etc/apt/preferences
Package: *
Pin: release a=karmic
Pin-Priority: 650

Package: *
Pin: release a=stable
Pin-Priority: 700

Возможно, вы захотите посмотреть A Short Introduction To Apt-Pinning (краткая инструкция по установке и одновременному использованию нескольких релизов) и узнать почему/etc/apt/preferences выглядит именно так.

Наконец, измените ваш список пакетов package-list:

aptitude update

Теперь вы можете установить пакет ffmpeg:

aptitude install ffmpeg

3. Установка flvtool2

Когда мы конвертируем видеозаписи в формат FLV, нам потребуется добавить в файл FLV некоторые метаданные, такие как продолжительность видеозаписи, с тем, чтобы FlowPlayer мог правильно отображать продолжительность видеозаписи. Мы можем добавить эти метаданные с помощью пакета flvtool2. Пакет flvtool2 можно установить следующим образом:

aptitude install flvtool2

4. Создание видеодиректориев

В настоящей инструкции я предполагаю, что корневым директорием lighttpd вашего веб сервера будет /var/www (по умолчанию для lighttpd в системе Ubuntu). Конечно, нам не стоит хранить оригинальные видеозаписи и видео в формате FLV в корневом директории сайта (или его поддиректориях), откуда их скачать сможет любой желающий (если он знает ссылку). Поэтому мы создаем за пределами корневого директория сайта директорий для оригинальных видеозаписей (например, /var/videos/incoming) и директорий для видео в формате FLV (например, /var/videos/flv):

mkdir -p /var/videos/incoming
mkdir -p /var/videos/flv

После этого вы (или ваши пользователи) можете загружать свои оригинальные видеозаписи в директорий /var/videos/incoming (например, через FTP или какой-либо веб-интерфейс, который вы запрограммируете), а затем вы можете перекодировать эти видеозаписи в формат FLV (вручную или с помощью скрипта) так, как это будет рассказано в следующем разделе.

5. Перекодирование видео в формат FLV

Предположим, что у нас есть видеозапись под названием video.avi в директории /var/videos/incoming (можно также использовать файлы с расширениями .mp4 .mov .mpg .3gp .mpeg .wmv). Мы хотим конвертировать его в файл video.flv и сохранить результат в директории /var/videos/flv. Я хочу, чтобы изображение в файле video.flv было размером 320x240 пикселей с частотой дискретизации звука 44100 Гц, двумя аудио каналами (стерео) и частотой кадров в 12 кадров в секунду. Вот как мы это делаем:

ffmpeg -i /var/videos/incoming/video.avi -s 320x240 -ar 44100 -r 12 -ac 2 /var/videos/flv/video.flv

О других параметрах можно узнать с помощью следующей команды:

man ffmpeg

Это может занять некоторое время, и результат должен выглядеть примерно так:

root@server1:~# ffmpeg -i /var/videos/incoming/video.avi -s 320x240 -ar 44100 -r 12 -ac 2 /var/videos/flv/video.flv
FFmpeg version SVN-r13582, Copyright (c) 2000-2008 Fabrice Bellard, et al.
  configuration: --prefix=/usr --libdir=${prefix}/lib --shlibdir=${prefix}/lib --bindir=${prefix}/bin 
  --incdir=${prefix}/include/ffmpeg --enable-shared --enable-libmp3lame --enable-gpl --enable-libfaad 
  --mandir=${prefix}/share/man --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid 
  --enable-postproc --enable-libamr-nb --enable-libamr-wb --enable-x11grab --enable-libgsm --enable-libx264 
  --enable-liba52 --enable-libtheora --extra-cflags=-Wall -g -fPIC -DPIC --cc=ccache cc --enable-swscale 
  --enable-libdc1394 --enable-nonfree --disable-mmx --disable-stripping --enable-avfilter --enable-libdirac 
  --disable-decoder=libdirac --enable-libschroedinger --disable-encoder=libschroedinger --disable-altivec 
  --disable-armv5te --disable-armv6 --disable-vis
  libavutil version: 49.7.0
  libavcodec version: 51.58.0
  libavformat version: 52.16.0
  libavdevice version: 52.0.0
  libavfilter version: 0.0.0
  built on May  3 2009 12:07:18, gcc: 4.3.2
Input #0, avi, from '/var/videos/incoming/video.avi':
  Duration: 00:10:53.82, start: 0.000000, bitrate: 5455 kb/s
    Stream #0.0: Video: mpeg4, yuv420p, 1024x576 [PAR 1:1 DAR 16:9], 24.00 tb(r)
    Stream #0.1: Audio: ac3, 48000 Hz, 5:1, 448 kb/s
Output #0, flv, to '/var/videos/flv/video.flv':
    Stream #0.0: Video: flv, yuv420p, 320x240 [PAR 4:3 DAR 16:9], q=2-31, 200 kb/s, 12.00 tb(c)
    Stream #0.1: Audio: libmp3lame, 44100 Hz, stereo, 64 kb/s
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press [q] to stop encoding
[libmp3lame @ 0x7f983556f6c0]lame: output buffer too small (buffer index: 8359, free bytes: 281)
frame= 7847 fps= 13 q=2.0 Lsize=   21696kB time=653.92 bitrate= 271.8kbits/s
video:16067kB audio:5114kB global headers:0kB muxing overhead 2.428783%
root@server1:~#

Пожалуйста, убедитесь, что в разделе Output вы видите два выходных потока: один - для видео и один - для аудио. Если вы видите только один видеопоток, то это означает, что звук потерян.

Теперь, после преобразования, мы можем с помощью flvtool2 добавить в video.flv метаданные:

cat /var/videos/flv/video.flv | flvtool2 -U stdin /var/videos/flv/video.flv

6. Конфигурирование Lighttpd

Теперь мы должны открыть основной конфигурационный файл lighttpd, /etc/lighttpd/lighttpd.conf, и добавить (или проверить их наличие) модули mod_secdownload и mod_flv_streaming. Очень важно, чтобы в разделе server.modules модуль mod_secdownload был указан перед модулем mod_flv_streaming. Когда я сделал наоборот, я обнаружил, что в FlowPlayer не работает быстрое перенаправление видео!

vi /etc/lighttpd/lighttpd.conf
[...]
server.modules              = (
            "mod_access",
            "mod_alias",
            "mod_accesslog",
            "mod_compress",
#           "mod_rewrite",
#           "mod_redirect",
#           "mod_evhost",
#           "mod_usertrack",
#           "mod_rrdtool",
#           "mod_webdav",
#           "mod_expire",
            "mod_secdownload",
            "mod_flv_streaming",
#           "mod_evasive"
)
[...]

В тот же самый файл мы также добавим следующую конфигурацию (ее можно добавить в самом конце файла /etc/lighttpd/lighttpd.conf):

[...]
flv-streaming.extensions = ( ".flv" )
secdownload.secret          = "somesecret"
secdownload.document-root   = "/var/videos/flv/"
secdownload.uri-prefix      = "/dl/"
secdownload.timeout         = 120

Пожалуйста, замените строку somesecret своей собственно секретной строкой (можете выбрать сами).

Для чего нужен модуль mod_secdownload: веб приложение (например, скрипт PHP) может иметь ссылку на модуль следующего вида:

<uri-prefix>/<token>/<timestamp-in-hex>/<rel-path> 

Например,

/dl/d8a8cb150f7e5962f6a8443b0b6c6cc2/46c1d9f6/video.flv

где <token> - хеш сумма MD5, полученная по

  1. секретной строке (определяется пользователем)
  2. <rel-path> (относительный путь, начинается с /)
  3. <timestamp-in-hex>(временная отметка в шестнадцатеричном значении — прим.пер.)

Затем mod_secdownload отобразит эту ссылку на соответствующий файл в secdownload.document-root (который находится вне корневого директория веб сайта) и предоставит доступ к этому файлу на время, равное secdownload.timeout секунд. После того, как пройдет secdownload.timeout секунд, ссылка перестанет быть доступной и доступ к файлу будет запрещен.

После того, как мы установили FlowPlayer, мы будем использовать скрипт PHP для генерации соответствующей видеоссылки для модуля mod_secdownload.

Более подробную информацию о модуле mod_secdownload вы можете найти по следующей ссылке: http://trac.lighttpd.net/trac/wiki/Docs_ModSecDownload.

После того, как вы измените /etc/lighttpd/lighttpd.conf , не забудьте перезапустить lighttpd:

/etc/init.d/lighttpd restart

7. Установка FlowPlayer

Перейдите по ссылке http://flowplayer.org/download и загрузите в ваш директорий /tmp последнюю версию плейера FlowPlayer, например, следующим образом:

cd /tmp
wget http://releases.flowplayer.org/flowplayer/flowplayer-3.1.5.zip

Плейер FlowPlayer распространяется в формате .zip, поэтому мы должны установит пакет unzip для того, чтобы его разархивировать:

aptitude install unzip

После этого мы можем разархивировать плейер:

unzip flowplayer-3.1.5.zip

В результате в директории /tmp будет создан поддиректорий с названием flowplayer. Мне удобно, чтобы этот директорий был в корневом директории моего веб сайта (/var/www), поэтому я перемещаю его туда:

mv flowplayer /var/www/

8. Конфигурирование FlowPlayer

Плейер FlowPlayer теперь уже установлен, поэтому все, что осталось сделать, это создать файл HTML, который позволит нам просмотреть наше видео. Мы создадим для этого файл PHP с названием /var/www/flowplayertest.php, в котором содержатся все параметры, позволяющие запускать FlowPlayer в браузере пользователя, и в котором с помощью модуля mod_secdownload также создаются действующие видеоссылки:

Очень важно, чтобы переменная $secret имела то же самое значение, что и переменная secdownload.secret в /etc/lighttpd/lighttpd.conf. Также должны совпадать значения переменных $uri_prefix и secdownload.uri-prefix. Если это будет выполнено, то скрипт будет генерировать корректные ссылки. В $f должно указываться имя видеофайла в формате FLV с предваряющей косой чертой (/). (В приведенном выше примере имя файла закодировано жестко, но, конечно, можно запрограммировать его таким образом, чтобы имена файлов генерировались динамически).

Важной частью, в которых вызывается плейер FlowPlayer, является тег <script src="/flowplayer/example/flowplayer-3.1.4.min.js"></script> (где дается ссылка на скрипт flowplayer-3.1.4.min.js, находящийся в директории /var/www/flowplayer/example), который находится в секции <head></head>, за которой идут следующие две части секции <body></body>:

Наиболее важной настройкой является параметр href (который устанавливается с помощью PHP), указывающий путь к видеозаписи в формате FLV. В параметре style мы можем указать ширину и высоту нашего видеоплейера.

А также

Здесь указывается путь к нашему файлу FlowPlayer .swf.

Эта конфигурация FlowPlayer взята из http://flowplayer.org/demos/installation/index.html.

Для того, чтобы узнать больше о других вариантах вызова плейера FlowPlayer и о том, как вызывать его со специфическими настройками, посмотрите примеры, приведенные по ссылке http://flowplayer.org/demos/index.html.

Теперь пришло время проверить наши настройки. Укажите в вашем браузере ссылку http://192.168.0.100/flowplayertest.php или http://server1.example.com/flowplayertest.php и в браузере должно начаться воспроизведение видеозаписи (в том числе и звука):

Видеосервис с помощью Lighttpd и FlowPlayer. Проверяем настройки

Ниже показан полноэкранный вариант выдачи изображения с помощью плейера Flash 9:

Видеосервис с помощью Lighttpd и FlowPlayer. Воспроизведение видеозаписи