В настоящее время я отправляю поток RTMP на nginx 1.15.3, работающий на Ubuntu 18.04 LTS, с камеры Raspberry Pi 3 (которая, кажется, работает хорошо сама по себе, я могу получить поток без проблем на VLC и убедиться, что он работает ) с пи с помощью этой команды:
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 и не включить аргумент framerate в ffmpeg, то это сделайте видео на несколько секунд, а затем запустите на 5 раз больше скорости видео на секунду, так как ffmpeg все еще пытается запустить видео с частотой 25 кадров в секунду.
Ввод аргумента framerate в команду преобразования ffmpeg, кажется, делает ситуацию еще хуже, и я не понимаю, почему это не работает, так как кажется, что это отлично работает для многих других людей. В основном я использовал это руководство, чтобы попытаться помочь мне в настройке nginx и еще чего-то такого: https://docs.peer5.com/guides/setting-up-hls-live-streaming-server-using-nginx/#4 -pushing-жить-поток-на-Nginx-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";
}
}
}
}
Если мне нужно добавить какие-либо подробности, не стесняйтесь, дайте мне знать, мне просто нужно, чтобы это работало должным образом вместо всех вопросов, которые я только что объяснил, любая помощь будет оценена, спасибо.
Редактировать 1: Я также замечаю, что поверх зацепок и вырезов из потока, используя вторую команду, как описано ранее, иногда кажется, что она "застревает" в определенном кадре, не уверенный, является ли это более полезным или нет Я просто хотел убедиться, что у меня есть вся информация, которую я могу найти здесь.
Редактировать 2: Я начинаю верить, что это больше проблема с nginx, потому что, когда я указываю первую команду на местоположение /show1 /stream1, которое преобразует rtmp в hls, не выполняя вторую команду, которую я счел абсолютно необходимой, я Я получаю точно такой же вопрос точно так же. Я не знаю много о nginx, и ничто из того, что я нахожу в Интернете, тоже не сильно помогает. Буду очень признателен за понимание, я знаю, что hls всегда будет иметь большую задержку, и это не то, что я прошу исправить, я прошу исправить вырезы и сцепление.
Редактировать 3: Я, возможно, на самом деле несколько взломал это, я заметил по команде raspivid, что установка битрейта, казалось, действительно смягчает это, однако, даже если я установил битрейт на абсурдный или даже не настолько абсурдный, но все же избыточный объем иногда он каждые несколько минут случайно вырезает несколько кадров, и я не совсем уверен, почему. Был бы признателен за любое понимание.