Je veux joindre deux fichiers mp4 pour en créer un seul. Les flux vidéo sont encodés en h264 et l'audio en aac. Je ne peux pas ré-encoder les vidéos dans un autre format pour des raisons de calcul. De plus, je ne peux utiliser aucun programme GUI, tout le traitement doit être effectué avec les utilitaires de ligne de commande Linux. FFmpeg ne peut pas faire cela pour les fichiers mpeg4, j'ai donc utilisé MP4Box à la place:
MP4Box -add video1.mp4 -cat video2.mp4 newvideo.mp4
Malheureusement, l'audio est tout mélangé. Je pensais que le problème était que l'audio était en aac, je l'ai donc transcodé en mp3 et utilisé à nouveau MP4Box. Dans ce cas, l'audio est correct pour la première moitié de newvideo.mp4
(correspondant à video1.mp4
), mais il n'y a pas d'audio et je ne peux pas naviguer dans la vidéo également.
Ma prochaine pensée était que les flux audio et vidéo présentaient de petites différences de longueur que je devais corriger. Donc, pour chaque vidéo d'entrée, j'ai divisé les flux vidéo et audio, puis les ai joints avec l'option -shortest dans FFmpeg.
Ainsi pour la première vidéo j'ai couru:
avconv -y -i video1.mp4 -c copy -map 0:0 videostream1.mp4
avconv -y -i video1.mp4 -c copy -map 0:1 audiostream1.m4a
avconv -y -i videostream1.mp4 -i audiostream1.m4a -c copy -shortest video1_aligned.mp4
De même pour la deuxième vidéo et ensuite utilisé MP4Box comme précédemment. Malheureusement, cela n'a pas fonctionné non plus. Le seul succès que j'ai eu a été lorsque j'ai joint les flux vidéo séparément (c.-à-d. Videostream1.mp4 et videostream2.mp4) et les flux audio (c.-à-d. Audiostream1.m4a et audiostream2.m4a), puis j'ai joint la vidéo et l'audio dans un fichier final. Cependant, la synchronisation est perdue pour la seconde moitié de la vidéo. Concrètement, il y a un retard de 1 sec de l'audio et de la vidéo. Toutes les suggestions sont vraiment les bienvenues.
la source
Réponses:
La meilleure façon de le faire actuellement est d' utiliser le démultiplexeur concat . Tout d'abord, créez un fichier appelé
inputs.txt
formaté comme suit:Ensuite, exécutez simplement cette commande ffmpeg:
Voir aussi concaténation dans la
ffmpeg
FAQ .Je garde ce qui suit ici pour le bénéfice de toute personne utilisant des versions plus anciennes de ffmpeg.
Les dernières versions de ffmpeg peuvent le faire: vous devrez d'abord remuxer les fichiers dans des flux de transport mpeg (assez légers, car cela ne fait que changer le format du conteneur):
Si cela génère une erreur concernant h264, vous devrez peut-être utiliser:
Vous devrez le faire séparément avec chaque fichier d'entrée. Pour concaténer les fichiers ensemble, utilisez:
Si cela génère une erreur concernant aac, vous devrez peut-être utiliser
Si votre système prend en charge les canaux nommés, vous pouvez le faire sans créer de fichiers intermédiaires.
Vous devrez effectuer les opérations suivantes dans trois terminaux virtuels distincts:
Si output.mp4 existe déjà, le troisième ffmpeg vous demandera si vous souhaitez l'écraser, mais il le fera après avoir accédé aux FIFO , ce qui entraînera la fermeture du premier ffmpegs. Assurez-vous donc que vous choisissez un nom inutilisé pour votre fichier de sortie.
Cela peut ne pas fonctionner si vos fichiers d'entrée sont différents - je crois que les différences de débit binaire sont OK, mais la taille d'image, la fréquence d'image, etc. doivent correspondre.
la source
*** THIS PROGRAM IS DEPRECATED *** This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
est un message que je vois maintenant en cours d'exécutionffmpeg
avconv
Pour mp4, la seule solution de travail que j'ai trouvée était avec MP4Box du paquet gpac
ou la commande est
avec mencoder et avconv, je ne pouvais pas le faire fonctionner :-(
la source
Merci pour le script dvo. C'était un excellent point de départ pour moi. Je n'ai eu aucun problème avec l'utilisation de canaux nommés, j'ai donc adapté le script pour les utiliser à la place. De plus, je l'ai corrigé pour qu'il fonctionne avec les noms de fichiers contenant des espaces. La sortie vers les canaux nommés ne "va" pas tant que vous ne commencez pas à les lire, d'où la nécessité d'arrière-plan des tâches de remux initiales avec un & avant l'appel final à avconv. De plus, n'oubliez pas d'utiliser -c copie, ou vous finissez par ré-encoder le tout.
la source
Sur un Mac (macOS 10.13 High Sierra), j'ai utilisé avec succès les éléments suivants:
Réorganisez comme ci-dessus de la même façon si nécessaire (notez que le ./ a été supprimé - le chemin provoquait ffmpeg pour lancer l'erreur de nom de fichier non sécurisé).
Ensuite, j'ai dû supprimer le codec et le débit spécifiés pour le ffmpeg MacPorts par défaut pour l'aimer:
la source
Voici une doublure qui rend tout cela beaucoup plus facile. Il fait tout ce qui était nécessaire pour vous fournir enfin un fichier vidéo résultant. À votre santé!
la source
Merci evilsoup; voici un petit script pour automatiser le processus, en utilisant le plus récent
avconv
.BTW, les tubes nommés ne fonctionnaient pas pour moi (la sortie sur eux était bloquée).
la source
Ont connu un grand succès avec
vous devrez peut-être réorganiser légèrement mylist.txt
ffmpeg version 2.2.3
la source