Перейти к содержанию

flv: Медиа-сервер для потоковой передачи на основе nginx-module-rtmp

Установка

Вы можете установить этот модуль в любом дистрибутиве на базе RHEL, включая, но не ограничиваясь:

  • RedHat Enterprise Linux 7, 8, 9 и 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 и 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

Включите модуль, добавив следующее в верхнюю часть /etc/nginx/nginx.conf:

load_module modules/ngx_http_flv_live_module.so;

Этот документ описывает nginx-module-flv v1.2.13, выпущенный 23 февраля 2026 года.


nginx-http-flv-module workflow

Медиа-сервер для потоковой передачи на основе nginx-rtmp-module.

中文说明.

Пожертвуйте, если вам нравится этот модуль. Большое спасибо вам!

PayPal

Особенности

  • Все функции, предоставляемые nginx-rtmp-module.

  • Другие функции, предоставляемые nginx-http-flv-module по сравнению с nginx-rtmp-module:

Особенности nginx-http-flv-module nginx-rtmp-module Примечания
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

Поддерживаемые системы

  • Linux (рекомендуется) / FreeBSD / MacOS / Windows (ограниченно).

Поддерживаемые плееры

Примечание

Предварительные требования

  • GNU make для активации компилятора в системах, подобных Unix, для компиляции программного обеспечения.

  • GCC для компиляции в системах, подобных Unix, или MSVC для компиляции в Windows.

  • GDB для отладки в системах, подобных Unix.

  • FFmpeg или OBS для публикации медиа-потоков.

  • VLC (рекомендуется) или flv.js (рекомендуется) для воспроизведения медиа-потоков.

  • PCRE для NGINX, если нужны регулярные выражения.

  • OpenSSL для NGINX, если нужен защищенный доступ.

  • zlib для NGINX, если требуется сжатие.

Использование

Для получения подробной информации о использовании nginx-rtmp-module смотрите 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 можно указывать по желанию, но его НЕЛЬЗЯ опускать.

Порт по умолчанию для RTMP1935, если используются другие порты, необходимо указать :port.

Воспроизведение

через HTTP-FLV

http://example.com[:port]/dir?[port=xxx&]app=appname&stream=streamname

Примечание

  • Если ffplay используется в командной строке для воспроизведения потока, URL выше ДОЛЖЕН быть заключен в кавычки, иначе аргументы в URL будут отброшены (некоторые оболочки не так умны и интерпретируют "&" как "выполнить в фоновом режиме").

  • Если flv.js используется для воспроизведения потока, убедитесь, что опубликованный поток закодирован правильно, так как flv.js поддерживает ТОЛЬКО видео, закодированное в H.264, и аудио, закодированное в AAC/MP3.

dir используется для соответствия блокам местоположения в http блоке (подробности см. ниже).

Порт по умолчанию для HTTP80, если используются другие порты, необходимо указать :port.

Порт по умолчанию для RTMP1935, если используются другие порты, необходимо указать 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 {
        listen 1985; #не порт по умолчанию 1935
        ...

        application myapp {
            live on;
        }
    }
}

И имя опубликованного потока — mystream, тогда URL для воспроизведения на основе HTTP будет:

http://example.com:8080/live?port=1985&app=myapp&stream=mystream

Примечание

Поскольку некоторые плееры не поддерживают HTTP-чанковую передачу, лучше указать chunked_transfer_encoding off; в местоположении, где указано flv_live on;, в противном случае воспроизведение не удастся.

через RTMP

rtmp://example.com[:port]/appname/streamname

через HLS

http://example.com[:port]/dir/streamname.m3u8

через DASH

http://example.com[:port]/dir/streamname.mpd

Примеры изображений

RTMP (JW Player) & HTTP-FLV (VLC)

RTMP & HTTP-FLV

HTTP-FLV (flv.js)

HTTP-FLV

Пример nginx.conf

Примечание

Директивы rtmp_auto_push, rtmp_auto_push_reconnect и rtmp_socket_dir не будут работать в Windows, за исключением Windows 10 17063 и более поздних версий, потому что relay в режиме нескольких процессов требует помощи Unix-доменных сокетов, смотрите Unix-доменные сокеты в Windows 10 для получения подробной информации.

Лучше указать директиву worker_processes как 1, потому что ngx_rtmp_stat_module может не получать статистику от указанного рабочего процесса в режиме многопроцессорности, так как HTTP-запросы случайным образом распределяются между рабочими процессами. У ngx_rtmp_control_module та же проблема. Проблему можно оптимизировать с помощью этого патча per-worker-listener.

Кроме того, функция vhost работает нормально в режиме одного процесса, но еще не идеальна в режиме многопроцессорности, ожидая исправления. Например, следующая конфигурация работает нормально в режиме многопроцессорности:

rtmp {
    ...
    server {
        listen 1935;
        server_name domain_name;

        application myapp {
            ...
        }
    }
}

В то время как следующая конфигурация не работает должным образом для запросов воспроизведения, направленных на второй server (независимо от того, порт 1935 или нет) рабочих процессов, не являющихся издателями:

rtmp {
    ...
    server {
        listen 1935;
        server_name 1st_domain_name;

        application myapp {
            ...
        }
    }

    server {
        listen 1945;
        server_name 2nd_domain_name;

        application myapp {
            ...
        }
    }
}

Если NGINX работает в режиме многопроцессорности и опция сокета SO_REUSEPORT поддерживается платформой, добавление опции reuseport для директивы listen решит проблему громкого стада.

rtmp {
    ...

    server {
        listen 1935 reuseport;
        ...
    }
}

Пример конфигурации

worker_processes  1; #должен быть 1 для Windows, так как он не поддерживает Unix-доменные сокеты
#worker_processes  auto; #с версии 1.3.8 и 1.2.5

#worker_cpu_affinity  0001 0010 0100 1000; #доступно только на FreeBSD и Linux
#worker_cpu_affinity  auto; #с версии 1.9.10

error_log logs/error.log error;

#если модуль скомпилирован как динамический модуль и нужны функции, относящиеся
#к RTMP, следующая команда ДОЛЖНА быть указана и ДОЛЖНА
#находиться перед директивой событий, иначе модуль не будет загружен
#или будет загружен неуспешно при запуске 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;

    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; #включить потоковую передачу 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 {
        #    rtmp_stat all;
        #    rtmp_stat_format json;
        #}

        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 для уменьшения времени ожидания первого кадра видео
        }
    }
}

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-flv.