【问题标题】:Recording audio with streaming - MediaStreamRecorder + Node.js使用流式录制音频 - MediaStreamRecorder + Node.js
【发布时间】:2015-06-02 11:35:44
【问题描述】:

我正在从事需要在服务器上捕获用户音频及其操作的项目。为了加快预览过程并在录制结束时跳过冗长的上传,我们正在通过 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 有点陌生,我猜我只是看不明显。

【问题讨论】:

    标签: javascript node.js audio streaming


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 感谢您的回答。我会检查你的 git 项目。到目前为止,我可能会选择单一上传解决方案,但只要它是 ogg 格式。但是,正如您所说,问题是浏览器支持。您知道任何跨浏览器的解决方案吗?我仍然喜欢流媒体,但似乎技术仍然不存在。 p.s.老实说,在获得概念证明之前,我并没有考虑可扩展性。
    • 你可以看看这个答案:stackoverflow.com/questions/11979528/…
    • recordOpus 看起来很有希望,将对其进行测试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 2011-05-20
    • 1970-01-01
    • 2013-01-07
    • 2012-06-11
    相关资源
    最近更新 更多