使用网络编解码器对音频缓冲区进行编码

问题描述 投票:0回答:1

我正在尝试使用 Web Audio API 处理音频文件,然后使用 Web Codecs API 对结果进行编码,这是我的代码的简化版本:

/**
 * Encode an audio file using web codecs
 */
async function encodeAudio(url: string) {
  const audioBuffer = await fetchAudioBuffer(url); // see function below
  const signal = bufferToF32Planar(audioBuffer); // see function below

  const encoder = new AudioEncoder({
    output: console.log,
    error: console.error,
  });

  encoder.configure({
    codec: 'opus',
    sampleRate: 44100,
    numberOfChannels: 2,
    bitrate: 128_000, // 128 kbps
  });

  const data = new AudioData({
    format: 'f32-planar',
    sampleRate: audioBuffer.sampleRate,
    numberOfChannels: audioBuffer.numberOfChannels,
    numberOfFrames: audioBuffer.length,
    timestamp: 0,
    data: signal,
  });

  encoder.encode(data);
}

/**
 * Convert an audio buffer into a planar float 32 array
 * @param input processed audio buffer
 * @returns Typed array
 */
function bufferToF32Planar(input: AudioBuffer): Float32Array {
  const result = new Float32Array(input.length * input.numberOfChannels);

  let offset = 0;
  for (let i = 0; i < input.numberOfChannels; i++) {
    const data = input.getChannelData(i);
    result.set(data, offset);
    offset = data.length;
  }

  return result;
}

/**
 * Fetch the audio file and convert it into
 * an audio buffer using an audio context
 */
async function fetchAudioBuffer(
  input: RequestInfo | URL,
  init?: RequestInit | undefined,
): Promise<AudioBuffer> {
  const context = new AudioContext();
  const res = await fetch(input, init);
  const buffer = await res.arrayBuffer();

  return await context.decodeAudioData(buffer);
}

await encodeAudio('/audio.mp3');

但是,当我运行此代码时,我收到错误

DOMException: Input audio buffer is incompatible with codec parameters
。我做错了什么?

web-audio-api webcodecs
1个回答
0
投票

我猜你的源文件的采样率与 44.1 kHz 不同。但您可以使用 Web Audio API 在源文件解码后重新采样。

const context = new AudioContext({ sampleRate: 44100 });

decodeAudioData()
上调用
context
将始终产生 44.1 kHz 的
AudioBuffer

© www.soinside.com 2019 - 2024. All rights reserved.