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

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

Установка Debian/Ubuntu

Эти документы применимы к пакету APT nginx-module-flv, предоставляемому репозиторием GetPageSpeed Extras.

  1. Настройте репозиторий APT, как описано в настроить репозиторий APT.
  2. Установите модуль:
sudo apt-get update
sudo apt-get install nginx-module-flv
Показать дистрибутивы и архитектуры
| Дистрибутив | Версия            | Компонент   | Архитектуры    |
|-------------|-------------------|-------------|-----------------|
| debian      | bookworm          | main        | amd64, arm64    |
| debian      | bookworm-mainline | main        | amd64, arm64    |
| debian      | trixie            | main        | amd64, arm64    |
| debian      | trixie-mainline   | main        | amd64, arm64    |
| ubuntu      | focal             | main        | amd64, arm64    |
| ubuntu      | focal-mainline    | main        | amd64, arm64    |
| ubuntu      | jammy             | main        | amd64, arm64    |
| ubuntu      | jammy-mainline    | main        | amd64, arm64    |
| ubuntu      | noble             | main        | amd64, arm64    |
| ubuntu      | noble-mainline    | main        | amd64, arm64    |

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 и ответ chunks
Кэш 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,
#нижеуказанная команда ДОЛЖНА быть указана и ДОЛЖНА быть
#расположена перед директивой 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 для сокращения времени ожидания первого кадра видео
        }
    }
}