在FFmpeg中添加无声音频

74

我想使用ffmpeg为MOV文件增加一个无声音轨。

我创建了一个比视频更长的无声音轨,并打算使用ffmpeg的-shortest选项。

使用SoX v14.3.1,我运行以下命令生成wav文件:

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.

我的基本ffmpeg命令如下:

ffmpeg -shortest \
-i silence.wav -acodec pcm_s16le \
-i vid_no_sound.mov -vcodec copy vid_with_sound.mov
这的结果是:
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

我尝试按照建议添加-strict -2,但是我不确定在命令行中应该放在哪里。

我已经尝试了两个小时不同的方法,并阅读了ffmpeg文档,但还是无法解决问题。

如何给mov文件添加一个静音音轨?

5个回答

154

anullsrc音频滤镜

您可以使用ffmpeg一步创建无声音频并将其与视频组合。此示例将使用anullsrc音频滤镜生成采样率为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 是默认设置,但我将其包含在内,只是作为如何使用这些选项的示例。

忽略现有音频

如果您的视频输入文件具有要忽略的音频,则使用-map选项覆盖默认的stream selection行为:

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 可以翻译为:从第一个输入 (0) 使用音频 (a),从第二个输入 (1) 使用视频 (v)。

注意事项

  • 这些示例将流复制视频,因此不会重新编码(就像“复制和粘贴”一样)。

  • 建议始终使用最新的ffmpeg。最近版本的链接在FFmpeg下载页面上,或者您可以参考逐步编译ffmpeg的指南


4
/dev/zeroavconv 中也可以使用,但 -f lavfi 似乎不行。别忘了加上 -shortest 标志,否则它会一直编码静音。 - z0r
1
如果我想在音频不可用的地方添加静音,该怎么办?例如,在录制桌面音频时? - Ahmad
@Ahmad 抱歉,我不理解你的问题。 - llogan
1
@LordNeckbeard,我的意思是我正在使用虚拟音频捕获器录制桌面音频,并且当桌面产生一些声音时开始录制桌面。因此,在没有声音从桌面发出或任何创建静音音频的方法的情况下,是否有可能在记录发生时记录桌面? - Ahmad
1
@llogan,您能否解释一下“-f lavfi”的作用? - joedotnot
显示剩余4条评论

23
这里是一个针对最新的ffmpeg的命令,适用于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

6
如果我想给没有声音的视频添加静音音频,该怎么办? - Ahmad

8

使用ffmpeg创建视频或将图片转换为视频,然后添加静音音频。

您可以在ffmpeg中使用anullsrc音频源过滤器。以下是一个示例,从图像制作一个5.1声道、48000 Hz采样率、10秒的静音视频文件:

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:输入图像文件

-i anullsrc:添加静音音频

-t 10:持续时间为10秒

scale = 480:320:视频分辨率宽度为480,高度为320

-y:覆盖现有的输出文件

output.mp4:输出文件


1
有没有办法在 filter_complex 中进行中间输出? - ed22
@ed22 是的,当然可以!anullsrc 可以在 filter_complex 链中使用。-filter_complex "... anullsrc=cl=mono:r=44100[silence] ..." 我相信这就是你要找的东西了吧? - Sreenikethan I
这是一个我尝试过的示例用法: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

5

目前为止我发现的针对ffmpeg版本>4.2的最简单方法:

在开头添加静默:

ffmpeg -i audio_in.wav -af areverse,apad=pad_dur=1s,areverse audio_out.wav

在结尾处添加静音:

ffmpeg -i audio_in.wav -af apad=pad_dur=1s audio_out.wav

这将会在音频中添加1秒的静音。


从 https://superuser.com/a/579110/19792 看来,您可以使用 adelay 来添加静音。请注意,这个问题是关于添加无声音轨的,但您的答案可能对许多搜索者有用。 - mwfearnley
1
奇怪的是,areverse,apad,areverse 这种方法是我唯一有效的方法。我正在使用 ffmpeg wasm,但无论我做什么,adelay 都不起作用,但这种奇怪的反向方法确实可以。 - Matthew

2

顺序很重要。我已经尝试了上面的sox命令和下面的ffmpeg命令,它可以工作。

ffmpeg -shortest -i silence.wav -acodec pcm_s16le -i out.mov -vcodec copy -strict -2 vid_with_sound.mov

4
次序的重要性体现在哪些方面——错误的次序会带来什么问题? - binki
FFmpeg 命令行参数的顺序很重要,否则它将无法正常工作。 - av501

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接