Конвертация видео в hls, mp4 на сайте, настройка программ

Документ актуален для InstantVideo любой версии

Подготовка системы - сервера и InstantVideo состоит из множества шагов, мы расскажем обо всем, что необходимо для полноценного функционирования в целом.

Первый шаг: установка ПО для конвертации

Мы будем описывать функционирование на базе операционной системы Debian 9, возможно данное справочное руководство будет актуально и для других операционных систем как данного семейства, так и для других дистрибутивов Linux.

Для правильной работы конвертации необходимо: FFmpeg версии не ниже 2.7, а так же наличие  Qt-faststart.

  Мета-данные необходимы для индексирования файла. В свою очередь индекс, который размещается в начале видео файла, нужен для того, чтобы можно было в еще не скачанном (не буферизированном) файле при перемотке перемещаться по индексам, таким образом воспроизводить файл с любого места не дожидаясь его полной загрузки. МОжно это делать как средствами самого Ffmeg, так и при помощи Qt-faststart.

В Debian 9 "из коробки" версия Ffmpeg не совсем актуальная, поэтому идем на сайт deb-multimedia и добавляем любой из приведенных там репозиториев, согласно версии Debian, в  /etc/apt/sources.list, например:

deb http://www.deb-multimedia.org stretch main non-free

Обновляем список пакетов с учетом нового репозитория:

apt update

После чего устанавливаем пакет deb-multimedia-keyring, соглашаясь с установкой неподписанного пакета:

apt install deb-multimedia-keyring

Устанавливаем Ffmpeg:

apt install ffmpeg

На этом установка необходимого ПО для конвертации закончена. Qt-faststart присутствует в пакете ffmpeg.

Второй шаг: псевдостримминг

Для псевдостримминга необходима двухуровневая конфигурация веб-сервера, Nginx + Apache. Этот вопрос достаточно широко освещен в интернете, например здесь, здесь или здесь, кроме этого, особенности данной связки можно почитать например тут.

Устанавливать необходимо последнюю версию NGINX, подключив репозиторий  отсюда. Там же есть подробная инструкция по установке.

В данной связке важна настройка Nginx в контексте InstantVideo. Необходимо понимать:

  • псевдостримминг работает только, если после конвертации над файлом происходит обработка программой для внесения мета-информации, см. выше;
  • если в Nginx подключены модули псевдостримминга, mp4 и flv;
  • конфигурация Nginx правильно настроена.

Примерная конфигурация Nginx для основного сайта, если вы не используете мультисерверность:

Для InstantVideo 1.X:

location ~/upload/video/view/.*.mp4$ {
        root /var/www/site.ru; # корневая директория вашего сайта
        mp4; # включаем модуль псевдостримминга mp4 файлов
        internal; # говорим, что эти файлы внутренние и недоступны по прямой ссылке
}
location ~/upload/video/view/.*.flv$ {
        root /var/www/site.ru;
        flv;
        internal;
}

Для InstantVideo 2.X:

location ~/upload/video/storage/.*.mp4$ {
        root /var/www/site.ru;
        mp4;
        internal;
}
location ~/upload/video/storage/.*.flv$ {
        root /var/www/site.ru;
        flv;
        internal;
}

Директивой internal вы исключаете возможность хотлинкования. Не забываете в настройках провайдера Localhost включать антихотлинк, а тип стримминга указывать "Nginx (x-accel-redirect)".

Для защиты сегментов HLS необходимо создать вот такой локейшн NGINX (если вы выбрали конвертировать в HLS формат в админке):

location ~/upload/video/storage/.*.ts$ {
        secure_link $arg_hash,$arg_e;
        secure_link_md5 "ivideosecret$secure_link_expires$uri$remote_addr";
        if ($secure_link = "") { return 403; }
        if ($secure_link = 0) { return 410; }
        root /var/www/site.ru;
}

Примерная конфигурация Nginx для InstantMedia Server

location ~/storages/storage2/.*.mp4$ {
        root /var/www/cdn1.site.ru;
        mp4;
        internal;
}
location ~/storages/storage2/.*.flv$ {
        root /var/www/cdn1.site.ru;
        flv;
        internal;
}
location ~/storages/.*.ts$ {
        add_header 'Access-Control-Allow-Origin' 'http://yousite.ru';    
        secure_link $arg_hash,$arg_e;
        secure_link_md5 "ivideosecret$secure_link_expires$uri$remote_addr";
        if ($secure_link = "") { return 403; }
        if ($secure_link = 0) { return 410; }
        root /var/www/cdn1.site.ru;
}

Обратите внимание! Для каждой директории хранения нужно добавлять правила или же исправить регулярное выражение в блоке локейшн.

Директивы mp4 и flv подключают модули псевдостримминга для Nginx. В начале убедитесь, что Nginx у вас собран/установлен с поддержкой данных модулей. Для этого введите в консоли nginx -V и проверьте, что строки "--with-http_mp4_module" и "--with-http_flv_module" присутствуют.

Для воспроизведения HLS убедитесь, что модули http_hls_module http_secure_link_module также присутствуют в Nginx, всё в том же выводе команды nginx -V.

В админке уже установленной CMS в разделе диагностика движок проверит выполнения указанных требований и отразит в соответствующем блоке.

Для кроссдоменного воспроизведения HLS, т.е. если у вас хранение и воспроизведения HLS файлов производится на InstantMedia Server, необходимо в локейшн *ts файлов добавить

add_header 'Access-Control-Allow-Origin' 'http://yousite.ru'; 
где http://yousite.ru ваш основной домен с установленным InstantVideo2.