Библиотека сайта rus-linux.net
Создайте свой собственный видеосервис с помощью 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, полученная по
- секретной строке (определяется пользователем)
- <rel-path> (относительный путь, начинается с /)
- <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 и в браузере должно начаться воспроизведение видеозаписи (в том числе и звука):
Ниже показан полноэкранный вариант выдачи изображения с помощью плейера Flash 9: