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

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.14, выпущенный 4 июля 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 (HTTP/1.x для воспроизведения) 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 (ограниченно).

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

Примечание

  • Flash player больше не будет официально поддерживаться Adobe после 31 декабря 2020 года, обратитесь к Adobe Flash Player EOL General Information Page для получения подробной информации. Плагины, использующие Flash player, не будут работать после того, как основные браузеры удалят Flash player.

  • flv.js может работать только с браузерами, которые поддерживают Media Source Extensions.

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

  • 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 domain socket on 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, следующая команда ДОЛЖНА быть указана и ДОЛЖНА находиться
#перед директивой 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;

    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.