用户如何在chrome中使用麦克风,然后流式传输以获得原始音频?我需要得到线性16的音频。
发布于 2018-08-05 01:29:39
不幸的是,MediaRecorder不支持原始的PCM捕获。(在我看来,这是一个可悲的疏忽。)因此,您需要获取原始样本并自己缓冲/保存它们。
您可以使用ScriptProcessorNode来实现这一点。通常,此节点用于以编程方式修改音频数据,以实现自定义效果和其他功能。但是,你没有理由不能把它当做一个捕获点。未经测试,但请尝试类似以下代码:
const captureNode = audioContext.createScriptProcessor(8192, 1, 1);
captureNode.addEventListener('audioprocess', (e) => {
const rawLeftChannelData = inputBuffer.getChannelData(0);
// rawLeftChannelData is now a typed array with floating point samples
});
(您可以在MDN上找到更完整的示例。)
这些浮点样本以零0
为中心,理想情况下会绑定到-1
和1
。当转换为整数范围时,您需要将值钳制到此范围,并裁剪超出此范围的任何值。(如果在浏览器中将嘈杂的声音混合在一起,这些值有时会超过-1
和1
。理论上,浏览器还可以录制来自外部声音设备的float32样本,这也可能超过该范围,但我不知道有任何浏览器/平台可以做到这一点。)
转换为整数时,重要的是值是有符号的还是无符号的。如果是带符号的,对于16位,范围是-32768
到32767
。对于未签名的,则为0
to 65535
。确定您想要使用的格式,并将-1
到1
的值扩展到该范围。
关于此转换的最后一点注意事项...字节序可能很重要。另请参阅:https://stackoverflow.com/a/7870190/362536
发布于 2019-01-16 17:21:36
下面是我发现的唯一两个清晰且有意义的例子:
亚马逊网络服务实验室:https://github.com/awslabs/aws-lex-browser-audio-capture/blob/master/lib/worker.js
AWS资源非常好。它向您展示了如何将录制的音频导出为“编码为PCM的WAV格式”。Amazon Lex是AWS提供的一项转录服务,它要求音频经过PCM编码并包装在WAV容器中。你只需要修改一些代码就可以让它为你工作!AWS有一些额外的功能,如“下采样”,允许您在不影响记录的情况下更改采样率。
RecordRTC:https://github.com/muaz-khan/RecordRTC/blob/master/simple-demos/raw-pcm.html
RecordRTC是一个完整的库。您可以再一次修改他们的代码,或者找到将音频编码为原始PCM的代码片段。您还可以实现他们的库并按原样使用代码。在此库中使用音频配置的"desiredSampleRate“选项会对录音产生负面影响。
它们都是很好的资源,你一定能够解决你的问题。
发布于 2018-08-05 00:22:03
您应该查看MediaDevices.getUserMedia()应用编程接口的MediaTrackConstraints.sampleSize属性。使用sampleSize
约束,如果您的音频硬件允许,您可以将采样大小设置为16位。
就实现而言,这就是链接和google的用途……
https://stackoverflow.com/questions/51687308
复制相似问题