J'essaie de concaténer deux fichiers mp4 en utilisant ffmpeg. J'ai besoin que ce soit un processus automatique, c'est pourquoi j'ai choisi ffmpeg. Je suis en train de convertir les deux fichiers en fichiers .ts, puis de les concaténer, puis d'essayer d'encoder ce fichier .ts concédé. Les fichiers sont encodés en h264 et aac et j'espère garder la qualité la même ou aussi proche que possible de l'original.
ffmpeg -i part1.mp4 -vcodec copy -vbsf h264_mp4toannexb -acodec copy part1.ts
ffmpeg -i part2.mp4 -vcodec copy -vbsf h264_mp4toannexb -acodec copy part2.ts
cat part1.ts part2.ts > parts.ts
ffmpeg -y -i parts.ts -acodec copy -ar 44100 -ab 96k -coder ac -vbsf h264_mp4toannexb parts.mp4
Malheureusement, je reçois le message d'erreur suivant en revenant de ffmpeg lors de l'encodage:
[h264 @ 0x1012600]sps_id out of range
[h264 @ 0x1012600]non-existing SPS 0 referenced in buffering period
[h264 @ 0x1012600]sps_id out of range
[h264 @ 0x1012600]non-existing SPS 0 referenced in buffering period
[NULL @ 0x101d600]error, non monotone timestamps 13779431 >= 13779431kbits/s
av_interleaved_write_frame(): Error while opening file
Cela se produit à mi-chemin de l'encodage, ce qui me fait penser que vous ne pouvez pas concaténer deux fichiers .ts ensemble et le faire fonctionner.
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.ffmpeg -i "concat:input1|input2" -codec copy output
. Il n'est pas nécessaire d'échapper au caractère pipe.POUR LES FICHIERS MP4
Pour les fichiers .mp4 (que j'ai obtenus auprès de DailyMotion.com: un épisode télévisé de 50 minutes, téléchargeable uniquement en trois parties, sous forme de trois fichiers vidéo .mp4), ce qui suit était une solution efficace pour Windows 7 , et n'implique PAS de recodage du des dossiers.
J'ai renommé les fichiers (comme file1.mp4 , file2.mp4 , file3.mp4 ) de telle sorte que les parties étaient dans le bon ordre pour visualiser l'épisode complet de la télévision.
J'ai ensuite créé un simple fichier batch (concat.bat), avec le contenu suivant:
Le fichier de commandes et ffmpeg.exe doivent tous deux être placés dans le même dossier que les fichiers .mp4 à joindre. Exécutez ensuite le fichier de commandes. L'exécution prend généralement moins de dix secondes.
.
Addendum (21/10/2018) -
Si ce que vous cherchiez est une méthode pour spécifier tous les fichiers mp4 dans le dossier en cours sans beaucoup de retaper, essayez plutôt cela dans votre fichier batch Windows ( DOIT inclure l'option -safe 0 ):
Cela fonctionne sur Windows 7, dans un fichier batch. N'essayez pas de l' utiliser sur la ligne de commande, car cela ne fonctionne que dans un fichier batch!
la source
C:\blah>type mylist.txt<ENTER>
(afin qu'ils voient le contenu de ce fichier) Ensuite,ffmpeg -f concat -i mylist.txt -c copy output.mp4<ENTER>
vous devez également inclure une référence trac.ffmpeg.org/wiki/Concatenate (cette référence utilise même le même nom de fichier, mylist.txt)-i
paramètres. Sur Linux, je l'ai fait: cels -1 P1041*.mp4 | sed s/"P"/" file P"/g > mylist.txt
qui est encore plus cool que de coder un script batch. Quoi qu'il en soit, se-c copy
produit très rapidement (dont je n'étais pas au courant) et c'est la vraie magie de cette réponse.Voici un moyen rapide (prend moins d'une minute) et sans perte de le faire sans avoir besoin de fichiers intermédiaires:
Le "ls" contient les fichiers à joindre Le "perl" crée le fichier de concaténation à la volée dans un tube La partie "-i -" indique à ffmpeg de lire à partir du tube
(note - mes fichiers n'avaient pas d'espaces ou de trucs bizarres en eux - vous aurez besoin d'un échappement approprié si vous voulez faire cette idée avec des fichiers "durs").
la source
ls Movie_Part_1.mp4 Movie_Part_2.mp4 | perl -ne '$_ =~ s/\n$//; print "file '"'"'$_'"'"'\n"' | ffmpeg -f concat -i - -c copy Movie_Joined.mp4
ls * | perl -ne 'print "file $_"' | ffmpeg -f concat -i - -c copy Movie_Joined.mp4
si vos fichiers sont bien nommés et en ordre. Fonctionné très bien pour moi sur OS X, exactement ce que je voulais.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.ffmpeg
le faire fonctionner:-protocol_whitelist file,tcp,http,pipe
pour les fichiers MP4:
S'ils ne sont pas exactement les mêmes (100% même codec, même résolution, même type) fichiers MP4, vous devez d'abord les transcoder en flux intermédiaires:
REMARQUE! : La sortie sera comme le premier fichier (et non un second)
la source
J'essayais de concaténer trois
.mp3
fichiers audio en un seul.m4a
fichier et cette commande ffmpeg fonctionne.Commande d'entrée:
Signification de: -filter_complex "concat = n = 3: v = 0: a = 1" :
Pour plus d'informations: utilisez
ffmpeg -h full
toutes les options d'impression (y compris toutes les options spécifiques au format et au codec, très longues)la source
-f concat -safe 0 -i "file.txt" -c copy -y "OutPut.mp4"
il concatera mais lorsque certaines vidéos sont avec audio et d'autres sans audio, cela ne fonctionne pas, comment puis-je trier cela. Merci -J'ai fini par utiliser mpg comme format intermédiaire et cela a fonctionné (NOTE ceci est un exemple dangereux, -qscale 0 ré-encodera la vidéo ...)
la source
-sameq
été supprimé. Utilisez-qscale 0
plutôt.-sameq
ne signifie pas "même qualité" et a été supprimé de ffmpeg comme mentionné par @XavierHo.concat
commande dans ffmpeg, comme le fait @rogerdpack ci-dessus.Une documentation détaillée sur les différentes méthodes de concaténation dans ffmpeg peut être trouvée ici .
Vous pouvez utiliser le «filtre Concat» pour une concaténation rapide.
Il effectue un ré-encodage. Cette option est préférable lorsque les entrées ont des formats vidéo / audio différents.
Pour concaténer 2 fichiers:
Pour concaténer 3 fichiers:
Cela fonctionne aussi bien pour plusieurs types de fichiers d'entrée.
la source
ouput.mp4
débit vidéo est nettement inférieur au débit vidéo des vidéos d'entréeJ'ai trouvé que l'opérateur de tuyau ne fonctionnait pas pour moi lors de l'utilisation de l'option 3 pour concaténer plusieurs MP4 sur un Mac dans la réponse acceptée.
Le one-liner suivant fonctionne sur un Mac (High Sierra) pour concaténer des mp4, sans création de fichier intermédiaire requise.
ffmpeg -f concat -safe 0 -i <(for f in ./*.mp4; do echo "file '$PWD/$f'"; done) -c copy output.mp4
la source
Voici 2 solutions bash pures utilisant uniquement
ffmpeg
et n'utilisant pasSolution monocouche utilisant
ls
Fonction qui prend 0 ou 2+ arguments
Remarque: avait essayé quelques solutions dans ce fil et aucun ne m'a satisfait
la source
basé sur les réponses de rogerdpack et d'Ed999, j'ai créé ma version .sh
il joint tous les
*.mp4
fichiers du dossier actuel dansjoined-out.mp4
testé sur mac.
la taille de fichier résultante est la somme exacte de mes 60 fichiers testés. Cela ne devrait pas être une perte. Juste ce dont j'avais besoin
la source
cela a fonctionné pour moi (sur windows)
un exemple...
Python
Utiliser du code python pour le faire avec autant de mp4 qu'il y a dans un dossier (installez python depuis python.org, copiez et collez et enregistrez ce code dans un fichier appelé mp4.py et exécutez-le à partir de la cmd ouverte dans le dossier avec python mp4.py et tous les mp4 du dossier seront concaténés)
Version 2 avec Python
Tiré de mon post sur mon blog , voici comment je le fais en python:
la source
Pour les
.mp4
fichiers, je l' ai trouvé fonctionne mieux et plus rapide d'utiliser l'outil de ligne de commande opensource:mp4box
. Ensuite, vous pouvez l'utiliser de cette façon:Téléchargez-le ici pour la plupart des plateformes: https://gpac.wp.imt.fr/mp4box/
la source
Voici un script que j'ai fait pour concaténer plusieurs mp4 GoPro en mp4 720p. J'espère que c'est utile.
la source
De la documentation ici: https://trac.ffmpeg.org/wiki/Concatenate
Cette approche fonctionne sur toutes les plateformes.
J'avais besoin de pouvoir l'encapsuler dans un script multiplateforme, j'ai donc utilisé
fluent-ffmpeg
et trouvé la solution suivante:la source
la source
Fusion de tous les fichiers mp4 du répertoire actuel
Personnellement, je n'aime pas créer de fichier externe que je dois supprimer par la suite, donc ma solution était la suivante qui inclut la liste de numérotation des fichiers (comme
file_1_name, file_2_name, file_10_name, file_20_name, file_100_name
, ...)la source
Après plusieurs essais ci-dessous, le script a fonctionné pour moi sur Windows 10 PowerShell.
Ici, les deux premières lignes créent un fichier texte temp.txt qui a le contenu suivant
Les 3ème, 4ème lignes vérifient si ffmpeg est disponible sur le chemin et créent le "join.mp4"
Les principales différences par rapport aux autres réponses sont les suivantes
pour que mon fichier mp4 ci-dessus fonctionne, vous devrez peut-être utiliser d'autres alternatives comme ci-dessous en fonction de votre encodage vidéo.
Tous ces filtres Bitstream possibles peuvent être trouvés sur https://ffmpeg.org/ffmpeg-bitstream-filters.html
la source
Voici ma méthode pour rejoindre un répertoire plein de fichiers MP4 à l'aide de la substitution de commandes et du filtre vidéo concat (cela va ré-encoder) - je pensais que quelqu'un d'autre tirerait parti de ce one-liner, surtout si vous avez beaucoup de fichiers (je viens joint 17 fichiers en un seul coup):
NB cette commande joint vos fichiers dans l'ordre dans lequel ils sont nommés (c'est-à-dire dans le même ordre que celui présenté si vous exécutez
ls *.mp4
) - dans mon cas, ils avaient chacun un numéro de piste, donc cela fonctionnait très bien.la source
Le protocole de concaténation décrit ici; https://trac.ffmpeg.org/wiki/Concatenate#protocol
Lorsqu'il est implémenté à l'aide de canaux nommés pour éviter les fichiers intermédiaires
Est très rapide (lire: instantané), aucune image n'a été supprimée et fonctionne bien.
N'oubliez pas de supprimer les fichiers de canaux nommés et n'oubliez pas de vérifier si la vidéo est H264 et AAC, ce que vous pouvez faire avec juste
ffmpeg -i filename.mp4
(vérifiez les mentions h264 et aac)la source
La réponse acceptée sous la forme d'un script PowerShell réutilisable
la source