我有一个应用程序,它使用 XHR 从远程位置下载音频数据并在本地将其保存为数组缓冲区,类似于方法 here或 here .这种方法效果很好,但需要在 UI 上下文中执行 Audio
元素可用。是否有另一种方法来计算 ArrayBuffer
的持续时间? ,理想情况下是在 WebWorker/ServiceWorker 上下文中?
当前方法使用 AudioContext.decodeAudioData
解码音频二进制文件,但这在 WebWorker 上下文中不可用。 ArrayBuffer
不一定采用单一格式或编解码器,并且尚未编码。
最佳答案
如果您的 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),您可以手动解析二进制字节 header ,使用第三方库来解析 header ,或者让您的服务器通过以下方式向您发送音频属性( channel 、采样率等) HTTP 响应 header 。
关于javascript - 计算没有音频 API 的 ArrayBuffer 的持续时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62553574/