通过FFmpeg为音频增加1秒的静音


14

我有一个AC3 5.1音频文件,我想在其中插入x秒的无声音频。这与视频混合无关,因此它的偏移量是无用的,因为它似乎仅与伴随视频的音频流一起工作。我想用ffmpeg实现。有任何想法吗?


ffmpeg会追加或加入相同编解码器的相同速率的东西吗?
Psycogeek 2013年

我想... @Psycogeek
Makaveli84

它能够生成完全相同的编解码器速率和通道的无声音频文件吗?ffmpeg.org/ffmpeg-filters.html#Examples-34吗?我自己使用GUI方法,但是只要参数都相同,执行您的请求就应该相当容易且非常快捷。这是将其添加到Mov的地方。stackoverflow.com/questions/12368151/…在答案中
Psycogeek

使用Ardor添加所需的任何内容。如果你想要的效果,以及下载插件小牛..
仪表盘

Answers:


23

使用concat多路分配器(在开始和/或结束处添加静音)

如果要避免对主段进行重新编码,请使用concat多路分配器。此方法可为开始或结束(或两者)添加静音。

  1. 使用anullsrc音频源过滤器来创建无声音频。您需要匹配主音频文件的格式,通道布局和采样率。制作一个5.1声道,48000 Hz采样率,1秒无声AC3音频文件的示例(因为这是问题格式):

    ffmpeg -f lavfi -i anullsrc=channel_layout=5.1:sample_rate=48000 -t 1 silence.ac3
    
  2. 现在,创建一个名为的文本文件input.txt,其中列出了要串联的文件:

    file 'silent.ac3'
    file 'main.ac3'
    

    如果您想在最后保持静音,则只需切换中的文件顺序即可input.txt

  3. 现在,您可以使用concat demuxer连接文件:

    ffmpeg -f concat -i input.txt -codec copy output.ac3
    

使用concat过滤器(在开始和/或结束处添加静音)

如果要在一个命令中执行所有操作,或者要输出为与输入不同的格式,请使用concat过滤器(因为此方法仍然会重新编码)。此方法可为开始或结束或两者同时添加静音。

在立体声44100 Hz采样率输入的开头增加1秒的静音的示例:

ffmpeg -f lavfi -t 1 -i anullsrc=channel_layout=stereo:sample_rate=44100 -i audio.oga -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1" output.m4a
  • 过滤将导致重新编码,而concat多路分配器则不会。

  • 在anullsrc中,建议匹配通道布局和输入的采样率。

  • 如果要在最后添加静音,则只需切换指定给concat过滤器的输入顺序即可[1:a][0:a]concat=n=2:v=0:a=1


使用adelay过滤器(在开始时添加静音)

如果要在一个命令中执行所有操作,或者要输出为与输入不同的格式,请使用adelay音频过滤器(因为此方法始终会重新编码)。这仅适用于在文件开头添加静音。

此示例将为立体声输入的开头增加1秒的静音:

ffmpeg -i input.flac -af "adelay=1000|1000" output.opus
  • 过滤将导致重新编码,而concat多路分配器则不会。
  • 值以毫秒为单位。使用最新版本(当前git master或FFmpeg 4.1或更高版本)的用户可以使用1s一秒钟。
  • 每个通道都需要自己的延迟。例如,将使用mono输入adelay=1000,而使用5.1输入adelay=1000|1000|1000|1000|1000|1000

使用apad过滤器(最后添加静音)

如果要在一个命令中执行所有操作,或者要输出为与输入不同的格式,请使用apad音频过滤器(因为此方法始终会重新编码)。这仅可在文件末尾添加静音。

此示例将在末尾添加1秒的静音:

ffmpeg -i input.wav -af "apad=pad_dur=1" output.m4a
  • 过滤将导致重新编码,而concat多路分配器则不会。

  • pad_dur选项是在FFmpeg 4.1发行后添加的,因此您将需要使用git master分支中的最新版本或等待FFmpeg 4.2。


5
[Parsed_aevalsrc_0 @ 000000000195fec0] This syntax is deprecated. Use '|' to sep arate the list items.新语法是-i "aevalsrc=0|0|0|0|0|0:d=1"
Steven Penny

我可以一次对多个文件执行此操作吗?
亚伦·弗兰克

@AaronFranke是的,但是ffmpeg本身没有这种功能。您将必须使用Shell或脚本语言来循环命令。您的操作系统未知,因此我无法为您提供交钥匙解决方案,但请参阅如何使用ffmpeg转换整个目录?以获得一些一般信息(跳过不必要的复杂和低效的答案)。
llogan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.