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.
-ss
bildgenau ist (siehe hier ). Hast du eigentlich variable fps eingabe? Meine Antwort verlinkt auf den Mailinglisten-Thread, in dem mithilfe vonselect
Filtern erwähnt wird , wo Sie die Frame-Nummer angeben können. Hast du das versucht?select
undaselect
filtert für Video- und Audio - Streams.Select
ist für Videos bildgenau, aberaselect
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 ausselect
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ügtAntworten:
Audio kommt aus Sekunden, nicht aus Frames. Wenn Sie also ein Video schneiden möchten, müssen Sie Video-FPS × 20 Sekunden wie folgt berechnen: 20 Sekunden mit 23,97 FPS = 479,4
Das Ausschneiden von Frames ist nicht genau, da Sie in der letzten Sekunde keine vollen Bilder pro Sekunde erhalten, sodass der Ton mehr Sekunden oder nur eine halbe Sekunde oder ein bisschen mehr oder weniger erhält! Vielleicht solltest du Sekunden anstelle von Frames verwenden, um einen exakten Schnitt zu erhalten. Sag dem ffmpeg, dass er das für dich tun soll. Und wenn Sie 1 zusätzlichen Frame erhalten, wie wäre es, den 250. und 750. Frame in den 250. und 749. Frame zu ändern ?! Verwenden Sie dort minus 1, um immer zu ermitteln, nach wie vielen Frames Sie fragen!
quelle