
Трансляция видео живого или по требованию на страницах интернета становится массовым явление и способов организовать такую трансляцию накопилось уже большое количество. На страницах Хабра имеется пару интересных статей как это можно сделать тут тут и здесь.
Но к вопросу о создании масштабируемых систем трансляции материалов практически нет. Данная статья расскажет как кэшировать видео и раздавать на большое количество пользователей.
Чаще всего видео трансляции организована по следующей схеме:
источник – перекодировщик – сервер трансляций — проигрыватель
- Источник – обычная веб камера.
- Перекодировщик – 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