ffmpeg add audio but keep video length the same (not -shortest)

11

6

I'm adding audio to a video file using ffmpeg like so

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

However this extends the output video file to be the length of the audio file if it is longer than the video. Using -shortest cuts the video file short if the audio file is shorter than the video. So is there a flag to tell ffmpeg to cut the keep the length of the output video to the length of the input video?

stealthcopter

Posted 2014-08-22T12:18:10.873

Reputation: 210

Please select a correct answer. The only real correct one is the one by @Zurechtweiser. – Roel Van de Paar – 2019-05-31T02:46:50.403

Answers

13

I believe you can achieve your desired aim by using the -filter_complex option and the apad filter option to pad out your audio with silence at the end if the video is longer. Your command would be:

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

This assumes the audio you want is in the first stream of audiofile.wav, the [A:B] syntax says to take the B'th stream from the A'th input (both starting with 0, so [1:0] is the 1st stream from the 2nd input, or audiofile.wav above).

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

deadcode

Posted 2014-08-22T12:18:10.873

Reputation: 295

You should mention, that the -filter_complex option forces reencoding - it is e.g. possible to run ffmpeg -i videofile.mp4 -i audiofile.wav -c:v copy output.mp4 but not ffmpeg -i videofile.mp4 -i audiofile.wav -filter_complex " [1:0] apad " -c:v copy -shortest output.mp4 – Eugen Rieck – 2018-06-20T11:31:02.853

This is the opposite answer of what is requested. OP asks to end video when audio ends, the answer given is to add audio silence if the audio is shorter then the video. This answer is incorrect. – Roel Van de Paar – 2019-05-31T02:43:04.143

It's not "the opposite" of what the OP requested. The OPs wants the output video to be the length of the input video, regardless of the length of the audio track. My answer addresses the circumstance where the input video is longer than audio file. The OP already has a solution for when the input video is shorter than the audio file, which is to use -shortest. – deadcode – 2019-05-31T06:10:33.570

11

  • If video length is shorter than audio length, -shortest is what you want.
  • If video length is longer than audio length, no flag at all will be what you want.

There is no flag to automate this decision.

EDIT

Inspired by @deadcode's answer, I need to make clear, that "no flag to automate" is of course not true, if you are willing to reencode: In this case go with apad as suggested by @deadcode.

If however you want to avoid reencoding (i.e. -c:v copy) the answer stands.

There is a workaround using the ffconcat demuxer, but it needs a bit of work:

  • create a file containing silence in exactly the same format as your audiofile ("silence.wav")
  • create a concat file "audio.ffconcat" (with as many silence lines as you need to make sure your audio is long enough):

.

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

This will synthesize the apad filter without a filter graph, thus allowing a mux without reencoding.

Eugen Rieck

Posted 2014-08-22T12:18:10.873

Reputation: 15 128

@RoelVandePaar As I said: If video length is shorter than audio length use -shortest, else use this workaround if you want to add silence without reencoding. – Eugen Rieck – 2019-05-31T08:31:03.730

Correct, missed that on review. Removed input. Feel free to do the same. – Roel Van de Paar – 2019-05-31T08:39:56.310

3

If you know the length of your video-file, you can accomplish that by using

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

Where 43 is the length of your video-file in seconds.

Zurechtweiser

Posted 2014-08-22T12:18:10.873

Reputation: 131

the author question wants to loop the audio file while the video hasn't finished. Does this work for that? – Rafael Sanches – 2017-04-19T18:34:56.713

@RafaelSanches No, he doesn't. – Zurechtweiser – 2017-04-29T22:42:41.400

The author doesn't want to loop the audio. This answer is also the only correct one which does what the OP was asking; end the video when the input video ends. – Roel Van de Paar – 2019-05-31T02:46:16.153