präzises Schneiden von Video (+ Audio) mit ffmpeg

präzises Schneiden von Video (+ Audio) mit ffmpeg

Ich möchte, dass Benutzer auf meiner Website aus einem von mir bereitgestellten Quellvideo präzise eigene Clips erstellen können.

Ich habe eine Quellvideodatei, die ich zunächst in etwas für eine Website geeignetes konvertieren möchte:

Input #0, matroska,webm, from 'source.mkv': 
Duration: 00:28:18.57, start: 0.000000, bitrate: 10183 kb/s 
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 48 tbc (default)
Stream #0:1: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s (default)

Ich verwende ffmpeg, um es wie folgt zu konvertieren:

ffmpeg -i source.mkv -c:v libx264 -c:a aac -strict experimental -vf scale="960:-1" source.mp4

Beim erneuten Ansehen dieses Videos ist die Qualität und die Dateigröße für meine Zwecke ausreichend gut und es kann auf meiner Website geladen/abgespielt werden.

Ich habe eine Webseite, auf der Benutzer einen Start- und Endpunkt für dieses Video auswählen und einen Clip erstellen können. Hier ist ein Beispiel für den ffmpeg-Befehl, den ich dafür verwende:

-ss 577.920 -i source.mp4 -t 011.980 -codec:v copy -codec:a copy -vf scale="960:-1" clip1.mp4

Das Problem ist, dass der Clip nicht immer zeitgenau genug ist. Normalerweise ist der Ton genau genug, aber das Video stoppt ungefähr eine halbe Sekunde zu früh.

Gibt es eine Möglichkeit, dies auf, sagen wir, 0,2 Sekunden genau und synchron zu machen?

EDIT: Hinzufügen -force_key_frames 00:00:00.2hat nicht geholfen.

BEARBEITEN: Ich habe den zu verwendenden Ausschnitt -c:v libx264 -c:a aac -strict experimentalanstelle von geändert -codec:v copy -codec:a copy, mit (ziemlich) guten Ergebnissen.

Die Datei kann extern problemlos abgespielt werden – aber wenn ich sie in mein HTML5-Videoelement lade und abspiele, friert der letzte Teil des Videos (Audio ist in Ordnung) ein. Der letzte Teil, der einfriert, ist weniger als eine Sekunde lang.

Soll ich es mit einem anderen Video-Encoder versuchen? Was ist die beste Alternative für libx264? Dabei muss ich bedenken, dass ich dies wahrscheinlich auf einer öffentlichen Website haben möchte.

Aber Moment mal, deutet die Tatsache, dass es mit einem Player wie MPC oder Windows Media Player problemlos abgespielt wird, nicht darauf hin, dass es sich entweder um ein Problem mit Google Chrome oder dem HTML-Videoelement handelt? Oder verwende ich eine nicht unterstützte Kodierung oder so etwas?

Antwort1

Das Verhalten von -ssändert sich, je nachdem, ob es als Eingabe- oder Ausgabeoption verwendet wird, und ist oft langsamer, kann aber genauer sein, wenn es als Ausgabeoption verwendet wird. Siehe die Antwort aufffmpeg konvertiert Videos aus einem bestimmten Zeitraum langsamfür weitere Einzelheiten und Beispiele.

Um die Ausgabequalität zu ändern, source.mp4verwenden Sie die -crfOption mit einem Wert zwischen 18 und 28 (23 ist Standard). Siehe den CRF-Abschnitt desFFmpeg- und x264-Kodierungshandbuchzum Beispiel.

Ihr Trimmbefehl kann vereinfacht werden:

ffmpeg -ss 577.92 -i source.mp4 -ss 0 -t 11.98 -c copy -map 0 clip1.mp4

Ich habe -codec:v copy -codec:a copydurch ersetzt -c copy -map 0. Dadurch werden alle Streams kopiert, statt nur die ersten Video- und Audio-Streams – obwohl der Eingang aufgrund Ihres vorherigen Befehls nur zwei Streams hat. Da Sie nicht ohne Neucodierung skalieren können, was sich daher mit gegenseitig ausschließt -codec:v copy, und da Ihr Eingang bereits auf die eingestellte Größe skaliert ist, habe ich die Filteroptionen entfernt.

Wenn es immer noch nicht genau genug ist, versuchen Sie:

ffmpeg -i source.mp4 -ss 577.92 -t 11.98 -c copy -map 0 clip1.mp4

Es wird langsamer sein, aber wahrscheinlich genauer. Eine Beschreibung der Unterschiede zwischen diesen beiden Beispielen finden Sie in den Links in der Antwort im ersten Link, den ich bereitgestellt habe.

Zuletzt sollten Sie (befindet sich im Tools-Verzeichnis der ffmpeg-Quelle) ausführen oder die Option verwenden source.mp4. Dadurch werden einige Daten an den Anfang der Datei verschoben, sodass die Wiedergabe beginnen kann, bevor sie vollständig heruntergeladen ist.qt-faststart-movflags faststart

verwandte Informationen