FFmpeg concat vidéo et audio désynchronisés
Joindre plusieurs fichiers à l'aide de ffmpeg concat semble résulter en une inadéquation des horodateurs ou des offsets pour l'audio. J'ai essayé avec plusieurs vidéos et j'ai remarqué le même problème pour H. 264 / MP4.
en utilisant concat
et l'encodage la vidéo semble bien fonctionner. L'audio reste synchronisé puisque ffmpeg effectue tous les calculs de conversion et semble avoir tout ce qu'il faut.
Toutefois, il suffit de concaténer les vidéos sans aucune la transformation ou l'encodage se traduit par un problème de synchronisation qui augmente lentement. Évidemment, encoder les vidéos plutôt que de simplement les rejoindre entraînera une perte d'information/qualité, donc je préférerais trouver un moyen de contourner ce problème.
j'ai essayé plusieurs drapeaux pour régler ce problème qui semble être basé sur les horodateurs. Aucune de ces semblent pour corriger le problème.
ffmpeg -f concat -fflags +genpts -async 1 -i segments.txt test.mov
ffmpeg -auto_convert 1 -f concat -fflags +genpts -async 1 -i segments.txt -c copy test2.mov
ffmpeg -f concat -i segments.txt -c copy -fflags +genpts test3.mp4
ffmpeg -f concat -fflags +genpts -async 1 -i segments.txt -copyts test4.mov
ffmpeg -f concat -i segments.txt -copyts test5.mov
ffmpeg -f concat -i segments.txt -copyts -c copy test6.mov
ffmpeg -f concat -fflags +genpts -i segments.txt -copyts -c copy test7.mov
Note: toutes les autres questions que j'ai pu trouver sur SO seem pour "corriger" le problème en encodant simplement les vidéos à nouveau. Pas une bonne solution.
mise à Jour
j'ai réalisé que la concat n'était pas le problème. Le jeu original de clips avait des horodateurs mal assortis. D'une manière ou d'une autre concat + encoding a corrigé le problème, mais je ne veux pas réencoder les vidéos et la qualité lâche à chaque fois.
ffmpeg -y -ss 00:00:02.750 -i input.MOV -c copy -t 00:00:05.880 output.MOV
ce qui a donné les données suivantes
ffprobe -v quiet -show_entries stream=start_time,duration output.MOV
start_time=-0.247500
duration=6.131125
start_time=-0.257333
duration=6.155333
Depuis, j'ai essayé d'utiliser -to
m et -t
dans différents endroits le long avec -af apad -c:v copy
et j'ai toujours pas réussi à obtenir la durée sera la même.
Voici la sortie complète de ffprobe
Voici l'original (rouge) vs le segment (vert)
Exemple Détaillé Fichiers
j'ai enregistré un échantillon vidéo, ajouté les commandes pour le découper, puis le concatter. http://davidpennington.me/share/audio_sync_test_video.zip
5 réponses
Ce processus en deux étapes devrait fonctionner
Etape 1 Dpa de l'audio dans chaque segment
ffmpeg -i segment1.mov -af apad -c:v copy <audio encoding params> -shortest -avoid_negative_ts make_zero -fflags +genpts padded1.mov
Ou
Générer des segments synchronisé en flux
ffmpeg -y -ss 00:00:02.750 -i input.MOV -c copy -t 00:00:05.880 -avoid_negative_ts make_zero -fflags +genpts segment.MOV
Étape 2 Concat
ffmpeg -f concat -i segments.txt -c copy test.mov
où segments.txt
se compose des noms des fichiers capitonnés.
j'ai été aux prises avec celui-ci pour un certain temps ainsi. Particulièrement lorsque vous travaillez avec des fichiers MTS générés par Panasonic AVCHD. Ma solution actuelle est de les concaténer au niveau OS et non ffmpeg. Je le fais sur windows et il ressemble à quelque chose comme ceci:
COPY /b input_1.mts + input_2.mts + input_3.mts output.mts
Sur linux, il devrait être quelque chose comme:
$ cat input_1.mts input_2.mts input_3.mts > output.mts
vous pouvez chercher la documentation pour le windows et linux binaire de concaténation.
C' méthode de concaténation comme apposé au transcodage est la voie à suivre si le format original fonctionnera pour vous. Cette méthode n'utilise pratiquement aucun traitement CPU et préserve la qualité originale. Un gagnant-gagnant dans le traitement des médias en vrac de haute qualité.
vous pouvez utiliser filter_complex
concat différentes options en une seule fois
fmpeg -i input1.mp4 -i input2.webm \
-filter_complex "[0:v:0] [0:a:0] [1:v:0] [1:a:0] concat=n=2:v=1:a=1 [v] [a]" \
-map "[v]" -map "[a]" <encoding options> output.mkv
Si les vidéos d'entrée ont été encodées avec les mêmes paramètres, vous pouvez utiliser mkvmerge
à partir de mkvtoolnix à la place:
mkvmerge -o output.mkv file1.mkv + file2.mkv + file3.mkv
j'avais besoin de concaténer des vidéos de différentes sources qui étaient encodées avec des paramètres différents, donc j'ai utilisé une commande comme celle-ci pour redimensionner et ré-encoder les vidéos d'entrée en premier:
for f in *.mp4;do width=1280;height=720;ffmpeg -i $f -filter:v "scale=iw*min($width/iw\,$height/ih):ih*min($width/iw\,$height/ih), pad=$width:$height:($width-iw*min($width/iw\,$height/ih))/2:($height-ih*min($width/iw\,$height/ih))/2" -c:v libx264 -crf 22 -preset slow -pix_fmt yuv420p -c:a libfdk_aac -vbr 3 -ac 2 -ar 44100 ${f%mp4}mkv;done
Certaines vidéos n'ont pas un canal audio, j'ai donc dû utiliser cette commande pour ajouter un silencieux canal audio eux:
for f in *.mkv;do ffprobe $f|&grep -q '1: Audio'||{ ffmpeg -i $f -f lavfi -i anullsrc -c:a libfdk_aac -shortest -c:v copy temp-$f;mv temp-$f $f; };done
j'ai ensuite concaténé les vidéos en utilisant une commande comme celle-ci:
mkvmerge -o output.mkv $(printf %s\n *.mkv|sed '1!s/^/+/')
j'ai rencontré un problème similaire et j'ai trouvé une solution qui a fonctionné, au moins pour moi. Dans mon cas, je concaténais aussi des fichiers, et j'ai trouvé des problèmes de synchronisation audio/vidéo avec iOs, mais pas avec Windows (par exemple, VLC media player n'a montré aucun problème de synchronisation en utilisant le même fichier mp4). Le symptôme pour iOs jouant ce mp4 concaténé était initialement une bonne synchronisation suivie d'une perte croissante de synchronisation que le film a joué, avec l'audio va plus vite que la vidéo. Intéressant, la synchronisation pourrait être restaurée temporairement en avançant le curseur de progression du film à n'importe quel point du film, mais alors la synchronisation serait perdue à nouveau que le film a continué à jouer dans iOs. En jouant le même film simultanément dans iOs et Windows VLC, et initialement synchronisé entre eux aussi bien que j'ai pu, en observant l'évolution de l ' "écho" entre eux, j'ai conclu que l'audio de iOs allait trop vite (en supposant que le lecteur Windows est correct).
Pour moi, l' la solution était d'ajouter l'option de filtre audio -af aresample=async=1000
à la commande ffmpeg, que j'ai trouvé comme exemple dans la documentation en ligne de ffmpeg et utilisé mot à mot. Je ne sais pas si ce réglage est optimal, mais le résultat a été un mp4 avec l'audio et la vidéo restant synchronisés lorsqu'ils sont lus à la fois par iOs et VLC. Cette option ffmpeg a fourni une synchronisation iOS correcte à la fois pendant la concaténation et après lors du ré-encodage du fichier déjà concaténé.