Ich möchte ein großes AVI-Video in zwei kleinere aufeinanderfolgende Videos aufteilen. Ich benutze ffmpeg.
Eine Möglichkeit besteht darin, ffmpeg zweimal auszuführen:
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 output1.avi
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi
Laut manpage von ffmpeg kann ich jedoch aus nur einer Zeile mehr als eine Ausgabedatei aus einer Eingabedatei erstellen :
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 output1.avi \
-vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi
Meine Frage ist, spart der spätere Ansatz Rechenzeit und Speicher?
htop
) und sagst uns, was die Antwort ist?-ss
als Eingabeoption in der zweiten Aufteilung ist möglicherweise nicht korrekt, sodass Sie möglicherweise keine saubere Aufteilung erhalten. IMO ist das Beispiel von OP korrekter.Antworten:
Das ffmpeg-Wiki verweist auf diese Seite und verweist auf "So teilen Sie Videos effizient". Ich bin nicht davon überzeugt, dass diese Seite diese Frage beantwortet, also habe ich getan, wie @AlcubierreDrive vorgeschlagen hat…
Welche Ausgänge ...
Ich habe eine SD- und HD-Datei nach ein paar Läufen und ein wenig Mathe getestet.
SD-Datei = 1,35 GB DVB-Transportstrom
HD-Datei = 3,14 GB DVB-Transportstrom
Fazit
Der einzelne Befehl ist besser, wenn Sie mit HD arbeiten. Er stimmt mit den Kommentaren in den Handbüchern zur Verwendung von -ss nach der Eingabedatei überein, um eine langsame Suche durchzuführen. SD-Dateien haben einen vernachlässigbaren Unterschied.
Die Version mit zwei Befehlen sollte schneller sein, indem vor der Eingabedatei ein weiteres -ss für die 'schnelle Suche' hinzugefügt wird, gefolgt von der genaueren langsamen Suche.
quelle
-q:v 0
.Hier ist ein nützliches Skript, mit dem Sie automatisch teilen können: Ein Skript zum Teilen von Videos mit ffmpeg
quelle
Verwenden Sie meiner Erfahrung nach ffmpeg nicht zum Teilen / Verbinden. MP4Box ist schneller und leichter als ffmpeg. Versuch es bitte. Wenn Sie beispielsweise eine 1400-MB-MP4-Datei in zwei Teile und 700-MB-
MP4Box -splits 716800 input.mp4
Dateien aufteilen möchten, können Sie die folgende Cmdl verwenden: Zum Beispiel zum Verketten von zwei Dateien, die Sie verwenden können:Oder wenn Sie nach Zeit aufgeteilt werden müssen, verwenden Sie
-splitx StartTime:EndTime
:MP4Box -add input.mp4 -splitx 0:15 -new split.mp4
quelle
EndTime
als-t
.http://ffmpeg.org/trac/ffmpeg/wiki/Seeking%20with%20FFmpeg kann auch für Sie nützlich sein. Außerdem hat ffmpeg einen Segment-Muxer, der möglicherweise funktioniert.
Ich vermute jedenfalls, dass das Kombinieren zu einem Befehl Zeit sparen würde.
quelle
Es gibt keinen großen Unterschied zwischen den beiden von Ihnen angegebenen Beispielen. Das erste Beispiel schneidet das Video nacheinander in zwei Schritten, während das zweite Beispiel dies gleichzeitig tut (mithilfe von Threads). Es ist keine besondere Beschleunigung erkennbar. Weitere Informationen zum Erstellen mehrerer Ausgänge mit FFmpeg finden Sie hier
Darüber hinaus können Sie (in den letzten FFmpeg) den Stream-Segmenter-Muxer verwenden, der:
quelle
Hier ist eine einfache Windows-Bat-Datei, mit der eingehende Dateien in 50 Teile aufgeteilt werden können. Jeder Teil hat eine Länge von 1 Minute. Entschuldigung für solch ein dummes Skript. Ich hoffe, es ist besser, ein dummes Windows-Skript zu haben, als es überhaupt nicht zu haben. Vielleicht hilft es jemandem. (Basierend auf "bat file for loop" von dieser Seite.)
quelle
ffmpeg
Befehle), das als Schleife umgeschrieben wurde. Dies beantwortet nicht die Frage, ob dieser Ansatz oder ein einzelner Befehl "Rechenzeit und Speicher spart".Hat es nicht getestet, aber das sieht vielversprechend aus:
Grundlegender Stream-Segmentierer
Es ist offensichtlich, dass AVI in Segmente gleicher Größe aufgeteilt wird, was bedeutet, dass diese Blöcke nicht an Qualität verlieren oder den Speicher erhöhen oder neu berechnet werden müssen.
Es wird auch die Codec-Kopie verwendet. Bedeutet dies, dass sehr große Streams verarbeitet werden können? Da dies mein Problem ist, möchte ich meine AVI aufteilen, damit ich einen Filter verwenden kann, um die Verzerrung zu beseitigen. Aber eine ganze Luftfahrt läuft stundenlang.
quelle
Hier ist eine perfekte Möglichkeit, das Video zu teilen. Ich habe es schon einmal gemacht und es funktioniert gut für mich.
ffmpeg -i C:\xampp\htdocs\videoCutting\movie.mp4 -ss 00:00:00 -t 00:00:05 -async 1 C:\xampp\htdocs\videoCutting\SampleVideoNew.mp4
(Für cmd).shell_exec('ffmpeg -i C:\xampp\htdocs\videoCutting\movie.mp4 -ss 00:00:00 -t 00:00:05 -async 1 C:\xampp\htdocs\videoCutting\SampleVideoNew.mp4')
(für PHP).Bitte folgen Sie diesem und ich bin sicher, dass es perfekt funktionieren wird.
quelle
-i
gefolgt von-ss
und-t
. Die Frage ist jedoch, wie mehrere Segmente effizient aus derselben Eingabedatei extrahiert werden können, während Sie nur ein einzelnes Segment extrahieren. Ich sehe nicht, wie dies die Frage beantwortet.Eine einfache Möglichkeit besteht darin, die Trimmoption mit einer auf URLs basierenden API zu verwenden .
Sobald Sie Ihr Video hochgeladen haben, setzen Sie einfach den Startversatz und den Endversatz in der URL (so_2, eo_2) wie folgt:
Dadurch werden ab der 2. Sekunde und 2 Sekunden sofort neue Videos erstellt. Sie können Videos auf diese Weise teilen, wie Sie möchten.
quelle
ffmpeg
. Wenn Sie nicht über eine sehr, sehr schnelle Internetverbindung verfügen, wird das Verarbeiten des gesamten Videos in einen Cloud-Dienst und das anschließende Herunterladen der Ergebnisse die Verarbeitungszeit erheblich verlängern. Dies beantwortet jedoch immer noch nicht die Frage, welcher Ansatz mitffmpeg
effizienter ist.