FFMPEG-Mosaikstottern

494
Draconis

BEARBEITEN: Plötzlich ist das Problem mit den gleichen Skripten auf der gleichen Hardware verschwunden. Ich bin immer noch neugierig auf die Ursache, aber bis ich sie noch einmal reproduzieren kann, gibt es nur wenige Diagnosemöglichkeiten. Entschuldigen Sie.

Ich verwende FFMPEG, um Live-Feeds von mehreren Webcams zu erhalten. Wenn die Feeds unabhängig sind (dh jeder v4l2Eingang läuft durch seine eigene Pipeline innerhalb des filter_complexeigenen xvAusgangs), funktioniert alles sehr gut: Es gibt etwa eine halbe Sekunde Verzögerung, mit der ich leben kann, und alle Videos laufen reibungslos .

Ich würde es vorziehen, diese Videos zusammen zu mosaikieren, sowohl für das Live-Ansehen als auch für die Kopie, die auf der Festplatte gespeichert wird. Wenn ich dies versuche, entweder mit einer Reihe von overlays oder mit hstack+ vstack, beginnt das Video zu stottern: Ein Feed läuft einige Sekunden lang ruhig, während die anderen still stehen, und ein anderer läuft ein paar Sekunden lang, während der erste einfriert, und so weiter. Das Video kommt immer noch in quasi-Echtzeit, daher ist es aus Sicherheitsgründen nicht furchtbar, aber das Folgen der Bewegung ist sehr schwierig.

Kann ich irgendetwas tun, um das Problem zu beheben oder zumindest das Stottern zu reduzieren? Ich würde gut mit einer niedrigeren Framerate auskommen, solange sie konstant ist.

Skript, das funktioniert:

ffmpeg \ -f lavfi -thread_queue_size 1024 -i color=s=$:c=000000 \ -f v4l2 -thread_queue_size 1024 -video_size $size -i $video_ne \ -f v4l2 -thread_queue_size 1024 -video_size $size -i $video_sw \ -f v4l2 -thread_queue_size 1024 -video_size $size -i $video_se \ -f alsa -thread_queue_size 1024 -i $audio1 \ -f alsa -thread_queue_size 1024 -i $audio2 \ -filter_complex " [0:v] fifo, setpts=PTS-STARTPTS [v0]; [1:v] fifo, setpts=PTS-STARTPTS [v1]; [2:v] fifo, setpts=PTS-STARTPTS [v2]; [3:v] fifo, setpts=PTS-STARTPTS [v3]" \ -map "[v0]" -f xv - \ -map "[v1]" -f xv - \ -map "[v2]" -f xv - \ -map "[v3]" -f xv -  

Skript, das nicht funktioniert:

ffmpeg \ -f lavfi -thread_queue_size 1024 -i color=s=$:c=000000 \ -f v4l2 -thread_queue_size 1024 -video_size $size -i $video_ne \ -f v4l2 -thread_queue_size 1024 -video_size $size -i $video_sw \ -f v4l2 -thread_queue_size 1024 -video_size $size -i $video_se \ -f alsa -thread_queue_size 1024 -i $audio1 \ -f alsa -thread_queue_size 1024 -i $audio2 \ -filter_complex " [0:v] fifo, setpts=PTS-STARTPTS [v0]; [1:v] fifo, setpts=PTS-STARTPTS [v1]; [2:v] fifo, setpts=PTS-STARTPTS [v2]; [3:v] fifo, setpts=PTS-STARTPTS [v3];  [v0][v1] hstack [tmp1]; [v2][v3] hstack [tmp2]; [tmp1][tmp2] vstack [vout]" -map "[vout]" -f sdl2 - 

(Ich verwende derzeit nur drei Videos, da ich vier CPU-Kerne habe.)

0
Was sagen Ihre CPU-Statistiken? Eugen Rieck vor 7 Jahren 0
Welchen Befehl verwenden Sie? Gyan vor 7 Jahren 0
... und die daraus resultierende Konsolenausgabe. LordNeckbeard vor 7 Jahren 0
@ Mulvya Veröffentlichte Skripte. Konsolenausgabe und CPU-Statistiken folgen. Draconis vor 7 Jahren 0
Verwenden Sie im Mosaikbefehl die Fifo-Filter nach den Setpts. Es ist nicht dieser Filter, der langsam läuft. Gyan vor 7 Jahren 0

0 Antworten auf die Frage