在浏览器中使用Opus(或其他编解码器)编码AudioBuffer

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

我正在尝试通过Websocket流音频。

我可以通过Web-Audio-Api从麦克风(或其他来源)获得AudioBuffer并流式传输RAW-Audio-Buffer,但是我认为这样做效率不高。因此,我想办法以某种方式对AudioBuffer进行编码。 -如果Opus编解码器不可行,我乐于接受替代方案,并感谢任何朝着正确方向提出的建议。

我曾尝试使用MediaRecorder(来自MediaStreamRecording-API),但似乎无法使用该API进行流式传输,而不能进行普通记录。

这是我如何获取RAW-AudioBuffer的部分:

const handleSuccess = function(stream) {
    const context = new AudioContext();
    const source = context.createMediaStreamSource(stream);
    const processor = context.createScriptProcessor(16384, 1, 1);

    source.connect(processor);
    processor.connect(context.destination);

    processor.onaudioprocess = function(e) {
    
      bufferLen = e.inputBuffer.length
        const inputBuffer = new Float32Array(bufferLen);
        e.inputBuffer.copyFromChannel(inputBuffer, 0);

        let data_to_send = inputBuffer


    
      //And send the Float32Array ...
    
    }

navigator.mediaDevices.getUserMedia({ audio: true, video: false })
      .then(handleSuccess);

所以主要问题是:如何编码AudioBuffer。(然后在接收方将其解码)是否有API或库?我可以从浏览器中的另一个API获取编码后的缓冲区吗?

javascript web-audio-api opus
1个回答
2
投票

Web Audio API有一个MediaStreamDestination node,它将公开一个.stream MediaStream,然后您可以将其传递给WebRTC API

但是,如果您仅处理麦克风输入,则直接将该MediaStream传递给WebRTC,无需执行Web Audio步骤。


Ps:对于只想编码为作品的影片,那么MediaRecorder是当前唯一的本地方式。这将导致延迟,不仅会生成原始数据,还会生成一个webm文件,并且处理数据的速度不会比实时速度快。

现在只有其他选择是编写自己的编码器并在WabAssembly中运行。

希望不久的将来,我们将可以使用WebCodecs API来解决这个用例,]

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