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?
output1.mp4
et une seule sortiei0.ts
. L'encodage vers le conteneur de sortie ts utilisera l'mpeg2video
encodeur 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 200k
est trop faible dans la plupart des cas.output1.mp4
, etc.) ont-elles les mêmes formats, la fréquence d'images et la taille d'image?Réponses:
Pensez à utiliser le
concat
dé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.).
Créez un fichier texte et incluez les chemins et les noms de chaque fichier à concaténer (ou "joindre"). Exemple de fichier,
input.txt
:Vous pouvez maintenant utiliser le
concat
démultiplexeur: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:
la source
Le 1-liner le plus rapide serait:
la source
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 0
s'agit des versions récentes de ffmpeg qui se plaignent du nom de fichier non sécurisé et il-type f
s'agit uniquement de la liste des fichiers. J'ai ajouté| sort
pour trier les fichiers par ordre alphabétique; car lesfind
lit dans l'ordre comme enregistré sur le système de fichiers. Fonctionne également pour les fichiers avec des espaces.