ffmpeg füge Audio hinzu, aber halte die Videolänge gleich (nicht -kurzeste)

11

Ich füge einer Videodatei mit ffmpeg wie folgt Audio hinzu

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

Dadurch wird die Ausgabevideodatei jedoch auf die Länge der Audiodatei erweitert, wenn sie länger als das Video ist. Mit -shortest wird die Videodatei gekürzt, wenn die Audiodatei kürzer als das Video ist. Gibt es also ein Flag, das ffmpeg anweist, die Länge des Ausgabevideos auf die Länge des Eingangsvideos zu reduzieren?

Stealthcopter
quelle
Bitte wählen Sie eine richtige Antwort. Das einzig wirklich Richtige ist das von @Zurechtweiser.
Roel Van de Paar

Antworten:

13

Ich glaube, Sie können Ihr gewünschtes Ziel erreichen, indem Sie die Option -filter_complex und die Option apad filter verwenden, um Ihr Audio am Ende mit Stille aufzufüllen, wenn das Video länger ist. Ihr Befehl wäre:

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

Dies setzt voraus, dass sich das gewünschte Audio im ersten Stream von audiofile.wav befindet. Die [A: B] -Syntax besagt, dass der B'th-Stream vom A'th-Eingang übernommen werden soll (beide beginnen mit 0, also ist [1: 0] der 1. Stream vom 2. Eingang oder audiofile.wav oben).

Details unter: https://www.ffmpeg.org/ffmpeg-filters.html#Examples-68

Deadcode
quelle
Sie sollten erwähnen, dass die -filter_complexOption eine Neucodierung erzwingt - es ist z. B. möglich, ffmpeg -i videofile.mp4 -i audiofile.wav -c:v copy output.mp4aber nicht auszuführenffmpeg -i videofile.mp4 -i audiofile.wav -filter_complex " [1:0] apad " -c:v copy -shortest output.mp4
Eugen Rieck
Dies ist die entgegengesetzte Antwort auf das, was angefordert wird. OP fordert Sie auf, das Video zu beenden, wenn das Audio endet. Die Antwort lautet, Audio-Stille hinzuzufügen, wenn das Audio kürzer als das Video ist. Diese Antwort ist falsch.
Roel Van de Paar
Es ist nicht "das Gegenteil" von dem, was das OP verlangt hat. Die OPs möchten, dass das Ausgangsvideo unabhängig von der Länge der Audiospur die Länge des Eingangsvideos hat. Meine Antwort befasst sich mit dem Umstand, dass das Eingangsvideo länger als die Audiodatei ist. Das OP hat bereits eine Lösung für den Fall, dass das Eingangsvideo kürzer als die Audiodatei ist, die -shortest verwenden soll.
Deadcode
12
  • Wenn die Videolänge kürzer als die Audiolänge ist, -shortestist dies das , was Sie möchten.
  • Wenn die Videolänge länger als die Audiolänge ist, ist überhaupt kein Flag das, was Sie wollen.

Es gibt kein Flag, um diese Entscheidung zu automatisieren.

BEARBEITEN

Inspiriert von der Antwort von @ deadcode muss ich klarstellen , dass "kein zu automatisierendes Flag" natürlich nicht wahr ist, wenn Sie bereit sind , erneut zu codieren : In diesem Fall gehen Sie apadwie von @deadcode vorgeschlagen vor.

Wenn Sie jedoch eine Neukodierung vermeiden möchten (dh -c:v copy), steht die Antwort.

Es gibt eine ffconcatProblemumgehung mit dem Demuxer, aber es erfordert ein wenig Arbeit:

  • Erstellen Sie eine Datei mit Stille im exakt gleichen Format wie Ihre Audiodatei ("Schweigen.wav").
  • Erstellen Sie eine Concat-Datei "audio.ffconcat" (mit so vielen Stillezeilen, wie Sie benötigen, um sicherzustellen, dass Ihr Audio lang genug ist):

.

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

Dadurch wird der apadFilter ohne Filtergraph synthetisiert , wodurch ein Mux ohne Neucodierung ermöglicht wird.

Eugen Rieck
quelle
@RoelVandePaar Wie gesagt: Wenn die Videolänge kürzer als die Audiolänge ist -shortest, verwenden Sie diese Problemumgehung, wenn Sie Stille ohne Neucodierung hinzufügen möchten.
Eugen Rieck
Richtig, habe das bei der Überprüfung verpasst. Eingabe entfernt. Fühlen Sie sich frei, das gleiche zu tun.
Roel Van de Paar
5

Wenn Sie die Länge Ihrer Videodatei kennen, können Sie dies mithilfe von erreichen

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

Wobei 43 die Länge Ihrer Videodatei in Sekunden ist.

Zurechtweiser
quelle
Die Autorenfrage möchte die Audiodatei schleifen, während das Video noch nicht fertig ist. Funktioniert das dafür?
Rafael Sanches
@ RafaelSanches Nein, tut er nicht.
Zurechtweiser
Der Autor möchte das Audio nicht schleifen. Diese Antwort ist auch die einzig richtige, die das tut, was das OP verlangt hat. Beenden Sie das Video, wenn das Eingangsvideo endet.
Roel Van de Paar