Videos mit dem Filter ffmpeg select bildgenau schneiden

16

Kann ich Videos für bestimmte Bildnummern schneiden, anstatt Parameter zu verwenden -ssund zu -tosuchen, 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 selectFilter die meiste Zeit gut funktionieren, eine Auswahl jedoch nicht. Die klassischen -ssParameter funktionieren besser für Audio, sind aber nicht samplegenau. Es ist auch nicht möglich, -vf selectund -ss-Parameter zusammen zu verwenden, da dies -sssowohl 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 selectFilter 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.

destor
quelle
Ich habe diese Seite gelesen, bevor ich diese Frage gestellt habe. Diese Seite hat mir nicht geholfen. Wenn ein Eingang variable fps hat, können wir dann einfach mit dieser Gleichung rechnen? Ich glaube nicht. Ich glaube auch immer noch nicht, dass '-ss' mir die genaue Position angibt. Bild für Bild wäre besser, denke ich.
Destor
Beachten Sie, dass dies -ssbildgenau ist (siehe hier ). Hast du eigentlich variable fps eingabe? Meine Antwort verlinkt auf den Mailinglisten-Thread, in dem mithilfe von selectFiltern erwähnt wird , wo Sie die Frame-Nummer angeben können. Hast du das versucht?
Slhck
Ich habe versucht , mit selectund aselectfiltert für Video- und Audio - Streams. Selectist für Videos bildgenau, aber aselectnicht samplegenau. Eigentlich ist es alles andere als genau. Es gibt viel schlechtere Ergebnisse als die Verwendung der einfachen -ss -toParameter. Aus diesem Grund verwende ich derzeit eine Kombination aus selectFilter und -ss -toParametern, 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
destor
ffmpeg version?
fie
Warum versuchst du sowieso, durch eine Rahmennummer zu schneiden? Wenn man diese Genauigkeit braucht, warum nicht Avidemux verwenden? Vielleicht liegen Ihre ursprünglichen Probleme auch daran, dass der nächstgelegene Keyframe ausgewählt wird?
fie

Antworten:

3

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!

Mojtaba Golestani
quelle
Eigentlich kommt Audio aus Samples, nicht Sekunden ...
Anubioz