1

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

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

4

1 回答 1

2

如果您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 响应标头。

于 2020-06-24T17:11:59.600 回答