gpt4 book ai didi

javascript - decodeAudioData 返回空错误

转载 作者:技术小花猫 更新时间:2023-10-29 12:10:18 28 4
gpt4 key购买 nike

我来到这里希望 SO 上可爱的人们可以帮助我解决我遇到的一些问题。

具体来说,每次我尝试使用 webkitAudioContext 的 decodeAudioData 方法时,它总是会触发带有空错误的错误处理程序。这是我目前使用的代码:

var soundArray;
var context = new webkitAudioContext();
function loadSound(soundName) {
var request = new XMLHttpRequest();
request.open('GET',soundName);
request.responseType = 'arraybuffer';
request.onload = function() {
context.decodeAudioData(this.response, function(buf) {
sounds[soundName] = buf;
},function(err) { console.log("err(decodeAudioData): "+err); });
}
request.send();
}

在这一点上,它不断地向控制台记录错误消息,说 err(decodeAudioData) = null,主要是因为这正是我决定记录它的方式。无论如何,知道为什么会这样吗?

我正在使用 Chrome Canary v20.0.1121.0 来尝试让某些东西正常工作。但是,显然,它不起作用!那么,知道我可以做什么吗?如果需要任何新信息,请告诉我,我会根据需要进行更新。

最佳答案

真正的原因是 createBuffer 和 decodeAudioData 现在都有一个 Bug,并为它们应该正常播放的文件抛出奇怪的模糊 DOM 异常 12。但我们应该意识到这是一项新的和不断发展的技术,甚至感谢网络音频 API,因为它发生在我们身上的小奇迹。

它们缺少 header 边界上的流同步,任何合理的流式音频格式解码器都应从该开始。mp3 或许多 aac/adts 文件是流式文件格式。流媒体意味着您可以在任何地方剪切它们或插入附加任何东西(各种标签甚至图像艺术品)解码器不应该关心未知数据。解码器应该一直寻找,直到找到他知道并可以解码的 header 。

我拼凑了这个临时解决方案,该解决方案寻求最近的帧头开始并仅从该偏移量传递数据。

mp3 或 mp2 的每个音频帧(每 200 字节左右)都以 0XFFE 和 oxFFF 同步字上的 aac(adts) 开始 header ,正是出于这个原因。因此两者都将在 0xFFE 上同步。这是我目前用来播放以前未播放过的文件的代码。

我讨厌的是 arrayBuffer 没有 subarray() 像它的类型化子对象那样从不同的偏移量返回不同的 View ,而不是 slice() 返回的整个新数组副本。如果只有 webaudio api 接受 typedarrays 作为输入但不幸的是,创建 arraybuffer 的唯一方法似乎是巨大的 slice() 副本。谢天谢地,通常只需要一两次寻道。

强制 Web Audio Api 对文件不挑剔

node={};
node.url='usual_mp3_with_tags_or_album_artwork.mp3';

function syncStream(node){ // should be done by api itself. and hopefully will.
var buf8 = new Uint8Array(node.buf);
buf8.indexOf = Array.prototype.indexOf;
var i=node.sync, b=buf8;
while(1) {
node.retry++;
i=b.indexOf(0xFF,i); if(i==-1 || (b[i+1] & 0xE0 == 0xE0 )) break;
i++;
}
if(i!=-1) {
var tmp=node.buf.slice(i); //carefull there it returns copy
delete(node.buf); node.buf=null;
node.buf=tmp;
node.sync=i;
return true;
}
return false;
}

function decode(node) {
try{
context.decodeAudioData(node.buf,
function(decoded){
node.source = context.createBufferSource();
node.source.connect(context.destination);
node.source.buffer=decoded;
node.source.noteOn(0);
},
function(){ // only on error attempt to sync on frame boundary
if(syncStream(node)) decode(node);
});
} catch(e) {
log('decode exception',e.message);
}
}

function playSound(node) {
node.xhr = new XMLHttpRequest();
node.xhr.onload=function(){
node.buf=node.xhr.response;
node.sync=0;
node.retry=0;
decode(node);
}
node.xhr.open("GET", node.url, true);
node.xhr.responseType = "arraybuffer";
node.xhr.send();
}

关于javascript - decodeAudioData 返回空错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10365335/

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