So fügen Sie mit ffmpeg absichtlich eine Verzögerung zu einem Eingabestream hinzu

So fügen Sie mit ffmpeg absichtlich eine Verzögerung zu einem Eingabestream hinzu

Ich habe einen Framegrabber, den ich an einen Windows-PC anschließe. Das Aufnahmeeingabegerät ist 1080p, 60fps, 4:4:4 Raw-Video. Ich möchte dies in einem Test-Setup verwenden, in dem ich einen Benutzer an einer vorhandenen Windows-Anwendung arbeiten lasse und Bildkomprimierung einführe, eine reduzierte Auflösung den Framerate-Abfall reduziert. Die Idee ist, etwas über die Benutzererfahrung herauszufinden und den Benutzer die verschiedenen Einstellungen bewerten zu lassen. Meine Idee ist, ffmpeg zu verwenden, um den RAW-Eingabestream zu nehmen und eine Verzögerung einzuführen, in MJPEG umzukodieren und verschiedene JPEG-Ebenen hinzuzufügen und eine Verzögerung hinzuzufügen. Obwohl ich bereits auf das Aufnahmegerät zugreifen, die Auflösung ändern und die Framerate reduzieren kann, bin ich mir nicht sicher, ob es überhaupt möglich ist, eine Verzögerung einzuführen, da die meisten Leute entweder eine Videoverzögerung einführen möchten, um eine Audioverzögerung auszugleichen, oder die Videoverzögerung reduzieren und nicht absichtlich eine Videoverzögerung hinzufügen möchten :-) So handhabe ich den Stream derzeit:

ffmpeg -f dshow -i video="framegrabber_capture_1" -vf format=yuv420p,scale=1280x1024,fps=5 -f sdl test

Als Randbemerkung: Ich benötige nur das reine Video, Audio wird im Testaufbau nicht benötigt.

Ich habe nicht herausgefunden, wie man in MJPEG transkodiert, aber ich denke, das ist machbar. Was ich überhaupt nicht finden konnte, waren Informationen zur Videoverzögerung, da dies auch bedeuten würde, dass der Stream irgendwo zwischengespeichert ist. Wäre toll, wenn mir jemand den richtigen Weg weisen könnte.

Danke!

J.

Antwort1

FFmpeg ist nicht für die Verzögerung der Videoanzeige konzipiert, da FFmpeg kein Videoplayer ist.

Wir können FFmpeg zwingen, das Video zu verzögern, indem wir ein kurzes Video vor das Video von der Kamera einfügen, indem wirVerkettungFilter.
Wir müssen auch hinzufügenEchtzeitFilter, um FFmpeg zu zwingen, die Ausgaberate an die Eingaberate anzupassen (ohne ihn sendet FFmpeg das Video so schnell wie möglich).

Bei der MJPEG-Kodierung können wir sie nicht verwenden. -f sdl testWir leiten den FFmpeg-Ausgang zur Anzeige des Videos an FFplay weiter.


Beispiel für die Verzögerung des aufgenommenen Videos um 5 Sekunden:

ffmpeg -an -f dshow -rtbufsize 1G -i video="framegrabber_capture_1" -filter_complex "color=white:size=1280x1024:rate=5:duration=5[w];[0:v]scale=1280x1024,setsar=1,fps=5[v0];[w][v0]concat,realtime=limit=10" -c:v mjpeg -pix_fmt yuvj420p -f mjpeg pipe: | ffplay pipe:


  • -rtbufsize 1G- Erhöhen Sie die Größe des Eingabepuffers auf 1 GByte (ermöglicht die Speicherung „vieler“ Eingabevideobilder).
  • color=white:size=1280x1024:rate=5:duration=5[w]- Erstellt ein synthetisches Weißvideo mit einer Dauer von 5 Sekunden und einer Rate von 5 Bildern pro Sekunde. Speichern in [w].
  • [0:v]scale=1280x1024,setsar=1,fps=5- Skalieren Sie das Eingangsvideo und stellen Sie die Bildrate ein. Speichern in [v0].
  • [w][v0]concat- Verketten Sie das 5-Sekunden-Weißvideo mit dem skalierten Eingabevideo (das 5-Sekunden-Weißvideo kommt zuerst).
  • realtime=limit=10- Verlangsamt die Ausgaberate auf die Eingaberate ( limit=10ist die Pausengrenze).
  • -c:v mjpeg -f mjpeg- Kodieren Sie das Ausgabevideo mit dem MJPEG-Codec und speichern Sie es im MJPEG-Containerformat.
  • pipe:- Verwenden Sie stdout als Ausgabe.
  • | ffplay pipe:Übergeben Sie die Stdout-Pipe von FFmpeg an die Stdin-Pipe von FFplay (als Eingabe verwendet).

Hinweis:
Die Verzögerung ist nicht genau, da eine zusätzliche integrierte Verzögerung vorhanden ist.

Wir können (versuchen) die Genauigkeit der Verzögerung durch eine höhere Bildrate zu verbessern und setpts=0dem FFplay-Befehl Folgendes hinzuzufügen:

ffmpeg -an -f dshow -rtbufsize 1G -i video="Microsoft® LifeCam HD-3000" -filter_complex "color=white:size=1280x1024:rate=25:duration=5[w];[0:v]scale=1280x1024,setsar=1,fps=25[v0];[w][v0]concat,realtime=limit=10" -c:v mjpeg -pix_fmt yuvj420p -f mjpeg pipe: | ffplay -vf setpts=0 pipe:

verwandte Informationen