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

Javascript 如何将getUsermedia音频流转换为blob或缓冲区?,javascript,buffer,blob,webrtc,audio-streaming,Javascript,Buffer,Blob,Webrtc,Audio Streaming,我正在从getUserMeda获取音频流,然后将其转换为blob或缓冲区,并在音频提交时将其发送到服务器我正在使用socket.io将其发送到服务器如何将音频mediastream转换为缓冲区 下面是我编写的代码 navigator.getUserMedia({audio: true, video: false}, function(stream) { webcamstream = stream; var media = stream.getAudioTracks(); socket.emit(

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

下面是我编写的代码

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数据通道等。请注意,这些方法不能保证实时传输数据,而且MediaRecorder还没有比特率控制。如果传输延迟,数据可能会在本地积累


如果实时(RE)传输很重要,请强烈考虑使用PEER连接到服务器(每@罗伯特的注释),然后将其转换成流。(这将取决于服务器,但您应该对Opus数据进行编码以重新打包或解码并重新编码。)虽然重新编码通常不好,但在这种情况下,您最好通过NetEq(webrtc.org堆栈的抖动缓冲区和PacketLossConcealment代码)进行解码并获得干净的实时音频流,以重新编码流媒体,并处理丢失和抖动。

使用MediaRecorder API(仅限Firefox)或WebAudio hacks(特定于Chrome)。Recorder.js非常有名。您甚至可以查看RecordRTC和MediaStreamRecorder.js。简单地说:您需要录制流,获取基于间隔的或完整的blob,并使用FormData或DataURL上传到服务器。@MuazKhan我只想开发一个单向音频广播应用程序,只有在实时发送音频流时才可能。我已使用RecordRTC我已]每1秒录制一次音频并将其发送到服务器问题是浏览器窗口在30或40秒后崩溃。您可以直接将
流添加到WebRTC对等连接。@NaumanBashir Yep。罗伯特是对的。您可以使用RTPeerConnection API进行实时广播。有什么理由不使用它吗?也许想支持非WebRTC浏览器/设备作为查看器?顺便说一句,MediaStreamRecorder.js不应该崩溃!RecordRTC的工作时间为5分钟或更短。您只需使用中间使用WebRTC的服务器即可。因此,只需将webrtc数据流式传输到服务器,服务器就会将其流式传输到客户端。没问题!你好在我的项目中,我使用recorder.js捕获音频流,并通过WebSocket将其分小块发送到基于java的远程服务器。然而,在合并块之后,我在服务器中得到的最终音频,我注意到了很多噪音和抖动。我怎样才能避免呢?其次,WebRTC数据通道是否比websocket更好。若有,原因为何?提前感谢。首先,试试beta 47,看看音频性能是否更好;我们在Firefox的47和48中对MediaRecorder进行了重大改进。第二,如果您要传输到服务器,WebSocket或DataChannel可以工作,并且它们有非常相似的API(故意)。DataChannels将允许一些额外的选项,特别是在将来,但是对于服务器来说,它们是相似的,特别是当您只需要一个通道时。添加注释来解释您的答案。嗨!欢迎来到StackOverflow!请提供帮助,我相信我们会很乐意帮助您。
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' });
 .......