- PVSM.RU - https://www.pvsm.ru -
Под термином онлайн-видео я понимаю длительное вещание какого-то живого видеосигнала (к примеру, из телестудии). Традиционные средства отдачи видео (flv- и mp4-стриминг) в данном случае не работают, просто потому что файла, содержащего весь видеопоток, не существует.
В этой статье речь будет идти не об организации видеохостинга, а об организации видеовещания в прямом эфире. Это две принципиально разные задачи, и обычно способы их решения существенно отличаются друг от друга.
RTMP — Real Time Messaging Protocol (вики [1]) — протокол, который обычно используется для раздачи живого видео- и аудиоконтента клиентам. Он удобен тем, что в AS3 есть его поддержка из коробки, требует не слишком много ресурсов на клиенте и поддерживает множество плюшек (например, трансляцию с переменными битрейтами и переключение клиентов на более высокое качество при наличии свободного канала).
Протокол RTMP — детище компании Adobe. Единственным официальным сервером, которым можно вещать RTMP-поток, является Adobe Flash Media Server. Его цена и производительность, к сожалению, оставляют желать лучшего, поэтому различными разработчиками были предприняты попытки создать более или менее совместимые альтернативные реализации протокола. К сожалению, у RTMP-протокола есть известные проблемы с лицензированием, к примеру, его официальная спецификация, если следовать ей строго, не позволяет написать работающий RTMP-сервер. Тем не менее, существует несколько реализаций:
В тестах, которые я проводил, Red5 и Wowza показали неприлично низкую производительность. При мегабитном видеопотоке Wowza при 1000 зрителей онлайн съедала уже около 300% процессорного времени (Intel Xeon E5607). Если требуется вещать хотя бы для 20000 человек онлайн, то нужно закупать 20 серверов? Это слишком дорого.
Использовать неблокирующие операции. Тормоза в Wowza и Red5 следуют из-за далеко не самой оптимальной схемы обработки событий. Для реализации действительно быстрого стримингового сервера, нужно использовать эффективный метод обработки событий (для linux это epoll). Именно такую схему работы и реализовал Roman Arutyunyan (блог [5], github-профиль [6]) в своём RTMP-сервере [7], реализованном как модуль к nginx.
Достоинства:
Недостатки:
Многопоточность можно реализовать с помощью примерно такого костыля (Ubuntu):
for ip in $(cat /etc/network/interfaces | grep address | awk '{print $2}') ; do
touch /etc/nginx/nginx.$ip.conf
cp /etc/nginx/nginx.conf.skel /etc/nginx/nginx.$ip.conf
sed -i "s/%IPADDR%/${ip}/g" /etc/nginx/nginx.$ip.conf
/usr/sbin/nginx -c /etc/nginx/nginx.$ip.conf
done
При этом у вас должен быть написан скелет конфига с указанием %IPADDR% вместо IP-адреса. Например, такой:
worker_processes 1;
error_log logs/error.%IPADDR%.log debug;
pid /var/run/nginx.%IPADDR%.pid;
worker_rlimit_nofile 65536;
events {
worker_connections 16384;
}
rtmp {
server {
listen %IPADDR%:1935;
chunk_size 4000;
application live {
live on;
pull live stream 193.9.17.213;
}
}
}
http {
server {
listen %IPADDR%:8080;
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /srv/nginx/html;
}
}
}
Впрочем, автор обещает реализовать нормальную многопоточность в будущих релизах.
С помощью nginx-rtmp-module мне удалось полностью утилизировать 10-гигабитный канал. При этом основной проблемой стала вовсе не прожорливость самого nginx, а необходимость тюнинга сетевой карты и параметров ядра, чтобы software interrupts не съедали 100% CPU.
RTMP на Википедии [1]
Wowza — официальный сайт [8]
Erlyvideo — официальный сайт [4]
Nginx-rtmp-module — проект на GitHub [7]
Автор: Aecktann
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/nginx/9601
Ссылки в тексте:
[1] вики: http://ru.wikipedia.org/wiki/RTMP
[2] Red5: http://www.red5.org/
[3] Wowza: http://www.wowza.com/
[4] erlyvideo: http://erlyvideo.org/
[5] блог: http://rarut.wordpress.com/
[6] github-профиль: https://github.com/arut/
[7] своём RTMP-сервере: https://github.com/arut/nginx-rtmp-module
[8] Wowza — официальный сайт: http://www.wowza.com/media-server
Нажмите здесь для печати.