Ich möchte 2 Videos mit ffmpeg verketten. Ich benutze:
ffmpeg -i output1.mp4 -scodec copy -vbsf h264_mp4toannexb i0.ts
Aber die mp4-Datei, die ich bekomme, sieht viel schlechter aus als die Quelldatei.
Hier finden Sie Informationen zu beiden Dateien
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output1.mp4':
Metadata:
major_brand : isom
minor_version : 1
compatible_brands: isom
creation_time : 2013-06-13 15:40:36
Duration: 00:00:15.72, start: 0.000000, bitrate: 2053 kb/s
Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720, 1931 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc
Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 128 kb/s
Input #0, mpegts, from 'i0.ts':
Duration: 00:00:15.64, start: 1.400000, bitrate: 1382 kb/s
Program 1
Metadata:
service_name : Service01
service_provider: Libav
Stream #0.0[0x100]: Video: mpeg2video (Main), yuv420p, 1280x720 [PAR 1:1 DAR 16:9], 104857 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0.1[0x101](und): Audio: mp2, 44100 Hz, stereo, s16, 128 kb/s
Wie kann ich dieses Problem lösen?
output1.mp4
und eine Ausgabei0.ts
. Bei der Codierung in denmpeg2video
Ausgabecontainer wird standardmäßig der Encoder verwendet (zumindest bei Ihrem Build). Beim letzten Mal habe ich die Standardeinstellung für Bitrate oder Qualität für diesen Encoder überprüft, die-b:v 200k
für die meisten Fälle zu niedrig ist.output1.mp4
usw.) das gleiche Format, die gleiche Bildrate und die gleiche Bildgröße?Antworten:
concat
Erwägen Sie die Verwendung des Demuxers . Auf diese Weise können Sie die Erstellung temporärer, verlustbehafteter Zwischendateien vermeiden und einen zusätzlichen Schritt der Neucodierung überspringen.Hinweis: Alle Eingaben müssen dieselben Stream-Typen haben (dieselben Formate, dieselbe Zeitbasis usw.).
Erstellen Sie eine Textdatei und geben Sie die Pfade und Namen jeder zu verkettenden Datei an (oder "verbinden"). Beispieldatei
input.txt
:Jetzt können Sie den
concat
Demuxer benutzen:Wenn Sie diese Funktion nicht haben, ist Ihr ffmpeg entweder zu alt oder Sie verwenden ein "falsches" ffmpeg von der libav-Gabel.
Über die FFmpeg-Download- Seite stehen einfach zu verwendende statische Builds für Linux, OS X und Windows zur Verfügung. Sie können auch eine Schritt-für-Schritt-Anleitung zum Kompilieren von ffmpeg befolgen .
Siehe auch:
quelle
Der schnellste 1-Liner wäre:
quelle
ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv
(mkv akzeptiert mehr Codecs als mp4, aber Sie können es auch mit mp4 versuchen). Das-safe 0
ist für aktuelle ffmpeg-Versionen, die sich über unsichere Dateinamen beschweren , und das-type f
ist nur für das Auflisten von Dateien. Ich habe hinzugefügt| sort
, um die Dateien alphabetisch zu sortieren. weilfind
liest sie in der Reihenfolge wie im Dateisystem gespeichert. Funktioniert auch für Dateien mit Leerzeichen.