我正试图在音频文件的末尾检测到沉默 我在 ffmpeg 库方面取得了一些进展。在这里,我使用 silencedetect 列出音频文件中的所有静音。
ffmpeg -i audio.wav -af silencedetect=n=-50dB:d=0.5 -f null - 2> /home/aliakber/log.txt
以下是命令的输出:
- 音频文件的前端和末尾静音 -
[silencedetect @ 0x1043060] silence_start: 0.484979
[silencedetect @ 0x1043060] silence_end: 1.36898 | silence_duration: 0.884
[silencedetect @ 0x1043060] silence_start: 2.57298
[silencedetect @ 0x1043060] silence_end: 3.48098 | silence_duration: 0.908
[silencedetect @ 0x1043060] silence_start: 4.75698
size=N/A time=00:00:05.56 bitrate=N/A
- 音频文件的正面和末尾没有静音 -
[silencedetect @ 0x106fd60] silence_start: 0.353333
[silencedetect @ 0x106fd60] silence_end: 1.25867 | silence_duration: 0.905333
[silencedetect @ 0x106fd60] silence_start: 2.46533
[silencedetect @ 0x106fd60] silence_end: 3.37067 | silence_duration: 0.905333
size=N/A time=00:00:04.61 bitrate=N/A
但我想要一些更灵活的东西,以便我可以根据结果操纵输出并做更多任务 我希望输出类似 true 或 false 的输出。如果音频文件末尾存在一定的静音时间,则会返回 true 和 false 。
有人可以建议我一个简单的方法来实现这个目标吗?
答案 0 :(得分:6)
试试这个:
ffmpeg -i audio.wav -af silencedetect=n=-50dB:d=0.5 -f null - 2>&1 | grep -Eo "silence_(start|end)" | tail -n 1 | grep "start" | wc -l
<强>输出强>:
1
- 最后有沉默0
- 最后没有沉默 <强>解释强>:
正如我在沉默案例中看到的那样,日志末尾没有silence_end
。
2>&1
- 将stderr
重定向到stdin
grep -Eo "silence_(start|end)"
- 过滤日志并仅保留日志中的silence_start
和silence_end
。每个都由新行。tail -n 1
- 获取最后一行。 (如果是的话。现在我们有三种状态:'silence_start'
,'silence_end'
,<empty>
) grep "start"
- 仅在包含start
的情况下保留行(2例:'silence_start'
,<empty>
) wc -l
- 获取行数。 (1
中的'silence_start'
和0
案例中的<empty>