Ich verwende FFmpeg, um Bilder aus Videos zu extrahieren, 1 Frame alle 6 Sekunden:
Normal command on Dos ( Windows 8 OS) > ffmpeg -i in.mkv -r 1/6 %4d.png
Dauert zu lange, da die Geschwindigkeit sehr niedrig ist, etwa 15–20.
Also benutzte ichskip_frame nokey
ffmpeg -skip_frame nokey -i "in.mkv" -vsync 0 -frame_pts true -r 1/6 %4d.png
Dies extrahiert mit höherer Geschwindigkeit, etwa 200 (zehnmal schneller).
Das Problem ist jedoch, dass viele Bilder übersprungen werden und ein Fehler auftritt:
Die Anwendung hat dem Multiplexer im Stream ungültige, nicht monoton zunehmende DTS bereitgestellt.
Also habe ich diesen Befehl verwendet:
ffmpeg -i in.mkv -vf "select='if(not(floor(mod(t,6)))*lt(ld(1),1),st(1,1)+st(2,n)+st(3,t));if(eq(ld(1),1)*lt(n,ld(2)+1),1,if(trunc(t-ld(3)),st(1,0)))'" -vsync 0 %4d.png
(Hier bereitgestellt -Wie erfasst man mit FFmpeg alle X Sekunden die ersten X-Frames in einem PNG?)
Dadurch erhalte ich eine Geschwindigkeit von 25–30.
Gibt es eine Möglichkeit, eine höhere Geschwindigkeit zu erreichen -skip_frame
?
Antwort1
Ok, der Code, den ich oben im Originalbeitrag gepostet habe, ist die einzige Lösung, die ich bisher für eine schnellere Bildextraktion gefunden habe. Manchmal erreicht er eine Geschwindigkeit von bis zu 50 %.
ffmpeg -i in.mkv -vf "select='if(not(floor(mod(t,6)))*lt(ld(1),1),st(1,1)+st(2,n)+st(3,t));if(eq(ld(1),1)*lt(n,ld(2)+1),1,if(trunc(t-ld(3)),st(1,0)))'" -vsync 0 %4d.png
Wenn Sie an einer zufälligen Bildextraktion (basierend auf Keyframes) interessiert sind, um eine höhere Geschwindigkeit zu erreichen, verwenden Sie -skip_frame nokey.