Konzentrieren Sie zwei mp4-Dateien mit ffmpeg, ohne an Qualität zu verlieren

16

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?

Eric Leschinski
quelle
Was genau versuchst du zu tun? Der Begriff "concat" bedeutet, dass mehrere Dateien verknüpft werden, Sie beziehen sich jedoch nur auf eine Eingabe output1.mp4und eine Ausgabe i0.ts. Bei der Codierung in den mpeg2videoAusgabecontainer 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 200kfür die meisten Fälle zu niedrig ist.
Logan
Es tut uns leid. Dann verbinde ich sie mit ffmpeg -i "concat: i0.ts | i1.ts" output1111.mp4. Aber das Problem ist, dass die Qualität schon schlecht ist, wenn ich ts-Dateien
Möglicherweise müssen Sie das MPEG-2-Video nicht neu codieren. Haben alle Ihre Originaleingänge ( output1.mp4usw.) das gleiche Format, die gleiche Bildrate und die gleiche Bildgröße?
Logan
ja genau. Alle sind gleich
1
Siehe auch stackoverflow.com/questions/7333232/…
Rogerdpack,

Antworten:

36

concatErwä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.).

  1. Erstellen Sie eine Textdatei und geben Sie die Pfade und Namen jeder zu verkettenden Datei an (oder "verbinden"). Beispieldatei input.txt:

    file '/home/jenia/input1.mp4'
    file '/home/jenia/input2.mp4'
    file '/home/jenia/input3.mp4'
    
  2. Jetzt können Sie den concatDemuxer benutzen:

    ffmpeg -f concat -i input.txt -codec copy output.mp4
    

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:

Logan
quelle
Dies ist genau das, was ich wollte und hat mir geholfen, 2 .mov-Dateien von meinem iPhone 6 zusammenzuführen. Danke.
Ryan
7

Der schnellste 1-Liner wäre:

ls Movie\ Part\ * | while read line; do echo file \'$line\'; done | ffmpeg -f concat -i - -c copy output.mp4
Hackeron
quelle
Gibt es eine Chance, eine solche 1-Onliner für Windows-Befehlszeile zu bekommen?
PeterCo
2
Unter Linux habe ich diesen Oneliner verwendet: 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 0ist für aktuelle ffmpeg-Versionen, die sich über unsichere Dateinamen beschweren , und das -type fist nur für das Auflisten von Dateien. Ich habe hinzugefügt | sort, um die Dateien alphabetisch zu sortieren. weil findliest sie in der Reihenfolge wie im Dateisystem gespeichert. Funktioniert auch für Dateien mit Leerzeichen.
Erik