从节点API加载WebaudioAPI中的audio

我正在尝试使用Web Audio API从服务器加载audio。 到目前为止,我所有使用Node / Express API返回数据的尝试都无法返回任何可能在我的浏览器中播放的内容。

我目前的尝试是将文件的内容存储到Mongo内的缓冲区。 当请求时,audio被转换为一个ArrayBuffer,然后编码到Base64中。 客户端然后解码string并将其传递到Web Audio API缓冲区源。

我确信我是这么做的,但这是我唯一想到的。 我已经发布了我的代码如下。 如果你知道更好的方法,我将不胜感激指导。

谢谢

将数据加载到MongoDB中

var buffer = fs.readFileSync('C4.mp3'); Sound.create({ instrument: 'Piano', audio: buffer, note: 'C4' }); 

控制器转换audio

 var Sound = require('./sound.model'); var base64 = require('base64-arraybuffer'); // Get list of sounds exports.index = function(req, res) { Sound.find(function (err, sounds) { if(err) { return handleError(res, err); } var soundsToReturn = []; for (var i = 0; i < sounds.length; i++) { soundsToReturn.push( {instrument: sounds[i].instrument, audio: base64.encode(toArrayBuffer(sounds[i].audio)), note: sounds[i].note}); }; return res.status(200).json(soundsToReturn); }); }; function toArrayBuffer(buffer) { var ab = new ArrayBuffer(buffer.length); var view = new Uint8Array(ab); for (var i = 0; i < buffer.length; ++i) { view[i] = buffer[i]; } return ab; } 

客户端解码audio

  $.ajax({ url: url, dataType: 'json', success: function(data) { audioCtx.decodeAudioData(_base64ToArrayBuffer(data[0].audio), function(b){ buffer = b; }) } }); function _base64ToArrayBuffer(base64) { var binary_string = window.atob(base64); var len = binary_string.length; var bytes = new Uint8Array( len ); for (var i = 0; i < len; i++) { var ascii = binary_string.charCodeAt(i); bytes[i] = ascii; } return bytes.buffer; } 

由于您的声音数据已经是缓冲区格式,因此您应该能够将您的控制器代码简化为:

 var Sound = require('./sound.model'); // Get list of sounds exports.index = function(req, res) { Sound.find(function (err, sounds) { if (err) return handleError(res, err); var soundsToReturn = []; for (var i = 0; i < sounds.length; i++) { soundsToReturn.push( {instrument: sounds[i].instrument, audio: sounds[i].audio.toString('base64'), note: sounds[i].note}); }; return res.status(200).json(soundsToReturn); }); }; 

就客户端而言,您可能会考虑的唯一的事情就是testingbase64解码性能 。 除此之外,我认为其他一切看起来都不错。