javascript - 在浏览器中使用 Opus(或其他编解码器)编码 AudioBuffer
问题描述
我正在尝试通过 Websocket 流式传输音频。
我可以通过 Web-Audio-Api 从麦克风(或其他来源)获取 AudioBuffer 并流式传输 RAW-Audio-Buffer,但我认为这不会很有效。所以我四处寻找以某种方式对 AudioBuffer 进行编码。- 如果 Opus-Codec 不可行,我愿意接受替代方案,并感谢任何正确方向的提示。
我曾尝试使用 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 节点,它将公开一个.stream
MediaStream,然后您可以通过WebRTC API传递它。
但如果您只处理麦克风输入,则直接将该 MediaStream 传递给 WebRTC,无需 Web 音频步骤。
Ps:对于那些只想编码为作品的人,MediaRecorder是目前唯一的原生方式。它会产生延迟,不仅会生成原始数据,还会生成 webm 文件,并且处理数据的速度不会比实时快。
现在只有其他选择是编写自己的编码器并在 WabAssembly 中运行它。
希望在不久的将来,我们可以访问WebCodecs API,它应该可以解决这个用例等问题。
推荐阅读
- node.js - 在 Digital Ocean 液滴上使用 Docker 时,MongoDB 数据库数据被删除
- amazon-ec2 - 如何为 Fedora Atomic Amazon Machine Image (ami) 定义 terraform aws_ami 资源
- typescript - Typescript 装饰器在 React Native 中没有按预期工作
- python - ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all() OpenCV AutoCanny 函数
- angular - Angular - 具有 ngFor 的父级等待子级单击,然后再移动到 ngFor 中的新项目
- c++ - 集合中的比较器如何与 C++ 中的仿函数一起使用?
- c++ - 检查板中的项目旁边是否有任何东西(二维数组)
- python - 在python中将字符串放在类似字节的对象上
- javascript - JavaScript / HTML 使用 getElementById
- wordpress - Wordpress:如何使用 wp i18n 翻译自定义 Composer 包?