【问题标题】:Calculate duration of ArrayBuffer without Audio API?计算没有音频 API 的 ArrayBuffer 的持续时间?
【发布时间】:2020-06-24 11:03:30
【问题描述】:

我有一个应用程序,它使用 XHR 从远程位置下载音频数据并在本地将其保存为数组缓冲区,类似于 herehere 的方法。这种方法效果很好,但需要在 UI 上下文中执行才能使 Audio 元素可用。是否有另一种方法来计算ArrayBuffer 的持续时间,最好是在 WebWorker/ServiceWorker 上下文中?

当前方法使用AudioContext.decodeAudioData 来解码音频二进制文件,但这在 WebWorker 上下文中不可用。 ArrayBuffer 不一定是单一格式或编解码器,并且尚未编码。

【问题讨论】:

    标签: javascript audio web-audio-api arraybuffer


    【解决方案1】:

    如果您的ArrayBuffer 包含解码的 PCM 音频,您可以使用下面的getAudioDuration()。如果该条件没有封装您解码的音频,您可能希望直接传递 bytesPerSample

    function getAudioDuration(arrayBuffer, numChannels, sampleRate, isFloatingPoint) {
      // PCM 16 or Float32
      const bytesPerSample = (isFloatingPoint ? Float32Array : Uint16Array).BYTES_PER_ELEMENT
    
      // total samples/frames
      const totalSamples = arrayBuffer.byteLength / bytesPerSample / numChannels 
    
      // total seconds
      return totalSamples / sampleRate
    }
    

    如果您的ArrayBuffer 包含编码音频(Opus、MP3、WAV),您可以手动解析二进制字节标头,使用第三方库来解析标头,或者让您的服务器向您发送音频属性(通道、采样率等)通过 HTTP 响应标头。

    【讨论】:

    • 这种方法看起来很简单,但我接下来关心的是如何计算任意音频二进制文件的“numChannels”和“sampleRate”?对于我的用例,我无法控制用于编码的音频格式。
    • 我可能误解了你的问题,并假设你已经解码了 PCM 音频。
    • 您找到解决方案了吗?
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 2011-07-30
    相关资源
    最近更新 更多