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?
Order matters. I have tried the sox command above and the ffmpeg command below and it works
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:
In case anyone else ends up here via "a search engine", here's a command for the latest ffmpeg, works with MP4 (H264/AVC):
anullsrc
audio filterYou can use
ffmpeg
to create the silent audio and combine it with a video in one step. This example will use theanullsrc
audio filter to generate stereo silent audio with a sample rate of 44100: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:-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 compileffmpeg
.If your
ffmpeg
is old, then you'll need to use-strict experimental
to use-c:a aac
.