【问题标题】:How to implement exponentialRampToValueAtTime in order to remove clicking sound when writing audio via websocket如何实现exponentialRampToValueAtTime以在通过websocket写入音频时消除点击声音
【发布时间】:2021-03-21 04:53:53
【问题描述】:

我正在通过 websocket 为电话应用程序编写音频流。就在音频开始播放之前,有一个明显的“咔哒”声。经过进一步研究,我在SO中遇到了以下问题,

WebAudio play sound pops at start and end

上述问题中接受的答案指出exponentialRampToValueAtTime API 以消除上述噪音。我正在用 Java 实现我的服务,并且无法访问特定的 API。如何实现 exponentialRampToValueAtTime 方法来减弱 Java 中的噪音?

【问题讨论】:

    标签: java audio websocket


    【解决方案1】:

    我编写了一些代码来处理一些基于声音的应用程序的点击问题。我提出的算法的 IDK 被认为是健壮的,但它似乎正在工作。我将其归类为“重新发明轮子”。该算法使用线性斜坡,而不是指数。使增量成为指数级应该不会太难。

    基本概述:

    1. 从行中获取字节数据
    2. 将字节数据转换为 PCM
    3. 对于开始的 1024 pcm 帧(较小的数字可能很好,尤其是在使用指数斜坡而不是线性时),将每个帧乘以从 0 到 1 的序列。

    我使用下面的线性公式,得到了满意的结果。

    对于 n = 0 到 1024

    pcmValue[n] *= n / 1024;
    
    1. 将 PCM 转换回字节并发送

    这只需要在开始或结束时进行(逆向算法)。

    对于指数,我猜类似下面的方法可能会起作用:

    pcmValue[n] *= (Math.pow(2, n/1024) - 1);
    

    与分贝相关的函数可能具有更好的间隔增量。间距越大,防止点击所需的 PCM 帧数就越少。

    AudioCue 中,需要确保声音在收到实时命令以更改音量时平滑过渡。我使用上述相同的基本思想,但在两个音量级别之间有一个线性斜坡。处理增量的代码可以在第 1200、892 和 1302 行看到。使用线性斜坡允许一次性计算,然后对单个 PCM 帧进行简单的加法。但正如我所说,这是我从头开始编写的,受过更好教育或更有经验的音频工程师可能会有进一步的见解或改进。

    【讨论】:

    • 感谢您的回答。快速提问,如何将字节转换为 PCM?抱歉对音频不太熟悉。
    • 我认为这已经回答了好几次了,一个简单的搜索应该会为你带来它。在上面链接的代码库中,“加载”方法中有一个示例,用于传入 16 位、44100 fps、立体声、小端。该过程因文件格式而异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2020-11-01
    • 2012-10-11
    • 2023-03-21
    • 2012-05-17
    • 1970-01-01
    相关资源
    最近更新 更多