我从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服务器?
[@ @MuazKhan的评论,请使用MediaRecorder(在Firefox中,最终将在Chrome中使用)或RecordRTC / etc将数据捕获为blob。然后,您可以通过以下几种方法之一将其导出到服务器以进行分发:WebSocket,WebRTC DataChannel等。请注意,不能保证它们实时传输数据,而且MediaRecorder还没有比特率控件。如果传输延迟,则数据可能会在本地累积。
如果实时(重新)传输很重要,请强烈考虑改为使用PeerConnection到服务器(根据@Robert的评论),然后将其在那里转换为流。 (如何完成将取决于服务器,但是您应该对Opus数据进行编码以重新打包或解码和重新编码。)虽然重新编码通常不好,但是在这种情况下,您最好通过NetEq解码( webrtc.org堆栈的抖动缓冲区和PacketLossConcealment代码),并获得干净的实时音频流以重新编码以进行流传输,并处理了丢失和抖动。
mediaRecorder = new MediaRecorder(stream);
let chunks = [];
mediaRecorder.ondataavailable = data => {
chunks.push(data.data)
}
mediaRecorder.onstop = () => {
const blob = new Blob(chunks, { type: 'audio/wav' });
}