Concattez deux fichiers mp4 avec ffmpeg sans perte de qualité

16

Je veux concaténer 2 vidéos en utilisant ffmpeg. J'utilise:

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

Mais le fichier mp4 que j'obtiens est bien pire que le fichier source.

Voici les informations sur les deux fichiers

   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

Comment puis-je résoudre ce problème?

Eric Leschinski
la source
Qu'essayez-vous de faire exactement? Le terme "concat" signifie de joindre plusieurs fichiers, mais vous ne faites référence qu'à une seule entrée output1.mp4et une seule sortie i0.ts. L'encodage vers le conteneur de sortie ts utilisera l' mpeg2videoencodeur par défaut (au moins avec votre build), et la dernière fois que j'ai vérifié le débit par défaut ou le paramètre de qualité pour cet encodeur, il -b:v 200kest trop faible dans la plupart des cas.
llogan
Pardon. Ensuite, je les concate avec ffmpeg -i "concat: i0.ts | i1.ts" output1111.mp4. Mais le problème est que la qualité est déjà mauvaise quand je
Vous n'aurez peut-être pas besoin de ré-encoder en vidéo MPEG-2. Toutes vos entrées originales ( output1.mp4, etc.) ont-elles les mêmes formats, la fréquence d'images et la taille d'image?
llogan
Oui, exactement. Tous sont égaux
1
Voir aussi stackoverflow.com/questions/7333232/...
rogerdpack

Réponses:

36

Pensez à utiliser le concatdémultiplexeur . De cette façon, vous pouvez éviter de créer des fichiers intermédiaires temporaires avec perte et ignorer une étape supplémentaire de ré-encodage.

Remarque: Toutes les entrées doivent avoir les mêmes types de flux (mêmes formats, même base de temps, etc.).

  1. Créez un fichier texte et incluez les chemins et les noms de chaque fichier à concaténer (ou "joindre"). Exemple de fichier, input.txt:

    file '/home/jenia/input1.mp4'
    file '/home/jenia/input2.mp4'
    file '/home/jenia/input3.mp4'
    
  2. Vous pouvez maintenant utiliser le concatdémultiplexeur:

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

Si vous ne disposez pas de cette fonctionnalité, alors soit votre ffmpeg est trop ancien, soit vous utilisez un "faux" ffmpeg de la libav fork.

Des versions statiques faciles à utiliser sont disponibles pour Linux, OS X et Windows via la page de téléchargement FFmpeg , ou vous pouvez suivre un guide étape par étape pour compiler ffmpeg .

Regarde aussi:

llogan
la source
C'est exactement ce que je voulais et m'a aidé à fusionner 2 fichiers .mov de mon iPhone 6. Merci.
Ryan
7

Le 1-liner le plus rapide serait:

ls Movie\ Part\ * | while read line; do echo file \'$line\'; done | ffmpeg -f concat -i - -c copy output.mp4
Hackeron
la source
Avez-vous une chance d'obtenir un tel 1-onliner pour la ligne de commande Windows?
PeterCo
2
Sous Linux, j'ai utilisé cet oneliner: ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv(mkv accepte plus de codecs que mp4, mais vous pouvez également l'essayer avec mp4). Il -safe 0s'agit des versions récentes de ffmpeg qui se plaignent du nom de fichier non sécurisé et il -type fs'agit uniquement de la liste des fichiers. J'ai ajouté | sortpour trier les fichiers par ordre alphabétique; car les findlit dans l'ordre comme enregistré sur le système de fichiers. Fonctionne également pour les fichiers avec des espaces.
erik