In der Open Source- oder aktiven Entwickler-Community besteht häufig die Notwendigkeit, große Videosegmente online zu veröffentlichen. (Meet-up-Videos, Campouts, Technikgespräche ...) Da ich ein Entwickler und kein Videofilmer bin, habe ich keine Lust, die zusätzlichen Kratzer auf einem Premium-Vimeo-Konto herauszuschleudern. Wie nehme ich dann ein 12,5 GB (1:20:00) großes MPEG-Tech-Talk-Video und schneide es in 00:10:00 Segmente, um es einfach auf Videoplattformen hochzuladen?
ffmpeg
video-editing
Gabriel
quelle
quelle
Antworten:
Es wäre nicht schwer, dies in ein Skript zu packen, um es in einer Schleife zu tun.
Wenn Sie versuchen, die Anzahl der Iterationen auf der Grundlage der von einem
ffprobe
Aufruf ausgegebenen Dauer zu berechnen , wird dies aus der durchschnittlichen Bitrate am Anfang des Clips und der Dateigröße des Clips geschätzt, es sei denn, Sie geben das-count_frames
Argument an, das seine Operation erheblich verlangsamt .Eine andere Sache zu beachten ist , dass die Position der
-ss
Option auf die Kommandozeile Angelegenheiten . Wo ich es jetzt habe, ist langsam aber genau. Die erste Version dieser Antwort ergab die schnelle, aber ungenaue Alternative. Der verlinkte Artikel beschreibt auch eine meist schnelle, aber dennoch genaue Alternative, die Sie mit ein wenig Aufwand bezahlen.Abgesehen davon denke ich nicht, dass Sie wirklich genau 10 Minuten für jeden Clip schneiden möchten. Das wird Schnitte genau in die Mitte von Sätzen setzen, sogar Wörter. Ich denke, Sie sollten einen Video-Editor oder -Player verwenden, um natürliche Schnittpunkte zu finden, die nur 10 Minuten voneinander entfernt sind.
Angenommen, deine Datei hat ein Format, das YouTube direkt akzeptieren kann, dann musst du nicht neu codieren, um Segmente zu erhalten.
ffmpeg
Übergeben Sie einfach die natürlichen Schnittpunkt-Offsets an , und weisen Sie sie an, die codierten A / V-Dateien mit dem Codec "copy" unberührt weiterzuleiten:Das
-c copy
Argument weist es an, alle Eingabestreams (Audio, Video und möglicherweise andere, z. B. Untertitel) unverändert in die Ausgabe zu kopieren. Für einfache A / V-Programme entspricht dies den ausführlicheren Flags-c:v copy -c:a copy
oder den Flags im alten Stil-vcodec copy -acodec copy
. Sie würden den ausführlicheren Stil verwenden, wenn Sie nur einen der Streams kopieren, aber den anderen neu codieren möchten. Vor vielen Jahren gab es beispielsweise bei QuickTime-Dateien die gängige Praxis, das Video mit H.264-Video zu komprimieren, das Audio jedoch als unkomprimiertes PCM zu belassen . Wenn Sie heute auf eine solche Datei gestoßen sind, können Sie sie so modernisieren-c:v copy -c:a aac
, dass nur der Audiostream erneut verarbeitet wird und das Video unberührt bleibt.Der Startpunkt für jeden Befehl über dem ersten ist der Startpunkt des vorherigen Befehls plus der Dauer des vorherigen Befehls.
quelle
ffmpeg
zur Aufrechterhaltung der Synchronisation zwischen Audio- und Videostream möglicherweise nicht in der Quelldatei vorhanden sind. In diesem Fall gibt es kompliziertere Aufteilungsmethoden, mit denen Sie das Problem umgehen können.Hier ist die einzeilige Lösung :
Bitte beachten Sie, dass dies keine genauen Aufteilungen ergibt, sondern Ihren Anforderungen entsprechen sollte. Es wird stattdessen beim ersten Frame nach der angegebenen Zeit abgeschnitten
segment_time
, im obigen Code nach der 20-Minuten-Marke.Wenn Sie feststellen, dass nur der erste Block wiedergegeben werden kann, fügen Sie ihn
-reset_timestamps 1
wie in den Kommentaren beschrieben hinzu.quelle
-reset_timestamps 1
das Problem für mich behebtWir hatten früher das gleiche Problem und stellten ein einfaches Python-Skript zusammen, um genau das zu erreichen (mit FFMpeg). Verfügbar hier: https://github.com/c0decracker/video-splitter und eingefügt unten:
quelle
Wenn Sie wirklich dieselben Chunks erstellen möchten, müssen Sie ffmpeg zwingen, einen i-Frame auf dem ersten Frame jedes Chunks zu erstellen, damit Sie diesen Befehl zum Erstellen eines 0,5-Sekunden-Chunks verwenden können.
quelle
Eine Alternative mehr lesbar Weg wäre,
Hier ist die Quelle und Liste der am häufigsten verwendeten FFmpeg-Befehle.
quelle
Beachten Sie, dass die genaue Zeichensetzung des alternativen Formats lautet
-ss mm:ss.xxx
. Ich kämpfte stundenlang darum, das Intuitive-aber-Falsche nutzlos zu gebrauchenmm:ss:xx
.Referenzen hier und hier .
quelle
quelle
Verwenden Sie einfach das, was in ffmpeg integriert ist, um genau dies zu tun.
Dadurch wird es in ca. 2 Sekunden lange Spannfutter aufgeteilt, an den relevanten Keyframes aufgeteilt und in die Dateien cam_out_h2640001.mp4, cam_out_h2640002.mp4 usw. ausgegeben.
quelle