Трансляция видео в Angie

Вопросы передачи видео вполне актуальны в современном вебе. Конечно, большинство видео-трафика обслуживается крупными сервисами, но и для небольших специальных решений находится место. В этой статье узнаем, какие возможности по работе с видеопотоком имеет сервер Angie.
Навигация по циклу
Настройка location в Angie. Разделение динамических и статических запросов.
Перенаправления в Angie: return, rewrite и примеры их применения.
Сжатие текста в Angie: статика, динамика, производительность.
Трансляция видео в Angie.
Видеоверсия
Для вашего удобства подготовлена видеоверсия этой статьи, доступна на Rutube, VKVideo и YouTube.
Общие основы передачи видео в вебе
На первый взгляд разместить видео на странице веб-сайта сегодня просто: достаточно разместить видеофайл на сервере и использовать какой-либо тип плеера на странице со ссылкой на этот файл.
На деле всё сложнее, появляются дополнительные требования:
возможность быстрой и удобной перемотки видео;
просмотр ролика без полного скачивания;
переключение качества видео в зависимости от канала;
различные форматы и кодеки для каждого типа устройств;
трансляция живого потока;
оптимизация нагрузки на сервер (канал, диски, процессор).
Для ответа на подобные требования разработаны протоколы передачи видео, различные кодеки для сжатия видео и аудиопотока. Как минимум, нам пригодятся следующие варианты протоколов: RTMP, HLS, DASH.
Real-Time Messaging Protocol (RTMP) — один из первых протоколов передачи видео в вебе, разработанный компанией Adobe для работы с форматом Flash Video (FLV). Сейчас он используется преимущественно для передачи потока трансляции на сервер (где поток перекодируется и распределяется по клиентам). Есть защищенные версии (RTMPS, RTMPE), где поток шифруется.
HTTP Live Streaming (HLS) — протокол, разработанный компанией Apple для передачи видеопотоков поверх HTTP. Исходный файл разбивается на сегменты (.ts), для которых составляется плейлист (.m3u8). Клиент получает плейлист и запрашивает нужные сегменты. Протокол поддерживает адаптивный битрейт, имеет поддержку в браузерах и часто используется видеохостнигами.
Dynamic Adaptive Streaming over HTTP (DASH) — протокол, разработанный компанией MPEG (Moving Picture Experts Group). По принципу работы похож на HLS: плейлист (.mpd) и разбитый на фрагменты (.ts) видеоролик. Также поддерживает адаптивный битрейт, различные кодеки видео (H264, H265, VP9 и т.д.) и передаёт фрагменты по HTTP.
Начнём с базовых возможностей Angie для видео и его встроенных модулей.
Возможности встроенных модулей MP4 и FLV
Модуль FLV реализует отдачу видео с указанной в параметре start временной меткой. Как понятно из названия, он работает с форматом Flash Video (FLV). Директиву flv можно включить в контексте локации:
location /video/ {
flv;
}Более широкими возможностями обладает модуль MP4. Помимо отдачи выбранного фрагмента файла (поддерживаются параметры start и end), модуль умеет ограничивать скорость отправки видео относительно битрейта файла. Рассмотрим пример использования модуля MP4:
location ~ \.mp4$ {
mp4;
mp4_buffer_size 1M;
mp4_max_buffer_size 3M;
mp4_limit_rate 2;
mp4_limit_rate_after 10s;
}В примере мы создаём локацию на основе регулярного выражения, в неё будут попадать файлы с расширением mp4. Директива mp4 включает обработку файлов с помощью модуля, а также мы ограничиваем скорость отправки видео до двух битрейтов (mp4_limit_rate), лимит начинает работать после первых 10 секунд проигрывания видео. В примере также настроены буферы для обработки файлов: начальный (mp4_buffer_size) и максимальный (mp4_max_buffer_size). В Angie все эти возможности доступны в открытой версии, в Nginx ограничение скорости доступно только в коммерческой.
Переходим к более мощным решениям для работы с видео, первым будет модуль RTMP.
Модуль RTMP
Сторонний модуль RTMP пожалуй обладает самыми широкими возможностями из всех. Чтобы убедиться в этом достаточно посмотреть на его справочник директив. Модуль позволяет раздавать видео в форматах RTMP, HLS и DASH, вести прямые трансляции, в том числе с записью потока.
Установить модуль можно из репозитория Angie:
apt install angie-module-rtmpЗагрузка модуля как обычно располагается в контексте main:
load_module modules/ngx_rtmp_module.so;Рассмотрим самый простой вариант конфигурации: живая трансляция потока без записи. Для начала создадим конфигурацию в Angie (модуль RTMP имеет собственный контекст rmtp):
rtmp {
server {
listen 1935;
application live {
live on;
}
}
}
Здесь мы создали сервер для трансляции живого потока, указали сокет (TCP 1935) и название (live). Чтобы протестировать этот конфиг, потребуется видеофайл и утилита ffmpeg.
Запустим в качестве входного потока трансляции зацикленный файл через ffmpeg:
ffmpeg -re -i "/video/mi2.mp4" -c:v copy -loop 1 -c:a aac -b:a 160k -ar 44100 -strict -2 -f flv rtmp://localhost/live/bbbЭта команда использует входной файл и без перекодирования отправляет его в контейнере flv на адрес нашего RTMP-сервера (rtmp://localhost/live/). Получить поток с сервера можно плеером с поддержкой RMTP, например mplayer:
mplayer rtmp://192.168.0.1/live/bbbЗдесь и далее адрес сервера будет 192.168.0.1. На выходе мы получим трансляцию зацикленного файла, который передаёт в сервер ffmpeg. Однако, чистый протокол RTMP ограниченно применим в вебе. Поэтому дополним конфигурацию протоколом HLS:
rtmp {
server {
listen 1935;
application live {
live on;
hls on;
hls_path /var/www/html/stream/hls;
hls_fragment 3;
hls_playlist_length 60;
}
}
}Здесь мы подключили протокол HLS для фрагментов потока и плейлиста к ним. Но на этом конфигурация не закончена. Нужно создать обычный сервер в контексте http для отдачи фрагментов и плейлистов.
server {
listen 8088;
location / {
add_header Access-Control-Allow-Origin *;
root /var/www/html/stream;
}
}Сервер создан (не забудьте также заранее создать директорию /var/www/html/stream). Теперь мы можем найти плейлист на трансляцию и открыть его в совместимом плеере (например, VLC). Адрес плейлиста будет следующим:
http://192.168.0.1:8088/hls/bbb.m3u8Также несложно добавить поддержку протокола DASH, полная конфигурация теперь будет такой:
rtmp {
server {
listen 1935;
application live {
live on;
hls on;
hls_path /var/www/html/stream/hls;
hls_fragment 3;
hls_playlist_length 60;
dash on;
dash_path /var/www/html/stream/dash;
}
}
}Адрес плейлиста для DASH следующий:
http://192.168.0.1:8088/dash/bbb.mpdДля корректной работы плейлиста нужно прописать его MIME-тип (обычно в/etc/angie/mime.types):
application/dash+xml mpd;Итак, мы получили уже вполне работоспособный сервер трансляций. Самое время включить запись потока на диск. Для этого добавляем еще несколько директив:
rtmp {
server {
listen 1935;
application live {
live on;
...
record all;
record_path /tmp/rec;
record_suffix _recorded.flv;
record_unique on;
}
}
}Для успешной записи заранее создаём директорию и назначаем права для записи от пользователя, с которым работает Angie (пусть это будет www-data):
mkdir /tmp/rec
chown -R www-data:www-data /tmp/recТеперь трансляция будет сохраняться на диск в формате flv. Важно понимать, что файлы будут накапливаться и их нужно будет удалять или переносить по мере заполнения диска.
Модуль RTMP является универсальным комбайном для работы с видео. Для сравнения кратко рассмотрим сторонний модуль VOD, который частично перекрывается по функциональности с RTMP-модулем.
Модуль VOD
Сторонний модуль VOD (Video On Demand) предназначен для раздачи видео из файлов. Он поддерживает протоколы RTMP, HLS и DASH, есть поддержка адаптивного битрейта видео, генерации миниатюр из видео.
В модуле предусмотрены три режима работы:
локальный (local): трансляция файлов с диска;
удалённый (remote): раздача файлов, доступных по HTTP;
ассоциативный (mapped): раздача в соответствии с JSON-файлом.
Начнём с установки модуля из репозитория Angie:
apt install angie-module-vodПодключаем модуль в main-контексте.
load_module modules/ngx_http_vod_module.so;Рассмотрим пример конфигурации сервера с модулем VOD:
http {
vod_mode local;
vod_metadata_cache metadata_cache 16m;
vod_response_cache response_cache 512m;
vod_last_modified_types *;
vod_segment_duration 9000;
vod_align_segments_to_key_frames on;
vod_dash_fragment_file_name_prefix "segment";
vod_hls_segment_file_name_prefix "segment";
vod_manifest_segment_durations_mode accurate;
server {
listen 8090;
server_name localhost;
root /var/www/html/vod;
add_header Access-Control-Allow-Headers '*';
add_header Access-Control-Allow-Origin '*';
add_header Access-Control-Allow-Methods 'GET, HEAD, OPTIONS';
location /hls/ {
vod hls;
alias /var/www/html/vod/;
}
location /thumb/ {
vod thumb;
alias /var/www/html/vod/;
}
location /dash/ {
vod dash;
alias /var/www/html/vod/;
}
}
}В этом примере мы можем раздавать локальные файлы по протоколам HLS и DASH, а также создаём локацию для генерации миниатюр видео (/thumb/).
Также в общей части конфигурации (контекст http) мы задаём локальный режим работы, размеры кэшей и настройки сегментирования видеофайлов.
Поддержки живых трансляций в рамках этого модуля нет, для них авторы рекомендуют использовать продукт Kaltura Media Framework.
Подведём итоги статьи.
Итоги
Сервер Angie наделён базовыми способностями работы с видео с помощью встроенных модулей. Однако, подключение сторонних модулей (например, RTMP) открывает возможности для создания полноценного видеосервиса на основе Angie и открытого софта (ffmpeg, открытые библиотеки видеокодирования и т.д.) Даже если не стоит задачи создавать полноформатный видеохостинг, работа с видео пригодится для локальных корпоративных задач.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.