Текущая страница: ГлавнаяНастройка сервера → Транслируем потоковое видео используя модуль h264 для nginx.

Транслируем потоковое видео используя модуль h264 для nginx.

Ставим необходимые пакеты:

aptitude install build-essential

Качаем нужную версию nginx (в моем случае 1.7.5):

wget http://nginx.org/download/nginx-1.7.5.tar.gz


В каталог ./nginx распаковываем архив с исходниками nginx
Смотрим как версию и то, как скомилирован nginx:

nginx -V &>> curr_nginx.txt

Берем директивы конфигурации, добавляем к ним модули:

--with-http_mp4_module
--with-http_flv_module
--with-http_secure_link_module
--with-file-aio

Все это копируем в буфер.
(в терминале при подключении по ssh: вывести содержимое файла командой cat, выделить мышкой, копировать Ctrl-Ins, вставить Shift-Ins)
Переходим в консоль:

cd nginx
./configure

Вставляем из буфера в конец строки ./configure
Получится что-то вроде этого

./configure --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log
--http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi
--http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --lock-path=/var/lock/nginx.lock
--pid-path=/var/run/nginx.pid --with-pcre-jit --with-http_gzip_static_module --with-http_ssl_module --with-ipv6
--without-http_browser_module --with-http_geoip_module --without-http_memcached_module --without-http_referer_module
--without-http_scgi_module --without-http_split_clients_module --with-http_stub_status_module --without-http_ssi_module
--without-http_userid_module --without-http_uwsgi_module --with-http_mp4_module
--with-http_flv_module --with-http_secure_link_module --with-file-aio

Могут вылезать ошибки:
error: the HTTP rewrite module requires the PCRE library.
Исправляем aptitude install libpcre++-dev
error: SSL modules require the OpenSSL library.
Исправляем aptitude install libssl-dev
error: the GeoIP module requires the GeoIP library.
Исправляем aptitude install libgeoip-dev
error: the HTTP XSLT module requires the libxml2/libxslt
Исправляем aptitude install libxslt1-dev
error: the HTTP image filter module requires the GD Library
Исправляем aptitude install libgd-dev
Далее делаем

make
make install

Если что-то изменили в конфигурации — делаем сначала make clean, потом конфигурируем и собираем.
Далее берем получившийся бинарник nginx из каталога ./objs, и компируем его поверх /usr/sbin/nginx.
Важно:на всякий случай сохраним старый бинарник!
Рестартуем nginx, проверям все ли получилось нормально nginx -V

Модуль http_mp4_module обеспечивает серверную поддержку псевдостриминга для файлов в формате MP4.
Источник: документация по модулям nginx — ngx_http_mp4_module

Модуль ngx_http_secure_link_module позволяет проверять аутентичность запрашиваемых ссылок, защищать ресурсы от несанкционированного доступа, а также ограничивать срок действия ссылок.
Источник: документация по модулям nginx -ngx_http_secure_link_module

Подключаем модули в конфиге nginx

location /video-mp4/
{
secure_link    $arg_s,$arg_ts;
secure_link_md5    "$secure_link_expires$uri$remote_addr secret"
if ($secure_link = "")
{
//неверный хеш
return 403;
}
if ($secure_link = "0")
{
//истекло время доступа
return 410;
}
rewrite ^/video-mp4/(.*)$     /video-mp4/$1 break;
mp4;
//включаем поддержку асинхронного ввода-вывода
aio on;
//включаем O_DIRECT для файлов размером 4МБ и более
directio 4M;
//значения для буфера приведены фактически с потолка....
output_buffers 2 2M;
}

Проверяем конфиг nginx -t
Рестартуем nginx.
Генерация ссылки на видео:

function secure_url_new($fname,$ip)
{
$url="http://site.ru";
$real_path="/video-mp4/".$fname;
$salt='secret';
$ts =time()+3600;
$a=$ts.$real_path.$ip." ".$salt;
$a=base64_encode(md5($a,true));
$a=str_replace("+","-",$a);
$a=str_replace("/","_",$a);
$a=str_replace("=","",$a);
return $url.$real_path.'?s='.$a.'&ts='.$ts;
}

Как это работает?
Генерация приведена так, как дается в документации в первом примере:
1. Ограничение по времени 1 час: $ts =time()+3600 допустим равно 2147483647
2. 127.0.0.1
Нужен доступ к файлу: http://site.ru/video-mp4/file1.mp4

В примере из документации считают так:
echo -n '2147483647/video-mp4/file1.mp4127.0.0.1 secret' | \
    openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =

Ссылка для доступа:

http://site.ru/video-mp4/file1.mp4?s=hash&ts=time

По аналогии можете написать функцию генерации для других примеров.

До начала воспроизведения плееру необходимо прочитать метаданные. Для этого он отсылает специальный запрос с аргументом start=0. Многие кодирующие программы добавляют метаданные в конец файла. Это неоптимально для псевдостриминга, поскольку плееру потребуется загрузить файл целиком прежде чем начать воспроизведение. Если метаданные находятся в начале файла, nginx’у достаточно начать отправлять в ответ содержимое файла. Если же метаданные находятся в конце файла, потребуется прочитать весь файл и подготовить новый поток, в котором метаданные предшествуют медийным данным. Это требует дополнительного процессорного времени, памяти и дискового ввода/вывода, поэтому лучше заранее подготовить исходный файл для псевдостриминга, нежели делать это для каждого запроса.
В ffmpeg существуют ключ, который устанавливает метаданные в начало файла:

-movflags +faststart

Если в вашей версии ffmpeg этот ключ поддерживается — используйте его. Если нет — обновитесь либо, воспользуетесь MP4Box из пакета gpac:

aptitude install gpac 

Подготовка данных:

ffmpeg -vpre preset-name -y -i input.avi -s 320x240 -vcodec libx264 -acodec libfaac -threads 0 -ab 64k -b 400k -bt 500k -g 24 -r 24 temp.mp4
MP4Box -add temp.mp4 output.mp4

Ключ -g задает частоту ключевых кадров.
Что использовать в качестве preset-name?
Они берутся из соответсвующих файлов в каталоге ~/.ffmpeg
Например default — файл libx264-default.ffpreset
Полный список ниже. Отмечу, что в разных версиях ffmpeg настройки могут различаться, видимо некоторые опции убирают, некоторые добавляют….У меня в ряде случаев приходилось править эти файлы вручную, т.к. при попытке использования выдавались ошибки в конфиге.

    libx264-baseline.ffpreset
    libx264-default.ffpreset
    libx264-fast.ffpreset
    libx264-fast_firstpass.ffpreset
    libx264-faster.ffpreset
    libx264-faster_firstpass.ffpreset
    libx264-fastfirstpass.ffpreset
    libx264-hq.ffpreset
    libx264-ipod320.ffpreset
    libx264-ipod640.ffpreset
    libx264-lossless_fast.ffpreset
    libx264-lossless_max.ffpreset
    libx264-lossless_medium.ffpreset
    libx264-lossless_slow.ffpreset
    libx264-lossless_slower.ffpreset
    libx264-lossless_ultrafast.ffpreset
    libx264-main.ffpreset
    libx264-max.ffpreset
    libx264-medium.ffpreset
    libx264-medium_firstpass.ffpreset
    libx264-normal.ffpreset
    libx264-placebo.ffpreset
    libx264-placebo_firstpass.ffpreset
    libx264-slow.ffpreset
    libx264-slow_firstpass.ffpreset
    libx264-slower.ffpreset
    libx264-slower_firstpass.ffpreset
    libx264-slowfirstpass.ffpreset
    libx264-ultrafast.ffpreset
    libx264-ultrafast_firstpass.ffpreset
    libx264-veryfast.ffpreset
    libx264-veryfast_firstpass.ffpreset
    libx264-veryslow.ffpreset
    libx264-veryslow_firstpass.ffpreset

Установка из git:

mkdir ~/.ffmpeg
cd .ffmpeg
git clone git://github.com/joeyblake/FFmpeg-Presets.git

Важное замечание:
Довольно часто возникает ситуация когда ffmpeg не может найти каталог с файлами preset.
Покопавшись в исходниках обнаружил, что он лезет по путям:
Вариант первый:
$HOME/.ffmpeg/имя-пресета.ffpreset
Вариант второй:
$HOME/.ffmpeg/имя_кодека-имя_пресета.ffpreset
т.е. если мы имеем файл:
/home/user/.ffmpeg/libx264-default.ffpreset
$HOME должно быть /home/user
имя_пресета должно быть libx264-default
(по второму варианту может быть просто default при установленном имени кодека libx264, но он это у меня не проглотил….)

При написании использовались:
http://habrahabr.ru/post/111249/.
http://www.slideshare.net/StanislavMalkin/ss-12143710

Добавить комментарий