flv: Servidor de streaming de mídia baseado no nginx-module-rtmp
Instalação
Você pode instalar este módulo em qualquer distribuição baseada em RHEL, incluindo, mas não se limitando a:
- RedHat Enterprise Linux 7, 8, 9 e 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 e Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-flv
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-flv
Ative o módulo adicionando o seguinte no topo de /etc/nginx/nginx.conf:
load_module modules/ngx_http_flv_live_module.so;
Este documento descreve o nginx-module-flv v1.2.13 lançado em 23 de fevereiro de 2026.
Um servidor de streaming de mídia baseado no nginx-rtmp-module.
中文说明.
Doe se você gosta deste módulo. Muito obrigado!
Recursos
-
Todos os recursos fornecidos pelo nginx-rtmp-module.
-
Outros recursos fornecidos pelo nginx-http-flv-module vs nginx-rtmp-module:
| Recursos | nginx-http-flv-module | nginx-rtmp-module | Observações |
|---|---|---|---|
| HTTP-FLV (para reprodução) | √ | x | HTTPS-FLV e resposta em chunked suportados |
| Cache GOP | √ | x | |
| Host Virtual | √ | x | |
Omitir diretiva listen |
√ | Veja observações | Deve haver pelo menos uma diretiva listen |
| Suporte apenas para áudio em RTMP/HTTP-FLV | √ | Veja observações | Não funcionará se wait_video ou wait_key estiver ativado |
| Suporte a uma única faixa para HLS | √ | x | |
Suporte a reuseport |
√ | x | |
| Timer para log de acesso | √ | x | |
| Estatísticas em estilo JSON | √ | x | |
| Estatísticas para gravações | √ | x | |
| Independente de endianness | √ | Veja observações | Parcialmente suportado na branch big-endian |
Sistemas suportados
- Linux (recomendado) / FreeBSD / MacOS / Windows (limitado).
Players suportados
Nota
-
O Flash player não será mais suportado oficialmente pela Adobe após 31 de dezembro de 2020, consulte a Página de Informações Gerais sobre EOL do Adobe Flash Player para detalhes. Plugins que usam o flash player não funcionarão após os principais navegadores removerem o flash player.
-
O flv.js só pode ser executado em navegadores que suportam Media Source Extensions.
Pré-requisitos
-
GNU make para ativar o compilador em sistemas Unix-like para compilar software.
-
GCC para compilação em sistemas Unix-like ou MSVC para compilação em Windows.
-
GDB para depuração em sistemas Unix-like.
-
VLC (recomendado) ou flv.js (recomendado) para reproduzir streams de mídia.
-
PCRE para NGINX se expressões regulares forem necessárias.
-
OpenSSL para NGINX se acesso criptografado for necessário.
-
zlib para NGINX se compressão for necessária.
Uso
Para detalhes sobre o uso do nginx-rtmp-module, consulte o README.md.
Publicar
Para simplicidade, a transcodificação não é utilizada (portanto, -c copy é usado):
ffmpeg -re -i NOME_DO_ARQUIVO_DE_MÍDIA -c copy -f flv rtmp://example.com[:port]/appname/streamname
Nota
Algumas versões legadas do FFmpeg não suportam a opção -c copy, as opções -vcodec copy -acodec copy podem ser usadas em vez disso.
O appname é usado para corresponder a um bloco de aplicativo no bloco rtmp (veja abaixo para detalhes).
O streamname pode ser especificado à vontade, mas NÃO pode ser omitido.
A porta padrão para RTMP é 1935, se outras portas forem usadas, :port deve ser especificado.
Reproduzir
via HTTP-FLV
http://example.com[:port]/dir?[port=xxx&]app=appname&stream=streamname
Nota
-
Se ffplay for usado na linha de comando para reproduzir o stream, a URL acima DEVE estar entre aspas, ou os argumentos na URL serão descartados (alguns shells não tão inteligentes interpretarão "&" como "executar em segundo plano").
-
Se flv.js for usado para reproduzir o stream, certifique-se de que o stream publicado esteja codificado corretamente, pois o flv.js suporta APENAS vídeo codificado em H.264 e áudio codificado em AAC/MP3.
O dir é usado para corresponder a blocos de localização no bloco http (veja abaixo para detalhes).
A porta padrão para HTTP é 80, se outras portas forem usadas, :port deve ser especificado.
A porta padrão para RTMP é 1935, se outras portas forem usadas, port=xxx deve ser especificado.
O valor de app (appname) é usado para corresponder a um bloco de aplicativo, mas se o app solicitado aparecer em vários blocos de servidor e esses blocos tiverem a mesma configuração de endereço e porta, o nome do host que corresponder à diretiva server_name será usado adicionalmente para identificar o bloco de aplicativo solicitado, caso contrário, o primeiro será correspondido.
O valor de stream (streamname) é usado para corresponder ao nome do stream publicado.
Exemplo
Suponha que a diretiva listen especificada no bloco http seja:
http {
...
server {
listen 8080; #não porta padrão 80
...
location /live {
flv_live on;
}
}
}
E a diretiva listen especificada no bloco rtmp seja:
rtmp {
...
server {
listen 1985; #não porta padrão 1935
...
application myapp {
live on;
}
}
}
E o nome do stream publicado é mystream, então a URL de reprodução baseada em HTTP é:
http://example.com:8080/live?port=1985&app=myapp&stream=mystream
Nota
Como alguns players não suportam transmissão HTTP em chunks, é melhor especificar chunked_transfer_encoding off; na localização onde flv_live on; é especificado neste caso, ou a reprodução falhará.
via RTMP
rtmp://example.com[:port]/appname/streamname
via HLS
http://example.com[:port]/dir/streamname.m3u8
via DASH
http://example.com[:port]/dir/streamname.mpd
Imagens de Amostra
RTMP (JW Player) & HTTP-FLV (VLC)

HTTP-FLV (flv.js)

Exemplo de nginx.conf
Nota
As diretivas rtmp_auto_push, rtmp_auto_push_reconnect e rtmp_socket_dir não funcionarão no Windows, exceto no Windows 10 17063 e versões posteriores, porque relay em modo de múltiplos processos precisa da ajuda do socket de domínio Unix, consulte Unix domain socket on Windows 10 para detalhes.
É melhor especificar a diretiva worker_processes como 1, porque ngx_rtmp_stat_module pode não obter estatísticas de um processo de trabalho específico em modo de múltiplos processos, pois as solicitações HTTP são distribuídas aleatoriamente para os processos de trabalho. ngx_rtmp_control_module tem o mesmo problema. O problema pode ser otimizado por este patch per-worker-listener.
Além disso, o recurso vhost está OK em modo de processo único, mas não é perfeito em modo de múltiplos processos ainda, aguardando correção. Por exemplo, a seguinte configuração está OK em modo de múltiplos processos:
rtmp {
...
server {
listen 1935;
server_name domain_name;
application myapp {
...
}
}
}
Enquanto a seguinte configuração não funciona corretamente para solicitações de reprodução destinadas ao segundo server (se a porta for 1935 ou não) dos processos de trabalho não-publicadores:
rtmp {
...
server {
listen 1935;
server_name 1st_domain_name;
application myapp {
...
}
}
server {
listen 1945;
server_name 2nd_domain_name;
application myapp {
...
}
}
}
Se o NGINX estiver sendo executado em modo de múltiplos processos e a opção de socket SO_REUSEPORT for suportada pela plataforma, adicionar a opção reuseport para a diretiva listen resolverá o problema do rebanho trovejante.
rtmp {
...
server {
listen 1935 reuseport;
...
}
}
Exemplo de configuração
worker_processes 1; #deve ser 1 para Windows, pois não suporta socket de domínio Unix
#worker_processes auto; #a partir das versões 1.3.8 e 1.2.5
#worker_cpu_affinity 0001 0010 0100 1000; #disponível apenas no FreeBSD e Linux
#worker_cpu_affinity auto; #a partir da versão 1.9.10
error_log logs/error.log error;
#se o módulo for compilado como um módulo dinâmico e recursos relevantes
#para RTMP forem necessários, o comando abaixo DEVE ser especificado e DEVE ser
#localizado antes da diretiva events, caso contrário o módulo não será carregado
#ou será carregado com falha quando o NGINX for iniciado
#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;
server {
listen 80;
location / {
root /var/www;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /live {
flv_live on; #abrir streaming ao vivo flv (inscrever-se)
chunked_transfer_encoding on; #abrir resposta 'Transfer-Encoding: chunked'
add_header 'Access-Control-Allow-Origin' '*'; #adicionar cabeçalho HTTP adicional
add_header 'Access-Control-Allow-Credentials' 'true'; #adicionar cabeçalho HTTP adicional
}
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 {
#configuração de estatísticas de streaming & gravação
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /var/www/rtmp; #especificar onde stat.xsl está localizado
}
#se estatísticas em estilo JSON forem necessárias, não é necessário especificar
#stat.xsl, mas uma nova diretiva rtmp_stat_format
#location /stat {
# rtmp_stat all;
# rtmp_stat_format json;
#}
location /control {
rtmp_control all; #configuração do módulo de controle do 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; #intervalo usado pelo módulo de log para registrar em access.log, é muito útil para depuração
log_size 1m; #tamanho do buffer usado pelo módulo de log para registrar em access.log
server {
listen 1935;
server_name www.test.*; #para correspondência de wildcard de sufixo do nome do host virtual
application myapp {
live on;
gop_cache on; #abrir cache GOP para reduzir o tempo de espera pela primeira imagem do vídeo
}
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; #para correspondência de wildcard de prefixo do nome do host virtual
application myapp {
live on;
gop_cache on; #abrir cache GOP para reduzir o tempo de espera pela primeira imagem do vídeo
}
}
server {
listen 1935;
server_name www.test.com; #para correspondência completa do nome do host virtual
application myapp {
live on;
gop_cache on; #abrir cache GOP para reduzir o tempo de espera pela primeira imagem do vídeo
}
}
}
GitHub
Você pode encontrar dicas de configuração adicionais e documentação para este módulo no repositório do GitHub para nginx-module-flv.
