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:
copy
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.
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%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