Kann ich Videos für bestimmte Bildnummern schneiden, anstatt Parameter zu verwenden -ss
und zu -to
suchen, die nicht sehr genau erscheinen? Beispielsweise;
ffmpeg -i video.webm -startingframe 80 -endingframe 560 output.webm
[80. Rahmen und 560. Rahmen enthalten. Insgesamt macht es also (560 - 80 +1) Frames.]
Nach den Antworten und ein bisschen suchen, habe ich einige Befehle ausprobiert. Aber bisher konnte ich keinen akzeptablen Weg finden.
Wenn jemand den Videostream zwischen 250 und 750 Frames schneiden möchte, ist dies der richtige Weg. Es werden 501 Frames ausgegeben:
Hinweis: movie.mp4 hat 25 fps und eine Audio-Samplerate von 48k
ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm
Wie erwartet ist die Ausgabe genau 20 Sekunden lang.
Verwenden Sie für Audio dieselbe Methode:
ffmpeg -i movie.mp4 -vn -af "aselect=between(n\,480\,1440),setpts=PTS-STARTPTS" a_stream.webm
Unerwartet hat dieser eine sehr schlechte Genauigkeit. Es hätte mir 960001 (960k + 1) Samples geben sollen, die 20 Sekunden Audio entsprechen. Stattdessen war die Ausgabe 20,505 Sekunden lang und enthielt 984240 Samples. Wenn ich die Dauer verlängere, erhöht sich auch der Fehler.
Dann habe ich versucht, -ss -to-Parameter zum Schneiden von Audio-Streams zu verwenden:
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm
Der alte klassische Weg funktioniert viel besser. Die Ausgabe dauerte 20.003 Sekunden und enthielt 960144 Samples. Wenn Sie die Dauer erhöhen, erhöht sich der Fehler nicht. Der Fehler ist konstant. Die Eingabedatei enthält immer 144 Stichproben.
Zusammenfassend lässt sich sagen, dass
select
Filter die meiste Zeit gut funktionieren, eine Auswahl jedoch nicht. Die klassischen -ss
Parameter funktionieren besser für Audio, sind aber nicht samplegenau. Es ist auch nicht möglich, -vf select
und -ss
-Parameter zusammen zu verwenden, da dies -ss
sowohl Audio- als auch Videostreams beeinflusst, während wir möchten, dass nur Audio betroffen ist.
Um eine Mediendatei präzise zu schneiden, muss ich diese drei Schritte ausführen:
ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm
ffmpeg -i v_stream.webm -i a_stream.webm -c:v copy -c:a copy movie-between_10th_and 20th_seconds.webm
Dies ergibt die genauesten Ergebnisse. Das Video ist 20.000 Sekunden lang und rahmengenau. Audio ist 20.003 Sekunden lang und enthält 960144 Samples. Stimmt nicht genau mit dem Videostream überein, ist aber OK. Es gibt nur 144 Probenüberschuss. Der größte Nachteil ist, dass ich immer dann, wenn ich eine Datei ausschneiden möchte, drei Befehle für einen einfachen Job senden muss. Dabei werden zwei unnötige Dateien erstellt: a_stream.webm und v_stream.webm. Und der select
Filter funktioniert nicht bei einigen Eingabedateien, die ich ausprobiert habe. Es erledigt den Job erfolgreich (?), Stoppt jedoch nie den Codierungsprozess, sodass ich jedes Mal die Eingabeaufforderung schließen muss.
select
und aselect
filtert für Video- und Audio - Streams. Select
ist für Videos bildgenau, aber aselect
nicht samplegenau. Eigentlich ist es alles andere als genau. Es gibt viel schlechtere Ergebnisse als die Verwendung der einfachen -ss
-to
Parameter. Aus diesem Grund verwende ich derzeit eine Kombination aus select
Filter und -ss
-to
Parametern, um ein möglichst genaues Schneiden zu erzielen. Aber es ist ein schmutziger Weg, es zu tun. Bitte schauen Sie sich meinen ersten Beitrag an, ich habe einige Kommandozeilen und deren Ergebnisse hinzugefügt