gpt4 book ai didi

node.js - 从 Node API 加载 Web Audio API 中的音频

转载 作者:太空宇宙 更新时间:2023-11-03 23:39:48 24 4
gpt4 key购买 nike

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

我当前的尝试是将文件的内容存储到 Mongo 内的缓冲区中。当收到请求时,音频会转换为 ArrayBuffer,然后编码为 Base64。然后,客户端对字符串进行解码并将其传递到 Web Audio API 缓冲区源。

我确信我正在以艰难的方式做到这一点,但这是我唯一想到的。我在下面发布了我的代码。如果您知道更好的方法,我将不胜感激。

谢谢

将数据加载到 MongoDB

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

Controller 转换音频

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;
}

客户端解码音频

  $.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;
}

最佳答案

由于您的声音数据已经采用缓冲区格式,因此您应该能够将 Controller 代码减少到:

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);
});
};

就客户端而言,您可能唯一可能关注的是 testing base64 decoding performance 。除此之外我认为其他一切看起来都不错。

关于node.js - 从 Node API 加载 Web Audio API 中的音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25966107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com