ffmpeg ajoute de l'audio mais conserve la même longueur de vidéo (pas le plus court)

12

J'ajoute de l'audio à un fichier vidéo en utilisant ffmpeg comme ça

ffmpeg -i videofile.mp4 -i audiofile.wav output.mp4

Cependant, cela étend le fichier vidéo de sortie à la longueur du fichier audio s'il est plus long que la vidéo. L'utilisation de -shortest réduit le fichier vidéo court si le fichier audio est plus court que la vidéo. Existe-t-il un indicateur pour indiquer à ffmpeg de réduire la durée de la vidéo de sortie à la longueur de la vidéo d'entrée?

stealthcopter
la source
Veuillez sélectionner une bonne réponse. Le seul vrai correct est celui de @Zurechtweiser.
Roel Van de Paar

Réponses:

13

Je crois que vous pouvez atteindre votre objectif souhaité en utilisant l'option -filter_complex et l'option de filtre apad pour atténuer votre audio avec un silence à la fin si la vidéo est plus longue. Votre commande serait:

ffmpeg -i videofile.mp4 -i audiofile.wav -filter_complex " [1:0] apad " -shortest output.mp4

Cela suppose que l'audio que vous voulez se trouve dans le premier flux de audiofile.wav, la syntaxe [A: B] dit de prendre le Bème flux à partir de la Aème entrée (les deux commençant par 0, donc [1: 0] est le 1er flux de la 2e entrée, ou audiofile.wav ci-dessus).

Détails sur: https://www.ffmpeg.org/ffmpeg-filters.html#Examples-68

code mort
la source
Vous devez mentionner que l' -filter_complexoption force le réencodage - il est par exemple possible d'exécuter ffmpeg -i videofile.mp4 -i audiofile.wav -c:v copy output.mp4mais pasffmpeg -i videofile.mp4 -i audiofile.wav -filter_complex " [1:0] apad " -c:v copy -shortest output.mp4
Eugen Rieck
C'est la réponse inverse de ce qui est demandé. OP demande de mettre fin à la vidéo à la fin de l'audio, la réponse donnée est d'ajouter un silence audio si l'audio est plus court que la vidéo. Cette réponse est incorrecte.
Roel Van de Paar
Ce n'est pas "l'opposé" de ce que le PO a demandé. L'OP veut que la vidéo de sortie soit la longueur de la vidéo d'entrée, quelle que soit la longueur de la piste audio. Ma réponse concerne le cas où la vidéo d'entrée est plus longue que le fichier audio. L'OP a déjà une solution pour quand la vidéo d'entrée est plus courte que le fichier audio, qui est d'utiliser -shortest.
deadcode
12
  • Si la longueur vidéo est plus courte que la longueur audio, -shortestc'est ce que vous voulez.
  • Si la longueur de la vidéo est plus longue que la longueur audio, aucun indicateur ne sera ce que vous voulez.

Il n'y a aucun indicateur pour automatiser cette décision.

ÉDITER

Inspiré par la réponse de @ deadcode, je dois préciser que "aucun indicateur à automatiser" n'est bien sûr pas vrai, si vous êtes prêt à recoder : dans ce cas, allez apadcomme suggéré par @deadcode.

Si toutefois vous voulez éviter de réencoder (c'est-à-dire -c:v copy), la réponse est valable .

Il existe une solution de contournement en utilisant le ffconcatdémultiplexeur, mais il a besoin d'un peu de travail:

  • créer un fichier contenant du silence exactement au même format que votre fichier audio ("silence.wav")
  • créez un fichier concat "audio.ffconcat" (avec autant de lignes de silence que nécessaire pour vous assurer que votre audio est suffisamment long):

.

file 'audiofile.wav'
file 'silence.wav'
file 'silence.wav'
...
file 'silence.wav'
  • courir ffmpeg -i videofile.mp4 -f concat -i audio.ffconcat -c:v copy output.mp4

Cela synthétisera le apadfiltre sans graphique de filtre, permettant ainsi un multiplexage sans réencodage.

Eugen Rieck
la source
@RoelVandePaar Comme je l'ai dit: si la longueur de la vidéo est plus courte que l'utilisation de la longueur audio -shortest, utilisez cette solution de contournement si vous souhaitez ajouter du silence sans réencodage.
Eugen Rieck
Correct, a raté cela lors de l'examen. Entrée supprimée. N'hésitez pas à faire de même.
Roel Van de Paar
5

Si vous connaissez la longueur de votre fichier vidéo, vous pouvez le faire en utilisant

ffmpeg -i videofile.mp4 -i audiofile.wav -t 43 output.mp4

Où 43 est la longueur de votre fichier vidéo en secondes.

Zurechtweiser
la source
la question de l'auteur veut boucler le fichier audio alors que la vidéo n'est pas terminée. Est-ce que ça marche pour ça?
Rafael Sanches
@RafaelSanches Non, il ne le fait pas.
Zurechtweiser
L'auteur ne veut pas boucler l'audio. Cette réponse est également la seule correcte qui fait ce que le PO demandait; terminer la vidéo lorsque la vidéo d'entrée se termine.
Roel Van de Paar