Проблемы с частотой кадров преобразования RTMP в HLS с ffmpeg/nginx

В настоящее время я толкаю поток RTMP на nginx 1.15.3, работающий на Ubuntu 18.04 LTS с камеры raspberry pi 3 (которая, кажется, хорошо работает сама по себе, я могу вытащить поток без проблем на VLC и проверить, что он работает) с pi, используя эту команду:

raspivid -w 640 -h 480 -fps 5 -t 0 -b 1800000 -o - | ffmpeg -y -framerate 5 -f h264 -i - -c:v copy -map 0:0 -f flv -rtmp_buffer 100 -rtmp_live live rtmp://10.2.10.149/cam01/test

Если бы я установил аргумент fps на raspivid в 25, а затем избавился от аргумента ffmpeg framerate, то это было бы прекрасно перевести его в поток HLS с помощью этой команды, выполняемой на nginx сервер:

ffmpeg -i rtmp://10.2.10.149/cam01/test -vcodec libx264 -vprofile baseline -acodec h264 -strict -2 -f flv rtmp://10.2.10.149/show1/stream1

тем не менее, мне это нужно на более низкой частоте кадров, и кажется, что пытается сделать это каким-либо образом действительно расстраивает ffmpeg, потому что это вызовет поток заминка много, как он ждет, чтобы загрузить. Я подозреваю, что это связано с тем, что ffmpeg имеет частоту кадров по умолчанию 25 или что-то еще, потому что в потоке RTMP, если бы я попытался установить только аргумент fps в raspivid до 5 и не включать аргумент частоты кадров в ffmpeg, то это сделало бы видео заминкой для нескольких секунд, а затем запустить в 5 раз скорость видео в течение секунды, так как ffmpeg по-прежнему, казалось бы, пытается запустить 25 кадров в секунду видео.

ввод аргумента частоты кадров в команду преобразования ffmpeg, кажется, делает вещи еще хуже, и я не понимаю, почему это не работает, так как кажется, что это работает просто отлично для многих других людей. В основном я использовал это руководство, чтобы попытаться помочь мне с точки зрения настройки nginx и еще много чего: https://docs.peer5.com/guides/setting-up-hls-live-streaming-server-using-nginx/#4-pushing-live-stream-to-nginx-using-rtmp

Я также собираюсь поставить свой nginx.conf здесь для всех, чтобы увидеть, и обратите внимание, что у меня есть эта проблема, когда я пытаюсь вытащить видео через веб-страницу или с VLC непосредственно получать сетевой поток:

worker_processes  auto;
events {
worker_connections  1024;
}

# RTMP configuration
rtmp {
server {
    listen 1935; # Listen on standard RTMP port
    chunk_size 4096;

    application show1 {
        live on;
        # Turn on HLS
        hls on;
        hls_path /mnt/hls1/;
        hls_fragment 3;
        hls_playlist_length 60;
    }
application show2 {
        live on;
        # Turn on HLS
        hls on;
        hls_path /mnt/hls2/;
        hls_fragment 3;
        hls_playlist_length 60;
    }
application show3 {
        live on;
        # Turn on HLS
        hls on;
        hls_path /mnt/hls3/;
        hls_fragment 3;
        hls_playlist_length 60;
    }
application show4 {
        live on;
        # Turn on HLS
        hls on;
        hls_path /mnt/hls4/;
        hls_fragment 3;
        hls_playlist_length 60;
    }
application show5 {
        live on;
        # Turn on HLS
        hls on;
        hls_path /mnt/hls5/;
        hls_fragment 3;
        hls_playlist_length 60;
    }
application show6 {
        live on;
        # Turn on HLS
        hls on;
        hls_path /mnt/hls6/;
        hls_fragment 3;
        hls_playlist_length 60;
    }
application show7 {
        live on;
        # Turn on HLS
        hls on;
        hls_path /mnt/hls7/;
        hls_fragment 3;
        hls_playlist_length 60;
    }
    application cam01 {
        live on;
        record off;
    }
application cam02 {
        live on;
        record off;
    }
application cam03 {
        live on;
        record off;
    }
application cam04 {
        live on;
        record off;
    }
application cam05 {
        live on;
        record off;
    }
application cam06 {
        live on;
        record off;
    }
application cam07 {
        live on;
        record off;
    }
}
}

http {
sendfile off;
tcp_nopush on;
default_type application/octet-stream;

server {
    listen 80;
    server_name localhost;
    location / {
        # Disable cache
        add_header 'Cache-Control' 'no-cache';

        # CORS setup
        add_header 'Access-Control-Allow-Origin' '*' always;
        add_header 'Access-Control-Expose-Headers' 'Content-Length';

        # allow CORS preflight requests
        if ($request_method = 'OPTIONS') {
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Type' 'text/plain charset=UTF-8';
            add_header 'Content-Length' 0;
            return 204;
        }

        types {
            application/dash+xml mpd;
            application/vnd.apple.mpegurl m3u8;
            video/mp2t ts;
        }

        root /mnt/;
        location /index.html {
            default_type "text/html";
        }
        location /testing.html {
            default_type "text/html";
        }
        location /test.html {
            default_type "text/html";
        }
    location /cam01.html {
            default_type "text/html";
        }
    location /cam02.html {
            default_type "text/html";
        }
    location /cam03.html {
            default_type "text/html";
        }
    location /cam04.html {
            default_type "text/html";
        }
    location /cam05.html {
            default_type "text/html";
        }
    location /cam06.html {
            default_type "text/html";
        }
    location /cam07.html {
            default_type "text/html";
        }
    }
}
}

Если мне нужно включить больше деталей, то чувствуйте свободным препятствовать мне знать, мне как раз нужно получить это работающ правильно вместо из всех вопросов я только что объяснил, любая помощь будет оценили, спасибо.

Edit 1: я также замечаю, что поверх заминок и вырезов из потока, используя вторую команду, как описано выше, иногда кажется, что она "застревает" на определенном кадре, не уверен, что это более полезно или нет, просто хотел убедиться, что у меня есть вся информация, которую я могу здесь.

Edit 2: я начинаю верить, что это больше проблема с nginx, потому что, когда я указываю первая команда в папку /show1/stream1, которая преобразует rtmp в hls без запуска второй команды, которую я считал абсолютно необходимой, я получаю ту же самую проблему таким же образом. Я не много знаю о nginx, и ничто, что я нахожу в интернете, тоже не помогает. Был бы весьма признателен за понимание, я знаю, что hls всегда будет иметь большую задержку, и это не то, что я прошу исправить, я прошу, чтобы исправить вырезы и сцепки.

Edit 3: возможно вообще-то взломал его, я заметил на raspivid команды, настройки битрейт выше, действительно казалось, чтобы помочь вам, однако, даже если я ставлю битрейт абсурда, или даже не так абсурдно, но все-таки перебор размере, он до сих пор иногда вырезает несколько кадров случайным образом каждые несколько минут и я не совсем уверен, почему. Буду признателен за любую информацию.

24
задан tommy61157
27.12.2022 22:44 Количество просмотров материала 3047
Распечатать страницу

1 ответ

извините всех, кого я перепутал, оказывается, этот код все правильно (на самом деле, мне даже не нужна вторая команда, я могу просто передать его непосредственно в hls в nginx без проблем из pi). Что происходит, ffmpeg действительно не любит принимать что-либо менее 7 кадров в секунду при выполнении такого рода потоковой передачи, которая по-прежнему адекватна для моих целей. Это должно быть честно задокументировано где-то (ну, я думаю, сейчас, но все же).

изменить: камеру я использую также могут влияя на него, так как я только что понял, что некоторые из моих камер имеют минимальную частоту кадров 7.

0
отвечен tommy61157 2022-12-29 06:32

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх