Recording audio with streaming - MediaStreamRecorder + Node.js
我正在研究需要捕获用户音频及其在服务器上的操作的项目。为了加快预览过程并在记录结束时长时间跳过上载,我们正在测试通过Socket.io的流。虽然确实可以正常工作,但文件播放丢失了一些东西,但是最后以ogg和wav格式报告"内部数据流错误"。
客户端代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 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):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | 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有点陌生,我猜我似乎并不明显。
我看到的一个明显错误是:
1 2 3 | mediaRecorder.ondataavailable = function (blob) { socket.emit('stream', {'user':1,'last':last,'data':blob}); }; |
ondataavailable方法的参数是
除此之外,我不确定当多个用户同时录制时您的实现是否可扩展。
我为此做了一个小git项目,您可以查看一下:fox-ogg-recorder
注意:我希望您已经知道,目前只有Firefox支持这种记录。