如何将getUsermedia音频流转换为Blob或缓冲区?

问题描述 投票:3回答:2

我从getUserMeda获取音频流,然后将其转换为blob或缓冲区,并在音频即将到来时将其发送到服务器,我正在使用socket.io将其发射到服务器,如何将音频媒体流转换为缓冲区?

以下是我编写的代码

navigator.getUserMedia({audio: true, video: false}, function(stream) {
webcamstream = stream;
var media = stream.getAudioTracks();
socket.emit("sendaudio", media);
},
function(e){
   console.log(e);
  }
});

如何将流转换为缓冲区并在流来自getusermedia函数时将其发送到node.js服务器?

javascript buffer blob webrtc audio-streaming
2个回答
6
投票

[@ @MuazKhan的评论,请使用MediaRecorder(在Firefox中,最终将在Chrome中使用)或RecordRTC / etc将数据捕获为blob。然后,您可以通过以下几种方法之一将其导出到服务器以进行分发:WebSocket,WebRTC DataChannel等。请注意,不能保证它们实时传输数据,而且MediaRecorder还没有比特率控件。如果传输延迟,则数据可能会在本地累积。

如果实时(重新)传输很重要,请强烈考虑改为使用PeerConnection到服务器(根据@Robert的评论),然后将其在那里转换为流。 (如何完成将取决于服务器,但是您应该对Opus数据进行编码以重新打包或解码和重新编码。)虽然重新编码通常不好,但是在这种情况下,您最好通过NetEq解码( webrtc.org堆栈的抖动缓冲区和PacketLossConcealment代码),并获得干净的实时音频流以重新编码以进行流传输,并处理了丢失和抖动。


1
投票
mediaRecorder = new MediaRecorder(stream);
let chunks = [];

mediaRecorder.ondataavailable = data => {
  chunks.push(data.data)
}

mediaRecorder.onstop = () => {
  const blob = new Blob(chunks, { type: 'audio/wav' });
}
© www.soinside.com 2019 - 2024. All rights reserved.