Pular para conteúdo

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.


nginx-http-flv-module workflow

Um servidor de streaming de mídia baseado no nginx-rtmp-module.

中文说明.

Doe se você gosta deste módulo. Muito obrigado!

PayPal

Recursos

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

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.

  • FFmpeg ou OBS para publicar streams de mídia.

  • 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)

RTMP & HTTP-FLV

HTTP-FLV (flv.js)

HTTP-FLV

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.