如何将 getUsermedia 音频流转换为 blob 或缓冲区?
how to convert getUsermedia audio stream into a blob or buffer?
我正在从 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 中。然后您可以通过以下几种方法之一将其导出到服务器进行分发:WebSockets、WebRTC DataChannels 等。请注意,这些方法不能保证实时传输数据,而且 MediaRecorder 还没有比特率控制。如果传输延迟,数据可能会在本地累积。
如果实时(重新)传输很重要,请强烈考虑改为使用 PeerConnection 到服务器(根据@Robert 的评论),然后将其转换为流。 (如何完成取决于服务器,但你应该对 Opus 数据进行编码以重新打包或解码并重新编码。)虽然重新编码通常不好,但在这种情况下你最好通过 NetEq 解码( webrtc.org 堆栈的抖动缓冲区和 PacketLossConcealment 代码)并获得干净的实时音频流以重新编码以进行流式传输,处理丢失和抖动。
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' });
.......
我正在从 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 中。然后您可以通过以下几种方法之一将其导出到服务器进行分发:WebSockets、WebRTC DataChannels 等。请注意,这些方法不能保证实时传输数据,而且 MediaRecorder 还没有比特率控制。如果传输延迟,数据可能会在本地累积。
如果实时(重新)传输很重要,请强烈考虑改为使用 PeerConnection 到服务器(根据@Robert 的评论),然后将其转换为流。 (如何完成取决于服务器,但你应该对 Opus 数据进行编码以重新打包或解码并重新编码。)虽然重新编码通常不好,但在这种情况下你最好通过 NetEq 解码( webrtc.org 堆栈的抖动缓冲区和 PacketLossConcealment 代码)并获得干净的实时音频流以重新编码以进行流式传输,处理丢失和抖动。
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' });
.......