Проблемы с частотой кадров преобразования RTMP в HLS при использовании ffmpeg / nginx
717
tommy61157
В настоящее время я отправляю поток RTMP на nginx 1.15.3, работающий на Ubuntu 18.04 LTS, с камеры Raspberry Pi 3 (которая, кажется, работает хорошо сама по себе, я могу получить поток без проблем на VLC и убедиться, что он работает ) с пи с помощью этой команды:
Если бы я должен был установить аргумент fps для raspivid равным 25, а затем избавиться от аргумента ffmpeg framerate, то это было бы просто прекрасно преобразовать его в поток HLS, выполнив эту команду на сервере nginx:
Тем не менее, он мне нужен на более низкой частоте кадров, и кажется, что попытка сделать это каким-либо образом действительно расстраивает ffmpeg, потому что это приведет к тому, что поток будет сильно зависать, как будто он ожидает загрузки. Я подозреваю, что это как-то связано с тем, что ffmpeg имеет частоту кадров по умолчанию 25 или что-то подобное, потому что в потоке RTMP, если бы я попытался установить только аргумент fps в raspivid равным 5 и не включить аргумент framerate в ffmpeg, то это сделайте видео на несколько секунд, а затем запустите на 5 раз больше скорости видео на секунду, так как ffmpeg все еще пытается запустить видео с частотой 25 кадров в секунду.
Я также собираюсь разместить свой 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"; } } } }
Если мне нужно добавить какие-либо подробности, не стесняйтесь, дайте мне знать, мне просто нужно, чтобы это работало должным образом вместо всех вопросов, которые я только что объяснил, любая помощь будет оценена, спасибо.
Редактировать 1: Я также замечаю, что поверх зацепок и вырезов из потока, используя вторую команду, как описано ранее, иногда кажется, что она "застревает" в определенном кадре, не уверенный, является ли это более полезным или нет Я просто хотел убедиться, что у меня есть вся информация, которую я могу найти здесь.
Редактировать 2: Я начинаю верить, что это больше проблема с nginx, потому что, когда я указываю первую команду на местоположение / show1 / stream1, которое преобразует rtmp в hls, не выполняя вторую команду, которую я счел абсолютно необходимой, я Я получаю точно такой же вопрос точно так же. Я не знаю много о nginx, и ничто из того, что я нахожу в Интернете, тоже не сильно помогает. Буду очень признателен за понимание, я знаю, что hls всегда будет иметь большую задержку, и это не то, что я прошу исправить, я прошу исправить вырезы и сцепление.
Редактировать 3: Я, возможно, на самом деле несколько взломал это, я заметил по команде raspivid, что установка битрейта, казалось, действительно смягчает это, однако, даже если я установил битрейт на абсурдный или даже не настолько абсурдный, но все же избыточный объем иногда он каждые несколько минут случайно вырезает несколько кадров, и я не совсем уверен, почему. Был бы признателен за любое понимание.
1 ответ на вопрос
0
tommy61157
Извините всех, кого я запутал, оказалось, что этот код верен (на самом деле, мне даже не нужна вторая команда, я могу просто передать ее напрямую в hls в nginx, без проблем с pi). Что происходит, так это то, что ffmpeg ДЕЙСТВИТЕЛЬНО не нравится принимать менее 7 FPS при выполнении такого рода потоковой передачи, которая по-прежнему достаточна для моих целей. Это должно быть честно задокументировано где-то (ну, я думаю, что сейчас, но все же).
Изменить: камера, которую я использую, также может повлиять на это, так как я только что понял, что некоторые из моих камер имеют минимальную частоту кадров 7.