大佬教程收集整理的这篇文章主要介绍了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
这也匹配基于 Adobe Audition 的值和点
到目前为止一切都很好。
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”的静音。请看以下对比:
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
所以,结果是:
相应的预期结果是:
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
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
非常感谢任何想法、想法和观点。
你有两件事:
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,请注明来意。