gpt4 book ai didi

javascript - 使用流媒体录制音频 - MediaStreamRecorder + Node.js

转载 作者:行者123 更新时间:2023-11-30 00:28:18 26 4
gpt4 key购买 nike

我从事的项目需要捕获用户音频并在服务器上对其进行操作。为了加快预览过程并在录制结束时跳过冗长的上传,我们正在通过 Socket.io 测试流式传输。虽然我们确实让它工作了,但有些东西丢失了,文件播放但最后报告“内部数据流错误”,包括 ogg 和 wav 格式。客户端代码:

var mediaRecorder,mystream;
var last = false;
var socket = io('http://localhost:3000');
var mediaConstraints = {
audio: true
};

function onMediaSuccess(stream) {
mystream=stream;
mediaRecorder = new MediaStreamRecorder(stream);
mediaRecorder.mimeType = 'audio/ogg';
mediaRecorder.audioChannels = 1;
mediaRecorder.ondataavailable = function (blob) {
socket.emit('stream', {'user':1,'last':last,'data':blob});
};

mediaRecorder.onstop = function() {
last= true;
};

mediaRecorder.start(3000);
}

function onMediaError(e) {
console.error('media error', e);
}

socket.on('finished', function(msg){
console.log(msg);
mystream.stop();
});
$(function() {

$('#start').click(function(e){
e.preventDefault();
navigator.getUserMedia(mediaConstraints, onMediaSuccess, onMediaError);
});

$('#stop').click(function(e){
e.preventDefault();
mediaRecorder.stop();
});
});

服务器端代码(Node.js):

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var fs = require('fs');

io.on('connection', function(socket){
console.log('a user connected');
var tmp_path = 'test.ogg';
var wstream = fs.createWriteStream(tmp_path);
//CONNECTION TERMINATED
socket.on('disconnect', function(){
console.log('user disconnected');
if(wstream){
wstream.end();
fs.unlink(tmp_path);
}
});

//RECIEVE DATA
socket.on('stream', function(msg){
if(msg.last === true){
console.log('recording done');
wstream.write(msg.data);
wstream.end();
var responseObject = {
temp_path: tmp_path
}
socket.emit('finished',responseObject);
}
else{
wstream.write(msg.data);
console.log('message: ' + msg);
}

});
});

http.listen(3000, function(){
console.log('listening on *:3000');
});

我是 Node 的新手,我猜我只是没看出来。

最佳答案

我看到的一个明显错误是:

mediaRecorder.ondataavailable = function (blob) {
socket.emit('stream', {'user':1,'last':last,'data':blob});
};

方法的参数ondataavailableevent 对象(不是您指定的 blob),要检索 blob,您可以执行 event.data

除此之外,当多个用户同时录制时,我不确定您的实现是否可扩展。

我为此做了一个小的git项目,你可以看看:fox-ogg-recorder

注意:我希望您已经知道,目前只有 Firefox 支持这种录制。

关于javascript - 使用流媒体录制音频 - MediaStreamRecorder + Node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30594978/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com