【问题标题】:How to render in a specific bit depth?如何以特定的位深度渲染?
【发布时间】:2017-06-21 00:50:13
【问题描述】:

OfflineAudioContext.startRendering() 如何输出包含我选择的位深度(16 位或 24 位)的AudioBuffer?我知道我可以使用AudioContext.sampleRate 轻松设置输出的采样率,但是如何设置位深度?

我对音频处理的理解非常有限,所以可能没有我想的那么容易。

编辑#1:

实际上,AudioContext.sampleRate 是只读的,所以如果您知道如何设置输出的采样率,那也很好。

编辑#2:

我猜采样率是在编码的WAV中的通道数之后插入的(在DataView中)

【问题讨论】:

    标签: web-audio-api audio-processing audiocontext


    【解决方案1】:

    您不能直接执行此操作,因为 WebAudio 仅适用于浮点值。你必须自己做这件事。基本上从离线上下文中获取输出并将每个样本乘以 32768(16 位)或 8388608(24 位)并舍入为整数。这假设上下文的输出位于 -1 到 1 的范围内。如果不是,则必须进行额外的缩放。最后,您可能希望将最终结果除以 32768 (8388608) 以获得浮点数。这取决于最终的应用程序是什么。

    对于编辑#1,答案是当您构造OfflineAudioContext 时,您必须指定采样率。将其设置为您想要的速率。不确定AudioContext.sampleRate 与此有什么关系。

    对于编辑 #2,没有足够的信息来回答,因为您没有说出 DataView 是什么。

    【讨论】:

    • 好的好的,谢谢。所以我将audioBuffer.getChannelData(0|1) 的每个值乘以 32768 或 8388608 就是这样,我的最终 .wav 文件将具有相应的位深度?而且我不确定我为什么需要将最终结果除以 32768 或 8388608...我不只是要取回初始值吗?
    • 首先,当你创建 OfflineAudioContext 时,你必须指定采样率。
    • WebAudio 目前不支持从 AudioBuffer 创建 WAV 文件。你必须找到一些图书馆来为你做这件事。 (或者自己学着做。WAV 文件很简单。)
    • 对,我忘了我实际上在创建时指定了采样率。而且我知道 WebAudio API 中不支持创建 wav 文件,我使用了一个名为 audiobuffer-to-wav 的库。我仍然不明白你解释的设置位深度的过程。 “乘以每个样本”是指乘以 Float32Array 返回的 getChannelData 中的每个值?为什么要乘以和除以相同的数字,这只是在涉及缩放时才做的事情吗?无论如何,已经感谢您的帮助。
    • 好的。这是 24 位 wav 解决方案的一部分。让x = buffer.getChannelData(0)[k]。计算 s = Math.floor(x*8388608 + 0.5) 以获得 24 位(四舍五入)值。您最终会得到一个 24 位有符号整数数组。我将由您决定如何以适当的 WAV 格式输出此数组;这不是很难,因为格式很简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多