程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了FFmpeg 通过检测静音大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决FFmpeg 通过检测静音?

开发过程中遇到FFmpeg 通过检测静音的问题如何解决?下面主要结合日常开发的经验,给出你关于FFmpeg 通过检测静音的解决方法建议,希望对你解决FFmpeg 通过检测静音有所启发或帮助;

我有一个音频文件,有一些静音,我用 ffmpeg detectionsilence 检测,然后尝试用 removesilence 删除,但是有一些奇怪的行为。具体:

1) 基于 ffprobe show_streams 的文件基本信息

input #0,mp3,from 'my_file.mp3':
  Metadata:
    encoder         : Lavf58.64.100
  Duration: 00:00:25.22,start: 0.046042,bitrate: 32 kb/s
    Stream #0:0: Audio: mp3,24000 Hz,mono,fltp,32 kb/s

2) 使用检测静音

ffmpeg -i my_file.mp3 -af silencedetect=noise=-50dB:d=0.2 -f null -

我得到了这个结果

[mp3float @ 000001ee50074280] overread,skip -7 enddists: -1 -1
[silencedetect @ 000001ee5008a1c0] silence_start: 6.21417
[silencedetect @ 000001ee5008a1c0] silence_end: 6.91712 | silence_duration: 0.702958
[silencedetect @ 000001ee5008a1c0] silence_start: 16.44
[silencedetect @ 000001ee5008a1c0] silence_end: 17.1547 | silence_duration: 0.714708
[mp3float @ 000001ee50074280] overread,skip -10 enddists: -3 -3
[mp3float @ 000001ee50074280] overread,skip -5 enddists: -4 -4
[silencedetect @ 000001ee5008a1c0] silence_start: 24.4501
size=N/A time=00:00:25.17 bitrate=N/A speed=1.32e+03x
vIDeo:0kB audio:1180kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unkNown
[silencedetect @ 000001ee5008a1c0] silence_end: 25.176 | silence_duration: 0.725917

这也匹配基于 Adob​​e Audition 的值和点

FFmpeg 通过检测静音

到目前为止一切都很好。

3) 现在,根据一些计算(基于应用程序的逻辑,应该是音频的最终持续时间)我试图删除持续时间为“0.725917”的静音。为此,基于 ffmpeg 文档 (https://ffmpeg.org/ffmpeg-filters.html#silencedetect)

修剪从头到尾遇到的所有沉默,那里有更多 音频中超过 1 秒的静音: silentremove=stop_periods=-1:stop_duration=1:stop_threshold=-90dB

我运行这个命令

ffmpeg -i my_file.mp3 -af silenceremove=stop_periods=-1:stop_threshold=-50dB:stop_duration=0.72 result1.mp3

所以,我希望它应该只删除持续时间为“0.725917”的静音(上图中的最后一个),但是它删除了从 16.44 秒开始、持续时间为“0.714708”的静音。请看以下对比:

FFmpeg 通过检测静音

4)result1.mp3 上使用相同的选项运行检测静音会得到更奇怪的结果

ffmpeg -i result1.mp3 -af silencedetect=noise=-50dB:d=0.2 -f null -

结果

[mp3float @ 0000017723404280] overread,skip -5 enddists: -4 -4
[silencedetect @ 0000017723419540] silence_start: 6.21417
[silencedetect @ 0000017723419540] silence_end: 6.92462 | silence_duration: 0.710458
[mp3float @ 0000017723404280] overread,skip -7 enddists: -6 -6
[mp3float @ 0000017723404280] overread,skip -7 enddists: -2 -2
[mp3float @ 0000017723404280] overread,skip -6 enddists: -1 -1
    Last message repeated 1 times
[silencedetect @ 0000017723419540] silence_start: 23.7308
size=N/A time=00:00:24.45 bitrate=N/A speed=1.33e+03x
vIDeo:0kB audio:1146kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unkNown
[silencedetect @ 0000017723419540] silence_end: 24.456 | silence_duration: 0.725167

所以,结果是:

  • 使用命令删除超过“0.72 秒”的静音,“0.714708”的静音被删除 - 带有“0.725917”的静音保持原样(嗯,实际上改变了一点 - 根据第三点)
  • 从“6.21417”开始并持续时间为“0.702958”秒的第一个静音现在突然持续时间为“0.710458”秒
  • 从“24.4501”开始的第三次静音(现在从 23.7308 开始 - 显然是因为第二次静音被删除了)并且持续时间为“0.725917”,现在突然变成了“0.725167”(这不是大不同,但为什么即使删除其他沉默,这种沉默的持续时间也应该改变)。

相应的预期结果是:

  • 仅应删除与提供的条件 (stop_duration=0.72) 匹配的静音。在这个特定的例子中只有最后一个,但通常任何与长度条件匹配的静音 - 与它们的位置(开始、结束或中间)无关
  • 其他静音应保持与之前相同的确切持续时间

FFMpeg: 4.2.4-1ubuntu0.1,Ubuntu: 20.04.2

一些尝试和结果,同时使用 ffmpeg 选项

a)

ffmpeg -i my_file.mp3 -af silenceremove=stop_periods=-1:stop_threshold=-50dB:stop_duration=0.72:detection=peak tmp1.mp3

结果: 第一次和第二次沉默被移除,第三次沉默的持续时间保持不变

b)

ffmpeg -i my_file.mp3 -af silenceremove=stop_periods=-1:stop_threshold=-50dB:stop_duration=0.71 tmp_0.71.mp3

结果: 移除第一次和第二次静音,保留第三次静音,但持续时间变为“0.72075”s

C)

ffmpeg -i my_file.mp3 -af silenceremove=stop_periods=-1:stop_threshold=-50dB:stop_duration=0.7 tmp_0.7.mp3

结果: 所有 3 个静音都被移除

d) 边缘情况

此命令仍然删除第二个静音(之后第一个静音与 #4 完全相同,最后一个静音变为“0.721375”)

ffmpeg -i my_file.mp3 -af silenceremove=stop_periods=-1:stop_threshold=-50dB:stop_duration=0.72335499999 tmp_0.72335499999.mp3

但这一次,再次没有消除任何沉默:

ffmpeg -i my_file.mp3 -af silenceremove=stop_periods=-1:stop_threshold=-50dB:stop_duration=0.723355 tmp_0.723355.mp3

E) 窗口参数 case 0.03

ffmpeg -i my_file.mp3 -af silenceremove=stop_periods=-1:stop_threshold=-50dB:stop_duration=0.72:window=0.03 window_0.03.mp3

不会消除任何静音,但会检测静音

ffmpeg -i window_0.03.mp3 -af silencedetect=noise=-50dB:d=0.2 -f null -

给出这个结果(与 result1.mp3 中的静音比较 - 从 #4 点开始)

[mp3float @ 000001c5c8824280] overread,skip -5 enddists: -4 -4
[silencedetect @ 000001c5c883a040] silence_start: 6.21417
[silencedetect @ 000001c5c883a040] silence_end: 6.92462 | silence_duration: 0.710458
[mp3float @ 000001c5c8824280] overread,skip -7 enddists: -6 -6
[mp3float @ 000001c5c8824280] overread,skip -7 enddists: -2 -2
[silencedetect @ 000001c5c883a040] silence_start: 16.4424
[silencedetect @ 000001c5c883a040] silence_end: 17.1555 | silence_duration: 0.713167
[mp3float @ 000001c5c8824280] overread,skip -6 enddists: -1 -1
    Last message repeated 1 times
[silencedetect @ 000001c5c883a040] silence_start: 24.4508
size=N/A time=00:00:25.17 bitrate=N/A speed=1.24e+03x
vIDeo:0kB audio:1180kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unkNown
[silencedetect @ 000001c5c883a040] silence_end: 25.176 | silence_duration: 0.725167

f) 窗框 0.01

ffmpeg -i my_file.mp3 -af silenceremove=stop_periods=-1:stop_threshold=-50dB:stop_duration=0.72:window=0.01 window_0.01.mp3

删除第一次和第二次静音,相同参数的检测静音有以下结果

[mp3float @ 000001ea631d4280] overread,skip -5 enddists: -4 -4
    Last message repeated 1 times
[mp3float @ 000001ea631d4280] overread,skip -7 enddists: -2 -2
[mp3float @ 000001ea631d4280] overread,skip -6 enddists: -1 -1
    Last message repeated 1 times
[silencedetect @ 000001ea631ea1c0] silence_start: 23.0108
size=N/A time=00:00:23.73 bitrate=N/A speed=1.2e+03x
vIDeo:0kB audio:1113kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unkNown
[silencedetect @ 000001ea631ea1c0] silence_end: 23.736 | silence_duration: 0.725167

非常感谢任何想法、想法和观点。

解决方法

你有两件事:

  1. 您正在转换回 mp3(一种有损格式),这导致 result1.mp3 被重新编码并与完美剪辑略有不同。解决方法是使用 .wav(一种无损格式)。
  2. silenceremove 函数正在使用一个窗口,您需要将其设置为 0 以进行采样。
ffmpeg -i my_file.mp3 my_file.wav
ffmpeg -i my_file.wav -af silencedetect=noise=-50dB:d=0.2 -f null -
ffmpeg -i my_file.wav -af silenceremove=stop_periods=-1:stop_threshold=-50dB:stop_duration=0.72:window=0 result1.wav
ffmpeg -i result1.wav -af silencedetect=noise=-50dB:d=0.2 -f null -

最后一行的最终输出。我认为这是一个可靠的解决方案,因为静音开始和持续时间与剪切前的值完美匹配:

[silencedetect @ 0x5570a855b400] silence_start: 6.21417
[silencedetect @ 0x5570a855b400] silence_end: 6.91712 | silence_duration: 0.702958
[silencedetect @ 0x5570a855b400] silence_start: 16.44
[silencedetect @ 0x5570a855b400] silence_end: 17.1547 | silence_duration: 0.714708
size=N/A time=00:00:24.45 bitrate=N/A speed=4.49e+03x    

如果需要,您可以将其重新编码为 .mp3。

大佬总结

以上是大佬教程为你收集整理的FFmpeg 通过检测静音全部内容,希望文章能够帮你解决FFmpeg 通过检测静音所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: