使用 ffmpeg.wasm 替换音频中的静音

问题描述 投票:0回答:1

我有一个用例,我必须在 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 中实现这一点吗?

谢谢你

javascript audio ffmpeg html5-audio ffmpeg-wasm
1个回答
0
投票

在我看来,使用

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
并不单调。这很不寻常。

从图形上看,这意味着新的沉默持续时间与旧的沉默持续时间如下所示 enter image description here

毫不奇怪,使用指定“自然”动作的工具(例如截断超过 1 秒到 1 秒的任何沉默,包括持续 1 到 2 秒的沉默)并不容易做到这一点。或者,截断超过 2 秒到 2 秒,但是“将任何超过 2 秒的沉默截断为 1 秒,即将任何沉默最多截断为 1 秒,除非它们持续 1 到 2 秒”。是一种非常奇怪的预期行为)。

© www.soinside.com 2019 - 2024. All rights reserved.