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

时间:2015-05-30 14:27:06

标签: javascript buffer blob webrtc audio-streaming

我从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);
  }
});

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

mediaRecorder = new MediaRecorder(stream);//Cria um elemento para gavar a Stream 

let chunks = [];//Cria uma matriz para receber as parte.
mediaRecorder.ondataavailable = data => 
{
chunks.push(data.data)//Vai adicionando as partes na matriz
}
mediaRecorder.onstop = () => {//Quando ativar a função parar a gravação
//Cria o BLOB com as partes acionadas na Matriz
const blob = new Blob(chunks, { type: 'audio/wav' });
}

//Voce pode ainda criar um leitor
var reader = new FileReader();
//Passa o BLOB como parametro
reader.readAsText(blob);
//Pode visualizar os dados gerados em texto
alert(reader.result);
//Pode passar o dados para uma variável
var enviar_dados = reader.result;
 //Pode passa via AJAX e ou JQUERY para o servidor, salvar no banco de dados...

 PS-> O Type pode ser 
 //const blob = new Blob(chunks, { type: 'audio/ogg; code=opus' });
 //const blob = new Blob(chunks, { type: 'application/octet-binary' });
 //const blob = new Blob(chunks, { type: 'text/plain' });
 //const blob = new Blob(chunks, { type: 'text/html' });
 .......