22

With ffmpeg, I see how to add music file as background for a video, but the problem is how to make the audio loop/repeat. Is there a way out?

Paul R
  • 208,748
  • 37
  • 389
  • 560
象嘉道
  • 3,657
  • 5
  • 33
  • 49
  • I don't think so. I think you'll have to generate your looping audio track offline before combining it with the video – rupello Jun 11 '11 at 00:08
  • Option -stream_loop for ffmpeg exists since dbb03b8e, as per https://trac.ffmpeg.org/ticket/2584 – jamadagni May 23 '18 at 13:48

2 Answers2

29

ffmpeg has the promising -loop_input flag, but it doesn't support audio inputs yet.

I'd recommend sox and the -shortest option for ffmpeg as a solution.

sox short_audio.mp3 looped_audio.mp3 repeat 1000 # adjust count as necessary
ffmpeg -i input_video.mp4 -i looped_audio.mp3 -shortest output_video.mp4

The sox command will loop the input, and the ffmpeg command will use it for the audio, but stop when it runs out of video to process.

blahdiblah
  • 33,069
  • 21
  • 98
  • 152
  • 6
    `-i` parameter is deprecated in sox. Is is properly to use `-e ima-adpcm` instead. – Ivan Kochurkin Mar 08 '13 at 20:51
  • @blahdiblah can you tell me what is short_audio.mp3 and what is looped_audio.mp3 from my thinking short_audio.mp3 is **input path** from local and looped_audio.mp3 is **out put file** to stored looped sound then after later looped_audio.mp3 will be use to merge video am i right ? – ND1010_ Mar 01 '18 at 05:09
  • how to Looping music over video? – ajay dhadhal Jan 26 '19 at 13:18
  • 1
    Old reply now no longer relevant. Ref below. – Roel Van de Paar May 31 '19 at 02:14
  • Please note that for large files, this process will be very slow. You can use -c:v copy to stream copy (mux) the video. No re-encoding of the video occurs. Quality is preserved and the process is fast. [For more details, see @llogan 's answer on https://stackoverflow.com/questions/11779490/how-to-add-a-new-audio-not-mixing-into-a-video-using-ffmpeg] – iamakhilverma Jan 10 '22 at 12:03
14

I ran into the same problem and managed to do it by using ffmpeg and concat[enate] filter. Here is an example of how to loop it three times:

ffmpeg -i audio.wav -filter_complex "[0:a]afifo[a0];[0:a]afifo[a1];[0:a]afifo[a2];[a0][a1][a2]concat=n=3:v=0:a=1[a]" -map "[a]" out.wav

Edited (23/12/2020)

In addition to the above, another super easy 2 methods :

1st method : with audio output SIZE defined.

meaning : it will repeat / concatenate "MyAudio.mp3" till it reaches size of 10M and stop ( you will need to calculate end size yourself )

ffmpeg -stream_loop -1 -i "MyAudio.mp3" -fs 10M -c copy "MyRepeatingAudio.mp4"

2nd method : with NO output SIZE defined ( you will need to stop process, CTRL+C once it reaches required size

ffmpeg -stream_loop -1 -i "MyAudio.mp3" -c copy "MyRepeatingAudio.mp4"

Please note that above methods are also for REPEATING VIDEOS

3rd-party edit (15/09/2021)

This command adds repeating audio to a video in a single step:

ffmpeg -i input.mp4 -stream_loop -1 -i audio.mp4 -shortest \
    -map 0:v:0 -map 1:a:0 -c:v copy output.mp4
Sam Watkins
  • 7,819
  • 3
  • 38
  • 38
nanestev
  • 822
  • 8
  • 15
  • 7
    This is a direct cmd: `ffmpeg -lavfi "amovie=audio.wav:loop=3" out.wav` – Gyan Jun 08 '16 at 18:13
  • @Mulvya, thanks. Unfortunately, it doesn't work for me. I'm using the latest static linked build of ffmpeg for Windows and when I try the command you shared it gives me: [auto-inserted resampler 0 @ 00000000025fc0a0] Channel layout change is not supported Error while filtering: Not yet implemented in FFmpeg, patches welcome – nanestev Jun 09 '16 at 09:52
  • Share the full console output. – Gyan Jun 09 '16 at 10:03
  • Here it is - http://take.ms/QAWmk – nanestev Jun 09 '16 at 11:05
  • What is the channel layout of track1? – Gyan Jun 09 '16 at 11:18
  • ffmpeg -i "track1.wav" /b /o:gn says 2 channels, so it's stereo. – nanestev Jun 09 '16 at 12:14
  • See here, you can use asplit: https://ffmpeg.org/ffmpeg-filters.html#Examples-120 `[in] asplit=3 [out0][out1][out2]` – M3D Aug 06 '17 at 22:57
  • @nanestev excellent command. This was the only thing I could get to work in a complex ffmpeg command (and I tried a lot) to merge various video's with repeated audio. For some reason the `loop` (and `aloop`) commands were not working for me. For anyone reading this, note that you can add the filter_complex string at the end of an existing video-merging filter_complex string simply separating it with a semicolon. i.e. `-filter_complex "....your_existing_filter_complex...;[0:a]afifo[a0]; ... etc"`. Thanks again. – Roel Van de Paar May 31 '19 at 02:14
  • And (thank you!) this made me realize there is another better way still, which also seems to avoid some "[out_0_1 @ 0x55f6ec424340] 10000 buffers queued in out_0_1, something may be wrong." ffmpeg errors with the above command, and you can do it like this; specify multiple audio inputs, then merge them, i.e. `ffmpeg -i audio.mp3 -i audio.mp3 -i video1.mp4 -i video2.mp4 -filter_complex "[2:v][3:v]concat=n=2:v=1:a=0[v];[0:a][1:a]concat=n=2:v=0:a=1[a]" -shortest -map "[v]" -map '[a]' "out.mp4"` - just make sure enough audio is there to cover the video! Enjoy! – Roel Van de Paar May 31 '19 at 02:19
  • Hrm. -shortest does not work in this case. See long standing bug: https://trac.ffmpeg.org/ticket/3789 – Roel Van de Paar May 31 '19 at 02:53