如何检测音频文件末尾的静音?

时间:2017-02-28 11:43:42

标签: audio ffmpeg

我正试图在音频文件的末尾检测到沉默 我在 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

有人可以建议我一个简单的方法来实现这个目标吗?

1 个答案:

答案 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

  1. 2>&1 - 将stderr重定向到stdin
  2. grep -Eo "silence_(start|end)" - 过滤日志并仅保留日志中的silence_startsilence_end。每个都由新行。
  3. tail -n 1 - 获取最后一行。 (如果是的话。现在我们有三种状态:'silence_start''silence_end'<empty>
  4. grep "start" - 仅在包含start 的情况下保留行(2例:'silence_start'<empty>
  5. wc -l - 获取行数。 1中的'silence_start'0案例中的<empty>