Nginx-http-flv-модуль
Сервер потокового мультимедиа на основе nginx-rtmp-module.
中文说明.
Пожертвуйте, если вам нравится этот модуль. Большое спасибо!
Все функции, предоставляемые nginx-rtmp-модулем, а также:
Функции | nginx-http-flv-модуль | nginx-rtmp-модуль | Примечания |
---|---|---|---|
HTTP-FLV (для воспроизведения) | √ | x | Поддерживаются HTTPS-FLV и фрагментированный ответ |
Кэш GOP | √ | x | |
Виртуальный хост | √ | x | |
Опустить директиву listen | √ | См. примечания | Должна быть хотя бы одна директива listen |
Поддержка аудио только для RTMP/HTTP-FLV | √ | См. примечания | Не будет работать, если wait_video или wait_key включено |
Однотрековая поддержка HLS | √ | x | |
Поддержка reuseport | √ | x | |
Таймер для журнала доступа | √ | x | |
Статистика в стиле JSON | √ | x | |
Статистические данные для записей | √ | x | |
Независимость от порядка байтов | √ | См. примечания | Частично поддерживается в ветке big-endian |
Версия [NGINX] должна быть равна или выше 1.2.6, совместимость с другими версиями неизвестна.
Официально Adobe прекратит поддержку [Flash Player] после 31 декабря 2020 года. Подробнее см. на странице Adobe Flash Player EOL General Information Page. Плагины, использующие Flash Player, перестанут работать после того, как основные браузеры удалят Flash Player.
[flv.js] может работать только с браузерами, поддерживающими [Media Source Extensions].
flv.js (рекомендуется) для воспроизведения медиапотоков.
PCRE для NGINX, если нужны регулярные выражения.
OpenSSL для NGINX, если нужен защищённый доступ.
zlib для NGINX, если нужно сжатие.
nginx-http-flv-module имеет все функции, которые предоставляет nginx-rtmp-module, поэтому НЕ компилируйте nginx-http-flv-модуль вместе с nginx-rtmp-модулем.
Для получения подробной информации о шагах сборки обратитесь к Building nginx on the Win32 platform with Visual C, и не забудьте добавить --add-module=/path/to/nginx-http-flv-module
в шаге «Запустить скрипт настройки».
Если используются компиляторы, которые не поддерживают x64 идеально, например VS2010, убедитесь, что используются настройки по умолчанию (тип целевой машины — x86).
Скачайте NGINX и nginx-http-flv-модуль.
Распакуйте их.
Перейдите в исходный каталог NGINX и выполните следующее:
./configure --add-module=/путь/к/nginx-http-flv-модулю
make
make install
или
./configure --add-dynamic-module=/путь/к/nginx-http-flv-модулю
make
make install
Если модуль скомпилирован как динамический, версия [NGINX] должна быть равна или больше 1.9.11.
Подробности использования nginx-rtmp-модуля см. в README.md.
Для простоты транскодирование не используется (поэтому используется -c copy):
ffmpeg -re -i MEDIA_FILE_NAME -c copy -f flv rtmp://example.com[:port]/appname/streamname
Некоторые устаревшие версии FFmpeg не поддерживают опцию -c copy
, вместо этого можно использовать опции -vcodec copy -acodec copy
.
appname
используется для сопоставления блока приложения в блоке rtmp (подробности см. ниже).
streamname
можно указать по желанию, но его нельзя опускать.
По умолчанию порт для RTMP — 1935, если использовались другие порты, необходимо указать :port
.
http://example.com[:port]/dir?[port=xxx&]app=appname&stream=streamname
Если ffplay используется в командной строке для воспроизведения потока, URL-адрес выше должен быть заключён в кавычки, иначе аргументы в URL-адресе будут отброшены (некоторые оболочки не настолько умны, чтобы интерпретировать "&" как "запустить в фоновом режиме").
Если для воспроизведения потока используется [flv.js], убедитесь, что опубликованный поток закодирован правильно, поскольку [flv.js] поддерживает ТОЛЬКО видео, закодированное H.264, и аудио, закодированное AAC/MP3.
dir
используется для соответствия блоков местоположения в блоке http (подробнее см. ниже).
Порт по умолчанию для HTTP — 80, если использовались другие порты, необходимо указать :port
.
Порт по умолчанию для RTMP — 1935, если использовались другие порты, port=xxx
должен быть указан.
Значение app
(appname) используется для сопоставления блока приложений, но если запрошенное app
появляется в нескольких блоках сервера и эти блоки имеют одинаковую конфигурацию адреса и порта, имя хоста, соответствующее директиве server_name
, будет дополнительно использоваться для идентификации запрошенного блока приложения, в противном случае будет сопоставлен первый.
Значение stream
(streamname) используется для сопоставления имени опубликованного потока.
Предположим, что директива listen
, указанная в блоке http
, выглядит следующим образом:
http {
...
server {
listen 8080; #не порт по умолчанию 80
...
location /live {
flv_live on;
}
}
}
И директива listen
, указанная в блоке rtmp
, выглядит так:
rtmp {
...
server { Слушайте 1985; #нестандартный порт 1935
...
приложение myapp {
в прямом эфире;
}
}
}
И имя опубликованного потока — mystream
, тогда URL воспроизведения на основе HTTP:
http://example.com:8080/live?port=1985&app=myapp&stream=mystream
Поскольку некоторые проигрыватели не поддерживают HTTP-передачу по частям, в этом случае лучше указать chunked_transfer_encoding off;
там, где указано flv_live on;
, иначе воспроизведение не удастся.
rtmp://example.com[:port]/appname/streamname
http://example.com[:port]/dir/streamname.m3u8
http://example.com[:port]/dir/streamname.mpd
Директивы rtmp_auto_push
, rtmp_auto_push_reconnect
и rtmp_socket_dir
не будут работать в Windows, за исключением Windows 10 версии 17063 и более поздних версий, поскольку для relay
в режиме нескольких процессов требуется помощь сокета домена Unix, см. домен Unix socket на Windows 10 для получения дополнительной информации.
Лучше указать директиву worker_processes
как 1, потому что ngx_rtmp_stat_module
может не получить статистику от указанного рабочего процесса в многопроцессорном режиме, так как HTTP-запросы случайным образом распределяются между рабочими процессами. У ngx_rtmp_control_module
та же проблема. Проблему можно оптимизировать с помощью этого патча per-worker-listener.
Кроме того, функция vhost
работает нормально в однопроцессном режиме, но ещё не идеальна в многопроцессном, ожидая исправления. Например, следующая конфигурация подходит для многопроцессного режима:
rtmp {
...
server {
слушать 1935;
имя_сервера domain_name;
применение myapp {
...
}
}
}
В то время как следующая конфигурация не работает должным образом для запросов воспроизведения, направленных на второй server
(независимо от того, является ли порт 1935 или нет) рабочих процессов, не являющихся издателями:
rtmp {
...
сервер {
слушай 1935;
имя_сервера 1st_domain_name;
применение myapp {
...
}
}
сервер {
слушай 1945;
имя_сервера 2nd_domain_name;
применение myapp {
...
}
}
}
Если NGINX работает в многопроцессорном режиме и опция сокета SO_REUSEPORT
поддерживается платформой, добавление опции reuseport
к директиве listen
решит проблему «грохочущего стада».
rtmp {
...
server {
слушай 1935 reuseport;
...
}
}
worker_processes 1; #должно быть 1 для Windows, поскольку она не поддерживает сокет домена Unix
#worker_processes авто; #из версий 1.3.8 и 1.2.5
#worker_cpu_affinity 0001 0010 0100 1000; #доступно только на FreeBSD и Linux
#worker_cpu_affinity авто; #с версии 1.9.10
error_log журналы/ошибка.журнал ошибка;
#если модуль скомпилирован как динамический модуль и функции, связанные с RTMP, необходимы, команда ниже ДОЛЖНА быть указана и ДОЛЖНА располагаться перед директивой events, иначе модуль не будет загружен или будет загружен неудачно при запуске NGINX
#load_module modules/ngx_http_flv_live_module.so;
events {
worker_connections 4096;
}
HTTP {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
сервер {
слушай 80;
местоположение / {
корень /var/www;
индекс index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html { root html; }
location /live { flv_live on; #открыть потоковую передачу FLV в реальном времени (подписка) chunked_transfer_encoding on; #открытый ответ «Transfer-Encoding: chunked»
add_header 'Access-Control-Allow-Origin' '*'; #добавить дополнительный HTTP-заголовок
add_header 'Access-Control-Allow-Credentials' 'true'; #добавить дополнительный HTTP-заголовок
}
location /hls { types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; }
root /tmp;
add_header 'Cache-Control' 'no-cache';
}
location /dash { root /tmp; add_header 'Cache-Control' 'no-cache'; }
location /stat { #конфигурация статистики потоковой передачи и записи
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl { root /var/www/rtmp; #указать, где находится stat.xsl }
#если нужна статистика в стиле JSON, не нужно указывать #stat.xsl, но нужна новая директива rtmp_stat_format
#location /stat {
#}
location /control { rtmp_control all; #конфигурация модуля управления rtmp } }
rtmp_auto_push on; rtmp_auto_push_reconnect 1s; rtmp_socket_dir /tmp;
rtmp { out_queue 4096; out_cork 8; max_streams 128; timeout 15s; drop_idle_publisher 15s;
log_interval 5s; #интервал, используемый модулем журнала для регистрации в access.log, очень полезен для отладки log_size 1m; #размер буфера, используемый модулем журнала для регистрации в access.log
server { listen 1935; server_name www.test.*; #для соответствия имени виртуального хоста с использованием подстановочных знаков суффикса
application myapp { live on; gop_cache on; #включить кэш GOP для уменьшения времени ожидания первого кадра видео }
application hls { live on; hls on; hls_path /tmp/hls; }
application dash { live on; dash on; dash_path /tmp/dash; } }
server { listen 1935; server_name *.test.com; #для соответствия имени виртуального хоста с использованием префиксных подстановочных знаков
application myapp { live on; gop_cache on; #включить кэш GOP для уменьшения времени ожидания первого кадра видео } }
server { listen 1935; server_name www.test.com; #полное соответствие имени виртуального хоста
application myapp { live on; gop_cache on; #включить кэш GOP для уменьшения времени ожидания первого кадра видео } }
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )