我有一个用例,我必须在 ffmpeg wasm
中缩短超过 2 秒的静音并将其缩短到 1 秒我可以删除超过 2 秒的静音,但无法缩小它们。
const silenceDuration = 2;
await ffmpeg.run(
"-i",
inputFileName,
"-af",
`silenceremove=stop_periods=-1:stop_duration=${silenceDuration}:stop_threshold=-30dB`,
outputFileName,
)
知道如何在 ffmpeg wasm 中实现这一点吗?
谢谢你
在我看来,使用
silenceremove=detection=peak:window=1:stop_periods=-1:stop_duration=1:stop_silence=0
正是您想要的。
peak
和 window=1
表示仅当 [t 和 t+1] 之间的整秒为 0(当然是指定的阈值)时,瞬时 t
才被视为静音。
因此,从这个过滤器的角度来看,少于 1 秒的沉默甚至都不是沉默。
stop_periods
表示超过 1 秒的静音(但请记住,由于 window=1:dectetion=peak
,静音的第一秒甚至不会被检测为静音。因此,它只会考虑 2 秒的实际静音有 1 秒的沉默并且过滤器适用。
因此它仅在静默超过 2 秒时起作用。
然后,因为
stop_duration
,让文件中保持 1 秒的沉默。
此处的
window
用法显然不是预期的用法。但你所做的很奇怪,所以这并不奇怪,这不是 ffmpeg 开发者的初衷:你想保持 0.8 秒的沉默。这是很自然的事情。您希望将 2.3 秒的沉默减少到 1 秒。这也是一件很自然的事情。但您还希望 1.5 秒的沉默保持不变。这意味着,如果我将 f
称为映射沉默的初始持续时间(其新持续时间)的函数,那么 f
并不单调。这很不寻常。
从图形上看,这意味着新的沉默持续时间与旧的沉默持续时间如下所示
毫不奇怪,使用指定“自然”动作的工具(例如截断超过 1 秒到 1 秒的任何沉默,包括持续 1 到 2 秒的沉默)并不容易做到这一点。或者,截断超过 2 秒到 2 秒,但是“将任何超过 2 秒的沉默截断为 1 秒,即将任何沉默最多截断为 1 秒,除非它们持续 1 到 2 秒”。是一种非常奇怪的预期行为)。