Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 08/08/2016, à 16:48

Compte supprimé

[Résolu] ffmpeg synchroniser video et audio dans un seule vidéo

Bonjour,

J'ai une piste vidéo (sans audio) qui fait 01:30:00 (format x264) et une piste audio qui fait 01:29:59.7 (format aac).

Le but est de les fusionner pour former qu'une seule vidéo en mkv voilà comment je fais.

ffmpeg -i piste-video -i piste-audio -c:v copy -c:a copy nouvelle-video.mkv

Le problème c'est que j'ai un "décalage" entre l'audio et la vidéo (normal vu que les 2 piste à base n'ont pas la même durée).

Je suis arriver à accélérer la piste audio avec Audacity, onglet "Effets" puis "Changer la vitesse" puis il suffit de redéterminer la nouvelle durée et d'exporter la nouvelle piste audio pour la fusionner avec la commande ci-dessus.

Mais je dois pouvoir le faire en lignes de commandes et de préférence avec ffmpeg (c'est pour un script).

Voilà une piste que j'ai trouvé:

ffmpeg -y -i piste-audio -filter:a "atempo=1.00005" nouvelle-piste-audio.m4a

Pour info le 1.00005 est le facteur (pourcent) qu'on applique, par exemple:

2   la piste est accélérer à 200% de l'original (2x plus rapide)
1.25 la piste est accélérer à 125% de l'original
1      la piste ne subit aucun changement (100%)
0.75 la piste est ralentie à 75% de l'original
0.5   la piste est ralentie à 50% ou de moitié de l'original (2x moins rapide)

Dans mon cas pour obtenir ce facteur, j'ai converti la durée de piste vidéo et audio en seconde avec 2 chiffres après la virgule (centième de secondes) puis j'ai divisé la durée de la piste vidéo par celle de l'audio (5400 / 5399.7 = 1.00005).
Ce qui revient à accélérer la nouvelle piste audio à 100.005% de l'original. Pas grand chose... mais 3 centièmes de seconde de décalage c'est laid sur une vidéo !

Le hic avec cette méthode c'est que je ne suis pas précis à 100%... il y a encore un "décalage" de quelques dixièmes de seconde (j'ai besoin d'une précision d'un dixième de seconde de différence au maximum) .

Donc, je cherche une commande dans la quelle je donne comme paramètre une durée précise comme 01:30:00 ou 5400 ou une autre valeur du style .

Merci de votre savoir en la matière et de votre aide.

Dernière modification par Compte supprimé (Le 12/10/2016, à 21:26)

#2 Le 09/08/2016, à 09:13

Bertrand49

Re : [Résolu] ffmpeg synchroniser video et audio dans un seule vidéo

Bonjour,

Je vois une solution, il s'agit de réencoder le film dans Avidemux,où il y a une option pour compenser les décalages de son avec l'image, en ms: donc, si le son est en avance, il faudra régler une valeur négative.

Hors ligne

#3 Le 09/08/2016, à 18:33

Compte supprimé

Re : [Résolu] ffmpeg synchroniser video et audio dans un seule vidéo

Salut Bertrand49,

Merci pour ta réponse intéressante cool mais je préfère une solution en ligne de commande.

En fouinant sur le net j'ai trouvé qu'on peut modifier la vitesse de la vidéo avec ffmpeg en utilisant le paramètre "setpts=xxxx*PTS" (remplacer xxxx par votre valeur). Cela reviens un peu à la "solution" du premier poste avec "atempo" mais cela semble plus précis (?)

Sinon voilà mon bout de script qui synchronise et fusionne les pistes vidéo et audio (c'est un principe simplifié).

#! /bin/bash

# Saisir chemin des pistes
pisteVideo="/chemin/video.mkv"
pisteAudio="/chemin/audio.m4a"

# Saisir chemin du dossier de destination
cd "/home/$USER"

#===========================================================

# Calcul durée video
timeVideo=$(awk -F [\:] '{printf "%.3f\n" ,(($1*3600)+($2*60)+$3)}' <<< $(ffmpeg -i "${pisteVideo}" 2>&1 | awk '/Duration:/ {print $2}' | awk -F [,] '{print $1}'))

# Calcul durée audio
timeAudio=$(awk -F [\:] '{printf "%.3f\n" ,(($1*3600)+($2*60)+$3)}' <<< $(ffmpeg -i "${pisteAudio}" 2>&1 | awk '/Duration:/ {print $2}' | awk -F [,] '{print $1}'))

# Calcul facteur de correction pour la piste video
#tempo=$(echo "(${timeVideo}/${timeAudio})" | bc -l)
tempo=$(echo "(${timeAudio}/${timeVideo})" | bc -l)

# Conversion piste vidéo et fusion des pistes
ffmpeg -y -i "${pisteVideo}" -vf "setpts=${tempo}*PTS" -c:v libx264 -crf 16 -an video-tempo.mkv
ffmpeg -y -i video-tempo.mkv -i "${pisteAudio}" -c:v copy -c:a copy video-final.mkv

echo "tempo = $tempo"

Dernière modification par Compte supprimé (Le 09/08/2016, à 18:49)