jko*_*joa 2 javascript audio google-chrome web-audio-api
我正在使用 web 音频 api 将 n 通道音频文件解码为单独的通道,然后将这些通道渲染到画布以直观地创建频率计。
我正在使用 decodeAudioData 解码字节数组缓冲区,然后在单独的函数中分配给音频缓冲区源节点。
// load the specified sound
function loadSound(url) {
var request = new XMLHttpRequest();
request.open('GET', url, true);
request.responseType = 'arraybuffer';
// When loaded decode the data
request.onload = function () {
// decode the data
context.decodeAudioData(request.response, function (buffer) {
// when the audio is decoded play the sound
holdingBuffer = buffer;
setupSound(buffer);
}, onError);
}
request.send();
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当我尝试解码大约 60mb 以上的音频时,浏览器会因内存空间不足而崩溃。 decodeAudioData 函数非常需要内存!
我想知道是否有人有任何解码更大音频文件的更有效方法的经验?
问题是解码音频占用的内存量。仅作为示例,我假设您的 60MB 音频文件是 MP3。
这显然取决于比特率,但假设您的速度为 128kbps——这是相当典型的。这意味着您正在加载大约一个小时的立体声音频。
但是 Web Audio API 解码为 32 位,通常为 44.1 或 48kHz(这取决于您的声卡,据我所知)。
无论如何,让我们说 48kHz 的 32 位。
这意味着每个通道是每秒 32 * 48000 位。即每分钟 32 * 48000 * 60 位,整小时为 32 * 48000 * 60 * 60 位。当然,我们乘以 2,因为我们假设是立体声。
这意味着总共有 11059200000 位的音频数据——这是一个需要加载到内存中的 1.3824GB 音频缓冲区。所以,基本上 - 这是大量的内存。
这里真的没有简单的答案。您可以尝试在服务器上生成波形/光谱图/任何东西。或者您可以尝试分块加载音频文件,以便您可以单独(串行)处理它们并让内容被垃圾收集。
可能还有其他解决方案,但这是我立即想到的两个解决方案。
| 归档时间: |
|
| 查看次数: |
997 次 |
| 最近记录: |