RTMP-zu-HLS-Konvertierungsframerate Probleme mit ffmpeg / nginx

1059
tommy61157

Derzeit drücke ich einen RTMP-Stream auf Nginx 1.15.3, der auf Ubuntu 18.04 LTS von einer Himbeer-pi-3-Kamera läuft (die anscheinend gut funktioniert, ich kann den Stream ohne Probleme mit VLC ziehen und überprüfen, ob er funktioniert ) mit dem pi mit diesem Befehl:

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 

Wenn ich das fps-Argument auf raspivid auf 25 setzen und dann das ffmpeg-Framerate-Argument loswerden würde, dann würde dies alles gut in einen HLS-Stream übersetzt, wobei dieser Befehl auf dem nginx-Server ausgeführt wird:

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 

Ich brauche es jedoch bei der niedrigeren Framerate und es scheint, als würde man versuchen, dies in irgendeiner Weise wirklich zu stören, weil es den Stream dazu bringen wird, den Ladevorgang zu stoppen. Ich vermute, es hat etwas damit zu tun, dass ffmpeg eine Standard-Framerate von 25 oder etwas anderes hat, denn wenn ich im RTMP-Stream versuchen würde, nur das fps-Argument in raspivid auf 5 zu setzen und nicht das framerate-Argument in ffmpeg einzuschließen, dann würde es das tun Machen Sie das Video für ein paar Sekunden und lassen Sie es dann für eine Sekunde mit der fünffachen Geschwindigkeit des Videos laufen, da ffmpeg scheinbar immer noch versucht, ein 25-fps-Video auszuführen.

Die Verwendung des Framerate-Arguments in den ffmpeg-Konvertierungsbefehl scheint die Dinge noch schlimmer zu machen. Ich verstehe nicht, warum dies nicht funktioniert, da es für so viele andere Leute gut funktioniert. Ich habe diesen Leitfaden hauptsächlich verwendet, um zu versuchen, mir bei der Einrichtung von nginx und whatnot zu helfen: https://docs.peer5.com/guides/setting-up-hls-live-streaming-server-using-nginx/#4 -pushing-live-stream-to-nginx-using-rtmp

Ich werde auch meine nginx.conf hier für alle anzeigen und beachten, dass ich dieses Problem immer dann habe, wenn ich versuche, das Video über eine Webseite hochzuladen oder mit VLC den Netzwerk-Stream direkt abzurufen:

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"; } } } } 

Wenn Sie weitere Details hinzufügen müssen, zögern Sie nicht, mich zu informieren. Ich muss nur das Funktionieren an Stelle der Probleme, die ich gerade erklärt habe, durchführen lassen. Jede Hilfe wird dankbar sein.

Edit 1: Ich stelle auch fest, dass mit dem zweiten Befehl, wie oben beschrieben, über den Pannen und Ausschnitten des Streams ein "Frame" hängen bleibt, nicht sicher, ob dies hilfreicher ist oder nicht, wollte nur sicherstellen, dass ich alle Informationen habe, die ich hier habe.

Edit 2: Ich fange an zu glauben, dass dies eher ein Problem mit nginx ist, denn wenn ich den ersten Befehl auf die Position / show1 / stream1 verweise, wird das rtmp in hls konvertiert, ohne dass der zweite Befehl ausgeführt wird, den ich für absolut notwendig hielt Ich bekomme genau das gleiche Problem. Ich weiß nicht viel über Nginx und nichts, was ich online finde, hilft auch sehr. Ich würde mich sehr über die Einsicht freuen. Ich weiß, dass die hls immer eine große Verzögerung haben wird, und das ist nicht das, was ich korrigieren möchte. Ich möchte die Ausschnitte und das Problem beheben.

Edit 3: Ich habe das tatsächlich etwas geknackt, ich bemerkte beim raspivid-Befehl, dass die Bitrate höher zu sein schien, dies jedoch zu mildern, auch wenn ich die Bitrate auf eine absurde oder gar nicht so absurde, aber dennoch übertriebene Menge eingestellt habe Es werden gelegentlich alle paar Minuten ein paar Bilder zufällig ausgeschnitten, und ich bin mir nicht ganz sicher, warum. Würde mich über einen Einblick freuen.

0

1 Antwort auf die Frage

0
tommy61157

Sorry an alle, die ich verwirrt habe, es stellt sich heraus, dass dieser Code korrekt ist (eigentlich brauche ich nicht einmal den zweiten Befehl, ich kann ihn einfach direkt an die hls in nginx übergeben, kein Problem aus dem pi). Was passiert, ist, dass ffmpeg WIRKLICH nicht gerne weniger als 7 FPS bei diesem Streaming-Verfahren, das für meine Zwecke immer noch ausreichend ist, aufnimmt. Das sollte ehrlich irgendwo dokumentiert werden (naja, ich denke mal es ist jetzt aber immer noch).

Bearbeiten: Die Kamera, die ich verwende, kann sich auch auf die Kamera auswirken, da mir gerade klar wurde, dass einige meiner Kameras eine Mindestbildrate von 7 haben.