24

I want to record audio from the microphone with HTML5, then send it to the server to be saved. Currently however, the saved file just contains [object Object]

Here are some snippets of my code.

Frontend:

console.log(blob);
$http.post('/api/save_recording', blob)
  .success(function(new_recording) {
    console.log("success");
  })

The log prints:

Blob {type: "audio/wav", size: 237612, slice: function}
success

Backend:

exports.saveRecording = function(req, res) {
  console.log(req.body);

  fs.writeFile("temp/test.wav", req.body, function(err) {
    if(err) {
      console.log("err", err);
    } else {
      return res.json({'status': 'success'});
    }
  }) 
}

The log prints: { type: 'audio/wav', size: 786476 }

Can you tell me why this isn't working, and how to fix it?

Daniel Que
  • 1,734
  • 4
  • 20
  • 31
  • From your debugging it seems to me the writeFile is doing a conversion of the object since before that it doesn't have the value of [Object object] but I'm not node.js savvy enough to answer. There could also be a problem with the way $http.post handles the data you pass to it since I've used file upload directives in the past for this I imagine there was some difficulty but don't recally the details exactly. – shaunhusain Jun 02 '14 at 03:42

1 Answers1

33

I finally got this working. The approach to get this to work is to encode the blob on the client, and decode it on the server.

Frontend:

// converts blob to base64
var blobToBase64 = function(blob, cb) {
  var reader = new FileReader();
  reader.onload = function() {
    var dataUrl = reader.result;
    var base64 = dataUrl.split(',')[1];
    cb(base64);
  };
  reader.readAsDataURL(blob);
};

blobToBase64(blob, function(base64){ // encode
  var update = {'blob': base64};
  $http.post('/api/save_recording', update)
    .success(function(new_recording) {
      console.log("success");
    });
});    

Backend:

exports.saveRecording = function(req, res) {
  var buf = new Buffer(req.body.blob, 'base64'); // decode
  fs.writeFile("temp/test.wav", buf, function(err) {
    if(err) {
      console.log("err", err);
    } else {
      return res.json({'status': 'success'});
    }
  }); 
};
Lea Reimann
  • 64
  • 2
  • 7
Daniel Que
  • 1,734
  • 4
  • 20
  • 31