我正在尝试通过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获取编码后的缓冲区吗?
Web Audio API有一个MediaStreamDestination node,它将公开一个.stream
MediaStream,然后您可以将其传递给WebRTC API。
但是,如果您仅处理麦克风输入,则直接将该MediaStream传递给WebRTC,无需执行Web Audio步骤。
Ps:对于只想编码为作品的影片,那么MediaRecorder是当前唯一的本地方式。这将导致延迟,不仅会生成原始数据,还会生成一个webm文件,并且处理数据的速度不会比实时速度快。
现在只有其他选择是编写自己的编码器并在WabAssembly中运行。
希望不久的将来,我们将可以使用WebCodecs API来解决这个用例,]