javascript - 计算没有音频 API 的 ArrayBuffer 的持续时间?

标签 javascript audio web-audio-api arraybuffer

我有一个应用程序,它使用 XHR 从远程位置下载音频数据并在本地将其保存为数组缓冲区,类似于方法 herehere .这种方法效果很好,但需要在 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/

相关文章:

javascript - jQuery 向 html 元素添加一个奇怪的属性

javascript - 如何在日期选择器中设置最大日期?

php - 本地驱动器音频用于codeigniter

python - 使用 python 和 pyaudio 的 channel 和采样率

javascript - 网络音频API : Change pitch of samples (for example mp3)

javascript - React Native 从 StackNavigator 导航到另一个 StackNavigator 或 TabNavigator

php - 使用 AJAX 发送具有可变字段数的表单,$_POST 数组为空

java - 如何显示内部存储器中所有音频文件的列表

reactjs - 用 react 钩子(Hook)构建的振荡器不会停止

api - 如何调试音频节点连接?