本文主要介绍在?FFmpeg
?命令中使用?silenceremove
?filter 进行音频静音的修剪。
参数名 | 说明 | 取值范围 | 默认值 |
---|---|---|---|
start_periods | 设置是否应在音频开头修剪音频。0 ?表示不应从一开始就修剪静音。当指定一个非?0 ?值时,它会修剪音频直到找到非静音。通常,当从音频的开头修剪静音时,start_periods 将为 1,但它可以增加到更高的值,以将所有音频修剪到非静音周期的特定计数。 | 0 ~ 9000 | 0 |
start_duration | 设置停止修剪音频之前必须检测到的非静音时长。通过加大该时长,可以将突发的噪音视为静音并进行修剪。(注意,一般使该值保持为?0 ,否则会有副作用。) | 0 ~ INT32_MAX(注意:传参可用多种格式) | 0 |
start_threshold | 设置应将哪些样本值视为静音。对于数字音频,值?0 ?可能没问题,但对于从模拟信号录制的音频,可能希望增加该值以考虑背景噪音。可以以?dB ?为单位指定(“dB”附加到值后面)或幅度比(amplitude ratio, 比如 0.001 实际上等价于 -60dB)。 | 0 ~ DBL_MAX | 0 |
start_silence | 设置在修剪后保留的最大静音时长。默认值为 0,这等于修剪所有检测为静音的样本。 | 0 ~ INT32_MAX(注意:传参可用多种格式) | 0 |
start_mode | 指定多声道音频开始处检测静音结束的模式。可以是?any ?或?all 。默认为?any , 表示对于任一声道被检测到非静音的样本都将导致停止修剪静音。对于?all ,则当所有通道都被检测为非静音时,才会导致停止修剪静音。 | any/all | any |
start_periods 决定了其他参数是否有效。
时长(duration)格式见:the Time duration section
参数名 | 说明 | 取值范围 | 默认值 |
---|---|---|---|
stop_periods | 设置从音频结尾开始修剪静音的计数。要从文件中间删除静音则指定为负值。负值将值视为正值并且像?start_periods ?那样重新开始处理,使其适用于消除音频中间的静音时间段。 | -9000 ~ 9000 | 0 |
stop_duration | 指定在不再复制(Copy,FFmpeg 内部处理模式分为裁剪(Trim)和复制(Copy)。)音频之前必须存在的静音时长。通过加大该时长,可以在音频中保留所需的静音。(注意,一般使该值保持为?0 ,否则会有副作用。) | 0 ~ INT32_MAX(注意:传参可用多种格式) | 0 |
stop_threshold | 类似于?start_threshold ,但用于从音频末尾修剪静音。 | 0 ~ DBL_MAX | 0 |
stop_silence | 类似于?start_silence 。 | 0 ~ INT32_MAX(注意:传参可用多种格式) | 0 |
stop_mode | 指定多声道音频结尾处检测静音结束的模式。可以是?any ?或?all 。默认为?any , 表示对于任一声道被检测到非静音的样本都将导致停止修剪。对于?all ,则当所有通道都被检测为非静音时,才会导致停止修剪。 | any/all | any |
?stop_silence 决定了其他参数是否有效。
参数名 | 说明 | 取值范围 | 默认值 |
---|---|---|---|
detection | 指定音量的计算方式。rms ?表示使用均方根值(RMS)计算,?peak ?表示使用幅度值(amplitude)计算。 | rms/peak | rms |
window | 指定使用滑动窗口计算音量的窗口大小。单位为秒。由?detection ?决定计算方式。 | 0 ~ 10 | 0.02 |
使用 Audition 之类的软件录制一段音频,然后将背景噪音用静音替换。
ffmpeg -hide_banner -loglevel warning -i "Test.wav" -filter_complex "silenceremove=start_periods=1:start_duration=0.2:start_threshold=-50dB:detection=peak" -ar 44100 -ac 2 -b:a 96k "Test-RemoveSilence01_01.ogg" -y
参数说明:
0.2
?秒的非静音数据则停止移除。-50dB
?认为是静音。结果展示:
ffmpeg -hide_banner -loglevel warning -i "Test.wav" -filter_complex "silenceremove=start_periods=1:start_duration=0:start_threshold=-50dB:start_silence=0.5:detection=peak" -ar 44100 -ac 2 -b:a 96k "Test-RemoveSilence02_01.ogg" -y
参数说明:
-50dB
?认为是静音。0.5
?秒的静音。ffmpeg -hide_banner -loglevel warning -i "Test.wav" -filter_complex "silenceremove=start_periods=3:start_duration=0.38:start_threshold=-50dB:detection=peak" -ar 44100 -ac 2 -b:a 96k "Test-RemoveSilence03_01.ogg" -y
参数说明:
0.38
?秒的非静音数据则停止移除。注意不要设置过小,否则会快速消耗掉?start_periods
。-50dB
?认为是静音。直接使用?stop_periods
?试验未成功。采取两次翻转的低效方式。首先翻转并移除首部(也就是翻转之前的尾部)静音,然后再翻转回来。
ffmpeg -hide_banner -loglevel warning -i "Test.wav" -filter_complex "areverse,silenceremove=start_periods=1:start_duration=0:start_threshold=-50dB:detection=peak,areverse" -ar 44100 -ac 2 "Test-RemoveSilence04_01.wav" -y
问题:
areverse
?版生成?ogg
?文件有警告:[libvorbis @ 0x14f025400] Queue input is backward in time。Audition 打开也提示有错。原因暂未知。改为输出?wav
?没问题。?
参数说明:
结果展示:
?如下代码设置?stop_periods
?为?1
?不成功,-1
?则文件中间的静音也被移除。
ffmpeg -hide_banner -loglevel warning -i "Test.wav" -filter_complex "silenceremove=stop_periods=-1:stop_duration=0:stop_threshold=-50dB:detection=peak" -ar 44100 -ac 2 -b:a 96k "Test-RemoveSilence04_02.ogg" -y
不使用?stop_periods
?的原因同 4。
首先移除首部静音,翻转并再次移除首部(也就是翻转之前的尾部)静音,最后再翻转回来。
ffmpeg -hide_banner -loglevel warning -i "Test.wav" -filter_complex "silenceremove=start_periods=1:start_duration=0:start_threshold=-50dB:detection=peak,areverse,silenceremove=start_periods=1:start_duration=0:start_threshold=-50dB:detection=peak,areverse" -ar 44100 -ac 2 "Test-RemoveSilence05_01.wav" -y
问题:
areverse
?版生成?ogg
?文件有警告:[libvorbis @ 0x14f025400] Queue input is backward in time。Audition 打开也提示有错。原因暂未知。改为输出?wav
?没问题。?
参数说明:
结果展示:
ffmpeg -hide_banner -loglevel warning -i "Test.wav" -filter_complex "silenceremove=stop_periods=-1:stop_duration=0:stop_threshold=-50dB:detection=peak" -ar 44100 -ac 2 -b:a 96k "Test-RemoveSilence06_01.ogg" -y
参数说明:
结果展示:
不管是首尾还是中间的移除都不是很干净。改用如下参数:
ffmpeg -hide_banner -loglevel warning -i "Test.wav" -filter_complex "silenceremove=start_periods=1:start_duration=0:start_threshold=-50dB:stop_periods=-1:stop_duration=0:stop_threshold=-50dB:detection=peak" -ar 44100 -ac 2 -b:a 96k "Test-RemoveSilence06_02.ogg" -y
?结果展示:
首尾和中间干净了,尾部依然不够干净。改用如下参数:
ffmpeg -hide_banner -loglevel warning -i "Test.wav" -filter_complex "silenceremove=start_periods=1:start_duration=0:start_threshold=-50dB:stop_periods=-1:stop_duration=0:stop_threshold=-50dB:detection=peak,areverse,silenceremove=start_periods=1:start_duration=0:start_threshold=-50dB:detection=peak,areverse" -ar 44100 -ac 2 "Test-RemoveSilence06_03.wav" -y
问题:areverse
?版生成?ogg
?文件有警告:[libvorbis @ 0x14f025400] Queue input is backward in time。Audition 打开也提示有错。原因暂未知。改为输出?wav
?没问题。
?首尾和中间依然干净,但尾部依然还是有一丝丝不干净,不过也勉强能够接受。
如果要在首尾保留?0.5
?秒的静音:
ffmpeg -hide_banner -loglevel warning -i "Test.wav" -filter_complex "silenceremove=start_periods=1:start_duration=0:start_threshold=-50dB:start_silence=0.5:stop_periods=-1:stop_duration=0:stop_threshold=-50dB:detection=peak,areverse,silenceremove=start_periods=1:start_duration=0:start_threshold=-50dB:start_silence=0.5:detection=peak,areverse" -ar 44100 -ac 2 "Test-RemoveSilence07_01.wav" -y
问题:areverse
?版生成?ogg
?文件有警告:[libvorbis @ 0x14f025400] Queue input is backward in time。Audition 打开也提示有错。原因暂未知。改为输出?wav
?没问题。
除了首部,中间也多了0.5
?秒的静音,并且结尾处并不是很完美。
中间的静音超过?1.5
?秒则移除并且保留?1.5
?秒;头部保留?0.5
?秒静音;尾部不保留静音。第一次使用?silenceremove
?会在首部保留?1.5
?秒,第二次使用?silenceremove
?能够将首部静音缩减为?0.5
?秒。
ffmpeg -hide_banner -loglevel warning -i "Test.wav" -filter_complex "silenceremove=start_periods=1:start_duration=0:start_threshold=-50dB:start_silence=1.5:stop_periods=-1:stop_duration=0:stop_threshold=-50dB:stop_silence=1.5:detection=peak,silenceremove=start_periods=1:start_duration=0:start_threshold=-50dB:start_silence=0.5:detection=peak" -ar 44100 -ac 2 "Test-RemoveSilence08_01.wav" -y
start_silence
?和?stop_silence
?都需要设置为?1.5
;
如果提供了?start_duration
?和?stop_duration
?参数则需要设置为?0
。
除了尾部稍有不净,基本能达到目的。
该方法不适用于首部保留静音比中间保留静音多的情况,也不适用于尾部稍微保留静音的情况。
FFmpeg项目由 Fabrice Bellard在2000年创立。到目前为止,FFmpeg项目的开发者仍然与VLC、MPV、dav1d、x264等多媒体开源项目有着广泛的重叠。Ffmpeg(FastForward Mpeg)是一款遵循GPL的开源软件,在音视频处理方面表现十分优秀,几乎囊括了现存所有的视音频格式的编码,解码、转码、混合、过滤及播放。作为最受欢迎的视频和图像处理软件,它被来自各行各业的不同公司所广泛使用。同时也是一款跨平台的软件,完美兼容Linux、Windows、Mac OSX等平台。其实它由3大部件组成,号称音视频处理工具三剑客:
???????Ffmpeg 应该是 FFmpeg 工具集中最核心的利器,支持多种多样的编码器、解码器、封装格式、滤镜功能。FFmpeg框架的基本组成包含AVFormat、AVCodec、AVFilter、AVDevice、AVUtil等模块库,结构图如下:
AVFormat中实现了目前多媒体领域中的绝大多数媒体封装格式,包括封装和解封装,如MP4、FLV、KV、TS等文件封装格式,RTMP、RTSP、MMS、HLS等网络协议封装格式。FFmpeg是否支持某种媒体封装格式,取决于编译时是否包含了该格式的封装库。根据实际需求,可进行媒体封装格式的扩展,增加自己定制的封装格式,即在AVFormat中增加自己的封装处理模块。
AVCodec中实现了目前多媒体领域绝大多数常用的编解码格式,即支持编码,也支持解码。AVCodec除了支持MPEG4、AAC、MJPEG等自带的媒体编解码格式之外,还支持第三方的编解码器,如H.264(AVC)编码,需要使用x264编码器;H.265(HEVC)编码,需要使用x264编码器;MP3(mp3lame)编码,需要使用libmp3lame编码器。如果希望增加自己的编码格式,或者硬件编解码,则需要在AVCodec中增加相应的编解码模块。
AVFilter库提供了一个通用的音频、视频、字幕等滤镜处理框架。在AVFilter中,滤镜框架可以有多个输入和多个输出。
swresample模块提供了高级别的音频重采样API。例如允许操作音频采样、音频通道布局转换与布局调整。
swscale模块提供了高级别的图像转换API,例如它允许进行图像缩放和像素格式转换,常见于将图像从1080p转换成720p或者480p等的缩放,或者将图像数据从YUV420p转换成YUYV,或者YUV转RGB等图像格式转换。
对于输入,以下选项通常是自动识别的,但也可以强制设定。
FFMPEG的某些选项可以对一个特定的媒体流起作用,这种情况下需要在选项后面增加一个流标识。流标识允许以下几种格式:
假如要设定第二个音频流为copy,则需要指定-codec:a:1 copy
-filter_simple 添加简单滤镜
-filter_complex FILTER 添加复杂滤镜
简单的说,ffprobe 是一个多媒体流分析工具。它从多媒体流中收集信息,并且以人类和机器可读的形式打印出来。它可以用来检测多媒体流的容器类型,以及每一个多媒体流的格式和类型。它可以作为一个独立的应用来使用,也可以结合文本过滤器执行更复杂的处理。