Concatena due file mp4 con ffmpeg senza perdere la qualità


16

Voglio concatenare 2 video usando ffmpeg. Sto usando:

ffmpeg -i output1.mp4 -scodec copy -vbsf h264_mp4toannexb i0.ts

Ma il file mp4 che ottengo sembra molto peggio del file sorgente.

Ecco le informazioni su entrambi i file

   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

Come posso risolvere questo problema?


Cosa stai cercando di fare esattamente? Il termine "concat" significa unire più file, ma ti riferisci a un solo input output1.mp4e un output i0.ts. La codifica nel contenitore di output ts utilizzerà il mpeg2videocodificatore per impostazione predefinita (almeno con la build) e l'ultima volta che ho verificato il bitrate predefinito o l'impostazione di qualità per questo codificatore -b:v 200kè troppo bassa per la maggior parte dei casi.
Llogan,

spiacente. Quindi li concaturo con ffmpeg -i "concat: i0.ts | i1.ts" output1111.mp4. Ma il problema è che la qualità è già cattiva quando

Potrebbe non essere necessario ricodificare il video MPEG-2. Tutti i tuoi input originali ( output1.mp4, ecc.) Hanno gli stessi formati, frame rate e dimensioni dei frame?
Llogan,

si, esattamente. Tutti sono equall

Risposte:


36

Prendi in considerazione l'utilizzo del concatdemuxer . In questo modo è possibile evitare la creazione di file intermedi temporanei e con perdita di dati e saltare un ulteriore passaggio di ricodifica.

Nota: tutti gli input devono avere gli stessi tipi di stream (stessi formati, stessa base dei tempi, ecc.).

  1. Crea un file di testo e includi i percorsi e i nomi di ciascun file da concatenare (o "unire"). File di esempio, input.txt:

    file '/home/jenia/input1.mp4'
    file '/home/jenia/input2.mp4'
    file '/home/jenia/input3.mp4'
    
  2. Ora puoi usare il concatdemuxer:

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

Se non hai questa funzione, allora il tuo ffmpeg è troppo vecchio o stai usando un ffmpeg "falso" dal fork di libav.

Le build statiche facili da usare sono disponibili per Linux, OS X e Windows tramite la pagina di download di FFmpeg , oppure puoi seguire una guida passo-passo per compilare ffmpeg .

Vedi anche:


Questo è esattamente quello che volevo e mi ha aiutato a unire 2 file .mov dal mio iPhone 6. Grazie.
Ryan,

7

Il 1-liner più veloce sarebbe:

ls Movie\ Part\ * | while read line; do echo file \'$line\'; done | ffmpeg -f concat -i - -c copy output.mp4

Qualche possibilità di ottenere un tale 1-onliner per la riga di comando di Windows?
PeterCo

2
Su Linux ho usato questo oneliner: ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv(mkv accetta più codec di mp4, ma potresti anche provarlo con mp4). Il -safe 0è per le versioni più recenti ffmpeg lamentano Unsafe nome del file , e l' -type fè messa in vendita solo i file. Ho aggiunto | sortper ordinare i file in ordine alfabetico; perché findli legge in ordine come salvati sul filesystem. Funziona anche con file con spazi bianchi.
erik,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.