问题描述
我想在通话时获取音频缓冲区,我使用此方法来检测它,但我收到消息,此方法 onaudioprocess 已弃用且未触发,是否有其他替代方法与示例。
audioContext = new AudioContext({ sampleRate: 16000 });
scriptNode = (audioContext.createscriptprocessor || audioContext.createJavaScriptNode).call(audioContext,1024,1,1);
scriptNode.onaudioprocess = function (audioEvent) {
if (recording) {
input = audioEvent.inputBuffer.getChannelData(0);
// convert float audio data to 16-bit PCM
var buffer = new ArrayBuffer(input.length * 2);
var output = new DataView(buffer);
for (var i = 0,offset = 0; i < input.length; i++,offset += 2) {
var s = Math.max(-1,Math.min(1,input[i]));
output.setInt16(offset,s < 0 ? s * 0x8000 : s * 0x7fff,true);
}
ws.send(buffer);
}
};
解决方法
使用 MediaStream Recording API 和 MediaDevices.getUserMedia()
方法,您可以从麦克风流式传输音频并将其流式传输到录音机中。然后,只要在记录器上触发 ondataavailable
事件,记录器就可以通过 WebSocket 发送 import multiprocessing as mp
data_lines = [0]*10000 # read it from file
size = 2000
# Split the list into a list of list (with chunksize `size`)
work = [data_lines[i:i + size] for i in range(0,len(data_lines),size)]
def process(data):
result = len(data) # some something fancy
return result
with mp.Pool() as p:
result = p.map(process,work)
save_computed_data_to_disk(file_name,result)
对象。
下面的函数创建一个流并将其传递给一个 MediaRecorder
实例。该实例将记录您的麦克风音频并能够将其发送到您的 WebSocket。返回 Blob
的实例以控制记录器。
MediaRecorder
这样您也可以停止录音,如果您愿意,可以通过调用录音机上的 stop()
方法。
async function streamMicrophoneAudioToSocket(ws) {
let stream;
const constraints = { video: false,audio: true };
try {
stream = await navigator.mediaDevices.getUserMedia(constraints);
} catch (error) {
throw new Error(`
MediaDevices.getUserMedia() threw an error.
Stream did not open.
${error.name} -
${error.message}
`);
}
const recorder = new MediaRecorder(stream);
recorder.addEventListener('dataavailable',({ data }) => {
ws.send(data);
});
recorder.start();
return recorder;
});
,
那一行已弃用代码的确切替代品。替换:
scriptNode.onaudioprocess = function (audioEvent) {
与:
scriptNode.addEventListener('audioprocess',function (audioEvent) {
此 example 包含用于捕获音频和视频的合规工作代码。