Как стать автором
Поиск
Написать публикацию
Обновить

Кэширование видео потока HDS и HLS с прошью NGINX

image
Трансляция видео живого или по требованию на страницах интернета становится массовым явление и способов организовать такую трансляцию накопилось уже большое количество. На страницах Хабра имеется пару интересных статей как это можно сделать тут тут и здесь.
Но к вопросу о создании масштабируемых систем трансляции материалов практически нет. Данная статья расскажет как кэшировать видео и раздавать на большое количество пользователей.

Чаще всего видео трансляции организована по следующей схеме:

источник – перекодировщик – сервер трансляций — проигрыватель

  • Источник – обычная веб камера.
  • Перекодировщик – Adobe Flash Media Live Encoder 3.2
  • Cервер трансляций – Wowza Media Server 3.5.2
  • Поигрывает – Strobe


Такая схема работает и достаточно популярна. Основная проблема, которая встречается при использовании – прожорливость Wowza к памяти и использованию процессора. Организовать трансляцию в 1000 потоков на одном, даже мощном сервере, часто не получится из-за нехватки ресурсов.

В качестве решения такой проблемы предлагается использовать прокси-сервер с кэшированием.

Пользователь грузит страничку с интегрированным флеш видео плеером (Strobe)
Плеер забирает видео поток по протоколу HTTP Dynamic Streaming (HDS) по 9000 порту
Nginx отдает из кеша кусочки потока по HTTP. При отсутствии файлов в кеше забирает кусочки потока от Wowza Media Server по порту 1935
Что будет использоваться в качестве источника видео сигнала, не существенно, такая конструкция будет работать и для Live, и для VOD, и для nDVR потоков.

Как настроить такую схему – пожалуйста под кат

Операционная система – Debian linux 7.0 но данная схема будет работать и на любой другой операционной системе.
Нам потребуется Wowza Media Server — работает под Java и Nginx.

Установка Wowza Media Server


root#apt-get install default-jdk
root#wget http://www.wowza.com/downloads/WowzaMediaServer-3-6-2/WowzaMediaServer-3.6.2.deb.bin
root#chmod +x WowzaMediaServer-3.6.2.deb.bin
root#./WowzaMediaServer-3.6.2.deb.bin


Замечу Wowza Media Server не бесплатное решение и для работы требуется лицензионный ключ

Ключ вводится при первом запуске

root#cd /usr/local/WowzaMediaServer/bin
root#./startup.sh


Установка nginx

root#apt-get install nginx

Настройка

Wowza Media Server – по умолчанию маркирует каждую сессию уникальным ключем и для наших целей такая маркировка будет вредна также Wowza требует указать HTTP Cache-Control headers и указать, чтоб каждый кусочек потоков имел уникальное название.

Подробней про настройку Wowza Media Server на странице официальной документации. www.wowza.com/forums/content.php?457

Нам же нужно будет добавить в описание приложения следующую секцию настроек.
Файл настроек приложения VOD вы найдете тут:

/usr/local/WowzaMediaServer/conf/vod/Application.xml

Добавить нужно в секцию HTTPStreamer/Properties


httpOriginMode
on



cupertinoCacheControlPlaylist
max-age=1

cupertinoCacheControlMediaChunk
max-age=3600



smoothCacheControlPlaylist
max-age=1

smoothCacheControlMediaChunk
max-age=3600

smoothCacheControlDataChunk
max-age=3600



sanjoseCacheControlPlaylist
max-age=1

sanjoseCacheControlMediaChunk
max-age=3600

cupertinoOnChunkStartResetCounter
true
Boolean


Готовый файл конфигурационного найдете в конце статьи

Перегружаем Wowza Media Server сервер.

root#service WowzaMediaServer restart

и проверяем что наш Wowza Media Server работает и поток отдается и в нужном виде.

wget http://:1935/vod/mp4:sample.mp4/manifest.f4m

и файл manifest.f4m должен быть примерно такого содержания.

<?xml version="1.0" encoding="utf-8"?>
sample.mp4
424
240
596.458
video/mp4
recorded
streaming
AAADrmFic3QBAAAAAAAAAQAAAAPoAAAAAAAJGeoAAAAAAAAAAAABAAEAAAABAAAAGmFzcnQBAAAAAQAAAAABAAAAAQAAADUBAAADZmFmcnQBAAAAAAAD6AEAAAAANQAAAAEAAAAAAAAAAAAAK/IAAAACAAAAAAAAK/IAACvyAAAAAwAAAAAAAFfkAAAr8gAAAAQAAAAAAACD1gAAK/IAAAAFAAAAAAAAr8gAACfgAAAABgAAAAAAANeoAAAwLgAAAAcAAAAAAAEH1gAALeYAAAAIAAAAAAABNbwAACjaAAAACQAAAAAAAV6WAAAydQAAAAoAAAAAAAGRCwAAJxAAAAALAAAAAAABuBsAAConAAAADAAAAAAAAeJCAAAqpQAAAA0AAAAAAAIM5wAAK/IAAAAOAAAAAAACONkAACiHAAAADwAAAAAAAmFgAAAnOgAAABAAAAAAAAKImgAAJ2MAAAARAAAAAAACr/0AADOYAAAAEgAAAAAAAuOVAAApBAAAABMAAAAAAAMMmQAALhAAAAAUAAAAAAADOqkAAC+HAAAAFQAAAAAAA2owAAAwgAAAABYAAAAAAAOasAAAKyIAAAAXAAAAAAADxdIAACyZAAAAGAAAAAAAA/JrAAAr8gAAABkAAAAAAAQeXQAALMIAAAAaAAAAAAAESx8AACpRAAAAGwAAAAAABHVwAAAp/gAAABwAAAAAAASfbgAALMMAAAAdAAAAAAAEzDEAADLxAAAAHgAAAAAABP8iAAAwBAAAAB8AAAAAAAUvJgAAK/IAAAAgAAAAAAAFWxgAACvyAAAAIQAAAAAABYcKAAAo2gAAACIAAAAAAAWv5AAAL7EAAAAjAAAAAAAF35UAACvIAAAAJAAAAAAABgtdAAAutgAAACUAAAAAAAY6EwAALrcAAAAmAAAAAAAGaMoAACn+AAAAJwAAAAAABpLIAAAsbwAAACgAAAAAAAa/NwAANBUAAAApAAAAAAAG80wAACeNAAAAKgAAAAAABxrZAAAq+AAAACsAAAAAAAdF0QAANGkAAAAsAAAAAAAHejoAACt1AAAALQAAAAAAB6WvAAAr8gAAAC4AAAAAAAfRoQAAK/IAAAAvAAAAAAAH/ZMAACvyAAAAMAAAAAAACCmFAAAr8gAAADEAAAAAAAhVdwAAK/IAAAAyAAAAAAAIgWkAACvyAAAAMwAAAAAACK1bAAAr8gAAADQAAAAAAAjZTQAAK/IAAAA1AAAAAAAJBT8AABSr
AgAKb25NZXRhRGF0YQgAAAAAAAl0cmFja2luZm8KAAAAAgMACGxhbmd1YWdlAgADZW5nAAl0aW1lc2NhbGUAQDgAAAAAAAAABmxlbmd0aABAy/WAAAAAAAARc2FtcGxlZGVzY3JpcHRpb24KAAAAAQMACnNhbXBsZXR5cGUCAARhdmMxAAAJAAAJAwAIbGFuZ3VhZ2UCAANlbmcACXRpbWVzY2FsZQBA53AAAAAAAAAGbGVuZ3RoAEF7TYAAAAAAABFzYW1wbGVkZXNjcmlwdGlvbgoAAAABAwAKc2FtcGxldHlwZQIABG1wNGEAAAkAAAkADWF1ZGlvY2hhbm5lbHMAQAAAAAAAAAAAD2F1ZGlvc2FtcGxlcmF0ZQBA53AAAAAAAAAOdmlkZW9mcmFtZXJhdGUAQDgAAAAAAAAABmFhY2FvdABAAAAAAAAAAAAIYXZjbGV2ZWwAQD4AAAAAAAAACmF2Y3Byb2ZpbGUAQFCAAAAAAAAADGF1ZGlvY29kZWNpZAIABG1wNGEADHZpZGVvY29kZWNpZAIABGF2YzEABXdpZHRoAEB6gAAAAAAAAAZoZWlnaHQAQG4AAAAAAAAACmZyYW1lV2lkdGgAQHqAAAAAAAAAC2ZyYW1lSGVpZ2h0AEBuAAAAAAAAAAxkaXNwbGF5V2lkdGgAQHqAAAAAAAAADWRpc3BsYXlIZWlnaHQAQG4AAAAAAAAACWZyYW1lcmF0ZQBAOAAAAAAAAAAMbW9vdnBvc2l0aW9uAEGCfUSgAAAAAAhkdXJhdGlvbgBAgqOqqqqqqwAACQ==



Настройка Nginx прокси сервера с кэшированием


После установки из пакета настройки Nginx вы найдете по адресу /etc/nginx/.

Нам потребуется указать новую секцию сервера с прослушиванием 9000 порта, папку где будем хранить кеш, и директиву включающую, собственно, кэширование и адрес источника кэширования.

Файл настроек Nginx – /etc/nginx/nginx.conf можно редактировать в любимом редакторе.

В описании http секции
proxy_cache_path /var/tmp/nginx/proxy levels=1:2 keys_zone=proxy_cache:1024m max_size=10048m inactive=10d;

директива описывает название папки для кэширования, размер и условия хранения.

И описание секции server

server {
listen 9000;
server_name servername:9000;
location / {
proxy_pass http://:1935;
proxy_cache proxy_cache;
}
}

Указываем имя сервера и откуда брать контент для прокси. Также указано, что контент нужно проксировать.
Перегружаем сервис Nginx

root#service nginx restart


Использование


Кэшированное видео будет доступно по следующим URL

HDS - http://:9000/vod/mp4:sample.mp4/manifest.f4m
HLS - http://:9000/vod/mp4:sample.mp4/playlist.m4u8

PS Замеченная особенность. Такая схема добавляет задержку в живое видео между событием и собственно видео рядом порядка 30-40 секунд.

application.xml
nginx.conf
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.