Streaming-Video von einem Bild mit FFMPEG unter Windows

8

Ich habe ein Programm geschrieben, das eine Kamera simuliert und die Ausgabe in einen Videostream umwandelt. Das Programm muss unter Windows laufen können. Es gibt zwei Komponenten im System:

  1. Kamerasimulator. Ein C ++ Programm, das die Kamera simuliert. Es kopiert einen vorgenerierten Frame (d. H. PNG-Datei) alle 0,1 Sekunden mit dem Befehl% comm_de% auf einen Zielpfad copy
  2. Videostream. Mit FFmpeg wird ein Videostream aus den kopierten Bildern erstellt. FFmpeg wird mit dem folgenden Befehl ausgeführt: %Code%

Wenn das Ganze zusammen läuft, funktioniert es für ein paar Sekunden, bis der ffmpeg anhält. Hier ist ein Protokoll, während es im Debug-Modus läuft:

%Vor%

Mir scheint, es gibt eine Art von Kollision zwischen dem Lesen und Schreiben von / aus der gleichen Datei. Interessant ist auch, dass das Programm unter Linux (beim Ersetzen von ./target/target_image.png durch ffmpeg -loop 1 -i ./target/target_image.png -r 10 -vcodec mpeg4 -f mpegts udp://127.0.0.1:1234 ) problemlos funktioniert.

Kann jemand vorschlagen, dieses Problem zu lösen? Alternativlösungen sind ebenfalls akzeptabel, solange der logische Workflow gleich bleibt.

    
Daniel Zohar 16.05.2013, 06:32
quelle

2 Antworten

3

Nach Nick van Tilborgs Kommentar habe ich FFmpeg's image2pipe benutzt. Mit dieser Funktion können die Bilddaten in FFmpeg optimiert werden, anstatt dass zwei Prozesse gleichzeitig auf dieselbe Datei zugreifen.

Unten ist der C ++ Code, den ich geschrieben habe. Es ist vielleicht nicht vollständig optimiert, aber es macht den Job. Es wurde mit Visual Studio 2012 unter Windows 7 kompiliert und getestet.

%Vor%     
Daniel Zohar 26.05.2013, 19:04
quelle
2

FFmpeg läuft mit der aktuellen Befehlszeile mit der höchstmöglichen Geschwindigkeit. Das bedeutet, FFmpeg liest die Bilder nicht bei 10 fps, sondern so schnell wie möglich. Es überträgt den Transportstrom auch nicht mit 10 fps. Da Ihr Programm feste Frames mit 10 fps schreibt, ist dies der Grund, warum Sie Ihre Datei wahrscheinlich nicht lesen können, da die Datei zu diesen bestimmten Zeiten geschrieben wird.

Um dies zu lösen, versuchen Sie, das Flag -re in Ihrer FFmpeg-Befehlszeile zu verwenden, um FFmpeg zu zwingen, die Eingabe mit der systemeigenen Framerate zu lesen.

ffmpeg -re -loop 1 -i ./target/target_image.png -r 10 -vcodec mpeg4 -f mpegts udp://127.0.0.1:1234

    
Nick van Tilborg 16.05.2013 07:02
quelle

Tags und Links