Javascript 解码返回空错误的音频数据

Javascript 解码返回空错误的音频数据,javascript,html,google-chrome,webkit,web-audio-api,Javascript,Html,Google Chrome,Webkit,Web Audio Api,我来到这里,希望你们这些可爱的家伙能帮我解决一点我遇到的问题 具体地说,每次我尝试使用webkitAudioContext的decodeAudioData方法时,它都会触发带有空错误的错误处理程序。这是我当前使用的代码: var soundArray; var context = new webkitAudioContext(); function loadSound(soundName) { var request = new XMLHttpRequest(); request

我来到这里,希望你们这些可爱的家伙能帮我解决一点我遇到的问题

具体地说,每次我尝试使用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,尝试让某些东西工作起来。但是,很明显,它不起作用!你知道我能做什么吗?如果需要任何新信息,请告诉我,我会根据需要进行更新。

我在Chrome 19上使用了
webkitAudioContext
。今天我升级到Chrome20,我和你有同样的问题

我已经采取了另一个MP3文件,它再次工作。这两个文件之间的唯一区别是封面嵌入了错误的MP3文件


我已经卸下了封皮,它又能正常工作了。

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

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

我抛出了这个临时解决方案,它寻求最接近的帧头开始,并且只从这个偏移量传递数据

每个音频帧(大约200字节)的mp3或mp2 all start头,oxFFF syncword上的0XFFE和aac(ADT)正是出于这个原因。因此,两者都将在0xFFE上同步。 下面是我目前用来播放以前未播放的文件的代码

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

强制Web音频Api不要挑剔文件
它与其他音频源一起工作吗?根据我的经验,并非所有音频文件都可以通过API解码。你可能会喜欢一个新的.crbug.com。我用过OGG的,MP3的,WAV的,都没用。我曾经读到一个chrome的bug,它可能是chrome不喜欢播放只有一两秒长的音频文件,但我有第二个项目正在运行,使用拖放构建基于web的音频播放器,完整的3-4分钟歌曲也失败了。我会看看我能做些什么来提交关于它的bug报告,谢谢你的建议!此问题已修复,因此忽略此问题。您能否提供有关如何修复此问题的详细信息?Scott遇到此问题。非常感谢你,拉迪斯拉夫。显然,这个错误在iOS 8.3中仍然普遍存在
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();
}