I'm working on project that requires capturing user audio and its manipulation on server. To speed up preview process and skip lengthily uploads at the end of recording we are testing streaming trough Socket.io. While we did get it to work, something is missing, file plays but reports "Internal data stream error" at the end, both in ogg and wav format. Client side code:
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();
});
});
Server side code (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');
});
I'm kind of new with Node and my guess I'm just not seeing obvious.