用stream媒体录制audio – MediaStreamRecorder + Node.js

我正在处理需要捕获用户audio及其在服务器上的操作的项目。 为了加快预览过程,并在录制结束时跳过长时间上传,我们正在testingstream式套接字Socket.io。 虽然我们确实得到它的工作,缺less的东西,文件播放,但最终报告“内部数据stream错误”,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}); }; 

方法ondataavailable的参数是event对象(不是你指定的blob),为了检索blob,你可以做event.data

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

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

注:我希望你已经知道,现在只有Firefox支持这种录音。