55

I'm trying to use ffmpeg to add a silent audio track to a MOV file.

I created a silent audio track longer than the video, and intend to use the -shortest option with ffmpeg.

Using SoX v14.3.1, I run this to generate a wav file:

sox -n -r 44100 -b 16 -c 2 -L silence.wav trim 0.0 60.000

# -n  = Sox's null file
# -r = sample rate 
# -b = bits per sample
# -c = num of channels
# -L = little endian
# filename
# trim - is an effect, args start and length.

My basic ffmpeg command looks like this:

ffmpeg -shortest \
-i silence.wav -acodec pcm_s16le \
-i vid_no_sound.mov -vcodec copy vid_with_sound.mov

The result of this is:

ffmpeg version 0.11.1 Copyright (c) 2000-2012 the FFmpeg developers
  built on Aug 27 2012 13:11:25 with gcc 4.4.5
  configuration: --extra-cflags=-static --prefix=/root/ffmpeg_build/src/ffmpeg-0.11.1 --enable-bzlib --enable-gnutls --enable-libfreetype --enable-libmp3lame --enable-libdc1394 --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-openssl --enable-zlib --enable-gpl --enable-nonfree --enable-version3
  libavutil      51. 54.100 / 51. 54.100
  libavcodec     54. 23.100 / 54. 23.100
  libavformat    54.  6.100 / 54.  6.100
  libavdevice    54.  0.100 / 54.  0.100
  libavfilter     2. 77.100 /  2. 77.100
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0. 15.100 /  0. 15.100
  libpostproc    52.  0.100 / 52.  0.100
[wav @ 0x29ab2e0] max_analyze_duration 5000000 reached at 5015510
Guessed Channel Layout for  Input Stream #0.0 : stereo
Input #0, wav, from 'silence.wav':
  Duration: 00:01:00.00, bitrate: 1411 kb/s
    Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'vid_no_sound.mov':
  Metadata:
    major_brand     : qt
    minor_version   : 537199360
    compatible_brands: qt
    creation_time   : 2012-07-25 13:41:44
  Duration: 00:00:14.50, start: 0.000000, bitrate: 27457 kb/s
    Stream #1:0(eng): Video: qtrle (rle  / 0x20656C72), rgb24, 1920x1080, 27450 kb/s, SAR 1920:1920 DAR 16:9, 24 fps, 24 tbr, 24 tbn, 24 tbc
    Metadata:
      creation_time   : 2012-07-25 13:41:44
      handler_name    : Apple Alias Data Handler
    Stream #1:1(eng): Data: none (tmcd / 0x64636D74)
    Metadata:
      creation_time   : 2012-07-25 13:42:06
      handler_name    : Apple Alias Data Handler
      timecode        : 00:00:00:00
File 'vid_with_sound.mov' already exists. Overwrite ? [y/N] y
auto-inserting filter 'auto-inserted resampler 0' between the filter 'src' and the filter 'aformat'
[aresample @ 0x2ab3b00] chl:stereo fmt:s16 r:44100Hz -> chl:stereo fmt:flt r:44100Hz
[NULL @ 0x2994320] Codec is experimental but experimental codecs are not enabled, try -strict -2
Output #0, mov, to 'vid_with_sound.mov':
    Stream #0:0(eng): Video: qtrle (rle  / 0x20656C72), rgb24, 1920x1080 [SAR 1920:1920 DAR 16:9], q=2-31, 27450 kb/s, 24 fps, 90k tbn, 24 tbc
    Metadata:
      creation_time   : 2012-07-25 13:41:44
      handler_name    : Apple Alias Data Handler
    Stream #0:1: Audio: none, 44100 Hz, stereo, flt, 128 kb/s
Stream mapping:
  Stream #1:0 -> #0:0 (copy)
  Stream #0:0 -> #0:1 (pcm_s16le -> aac)
Error while opening encoder for output stream #0:1 - maybe incorrect parameters such as bit_rate, rate, width or height

I have tried adding the -strict -2 as suggested, although I am not sure where to put it in the command line.

I've spent two hours trying different things and reading ffmpeg documentation, but I'm still stuck.

How do I add a silent audio track to a mov file?

llogan
  • 87,794
  • 21
  • 166
  • 190
jon
  • 5,300
  • 4
  • 24
  • 34

4 Answers4

123

anullsrc audio filter

You can use ffmpeg to create the silent audio and combine it with a video in one step. This example will use the anullsrc audio filter to generate stereo silent audio with a sample rate of 44100:

ffmpeg -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -i video.mov -c:v copy -c:a aac -shortest output.mov
  • channel_layout=stereo:sample_rate=44100 is the default, but I included it just as an example of how to use these options.

Ignoring existing audio

If your video input file has audio that you want to ignore then use the -map option to override the default stream selection behavior:

ffmpeg -f lavfi -i anullsrc -i video.mov -c:v copy -c:a aac -map 0:a -map 1:v -shortest output.mp4
  • -map 0:a -map 1:v can be translated as: from the first input (0) use the audio (a), and from the second input (1) use the video (v).

Notes

  • These examples will stream copy the video so it does not get re-encoded (like a "copy and paste").

  • It is always recommended to use a recent ffmpeg. Links to recent builds are on the FFmpeg Download page or you can refer to a step-by-step guide to compile ffmpeg.

llogan
  • 87,794
  • 21
  • 166
  • 190
  • 2
    `/dev/zero` works in `avconv` too, but `-f lavfi` doesn't seem to. Don't forget the `-shortest` flag, or it will sit there forever encoding silence. – z0r Mar 05 '14 at 07:59
  • 1
    if i want to just add silent where audio not available then what to do ? for example when recording desktop audio ? – Ahmad Jul 31 '17 at 07:43
  • @Ahmad Sorry, but I don't understand your question. – llogan Jul 31 '17 at 16:36
  • 1
    @LordNeckbeard I am saying that i am recording desktop audio from virtual-audio-capturer and it start desktop recording when desktop producing some sound so is it possible to create silent sound while sound is not coming from desktop or any method which create silent audio all the while recording happens and record desktop as well – Ahmad Aug 01 '17 at 05:59
  • It's not very clear from the original post but it seems by saying "I created a silent audio track longer than the video" they meant they want to append some silence to the end of an existing movie. This is exactly what I am looking for while keeping the last movie frame as is. So how would you appending 2 seconds silence an existing .MP4 ? thank you. – Meryan Feb 06 '20 at 18:39
  • @Marie That is worth asking as a new question because the solution is different. – llogan Feb 06 '20 at 18:58
  • @llogan posted question here https://stackoverflow.com/questions/60133816/how-to-append-2-seconds-of-silence-to-an-existing-movie-mp4-with-ffmpeg Thank you. – Meryan Feb 09 '20 at 05:44
20

Here's a command for the latest ffmpeg, works with MP4 (H264/AVC):

ffmpeg -f lavfi -i aevalsrc=0 -i input.mp4 -c:v copy -c:a aac -map 0 -map 1:v -shortest output.mp4
llogan
  • 87,794
  • 21
  • 166
  • 190
PAStheLoD
  • 897
  • 10
  • 19
6

Create video from image or convert image into video then add slient audio using ffmpeg.

You can use the anullsrc audio source filter in ffmpeg. Example to make a 5.1 channel, 48000 Hz sample rate, 10 seconds silent video file from image:

ffmpeg -loop 1 -i img002.jpg -f lavfi -i anullsrc=channel_layout=5.1:sample_rate=48000 -t 10 -c:v libx264 -t 10 -pix_fmt yuv420p -vf scale=480:320 -y output.mp4

img002.jpg: Input image file

-i anullsrc: Add silent audio

-t 10: Number of seconds

scale=480:320: Video resolution width=420 and height=320

-y: Overwrite existing output file

output.mp4: Output file

Rahul Chauhan
  • 1,034
  • 11
  • 13
  • 1
    Is there any way to do this in a filter_complex for an intermediate output? – ed22 Sep 23 '20 at 08:57
  • @ed22 yes, surely! anullsrc can be used in a filter_complex chain. `-filter_complex "... anullsrc=cl=mono:r=44100[silence] ..."` I believe that is what you're looking for? – Sreenikethan I Dec 10 '20 at 19:27
  • Here's an example usage which I had tried: `ffmpeg -i input.mp4 -filter_complex "[0:v]scale=1920:1080[video_out]; anullsrc=cl=mono:r=44100[audio_out]" -map [video_out] -map [audio_out] -shortest output.mp4` – Sreenikethan I Dec 10 '20 at 19:30
2

Order matters. I have tried the sox command above and the ffmpeg command below and it works

ffmpeg -shortest -i silence.wav -acodec pcm_s16le -i out.mov -vcodec copy -strict -2 vid_with_sound.mov
av501
  • 6,339
  • 2
  • 18
  • 32