当我尝试执行以下javascript行时,Chrome 27 beta会引发SyntatxError:
offlineContext = new webkitOfflineAudioContext(2, 7*48000, 48000);
这与W3C建议书一致,经过数小时的网上搜索,我看到了数十个显然可以使用这种确切形式的示例。我知道API可能会发生变化,但是我找不到它的任何提示。我要去哪里错了?
奇怪的是,当我在jsfiddle中尝试时,它不会失败。我什至尝试在jsfiddle中运行此代码段所存在的整个功能,并添加了一些项目。下面是我要运行的功能。执行该功能时,在指示“SyntaxError Dom Exception 12”的地方发生。
我有一个正在运行的音频应用程序,我只是想添加背景处理程序,以便以后使用OfflineAudioContext进行渲染。如果我在init函数中定义了OfflineAudoiContext,则那里没有语法错误。但是我需要在createRenderData()函数中定义它,因为我需要为每个媒体源设置长度和采样率,并且如果我不带任何参数调用OfflineAudioContext构造函数,则会得到TypeError。另外,我在API中看不到在现有的OfflineAudioContext上设置长度和采样率的任何方法。
AudioUI.createRenderData = function() {
var url = BGAudioUI.renderQueue.pop();
if (url) {
BGAudioUI.media = new Audio(url);
BGAudioUI.media.addEventListener('durationchange', function() {
console.log("background duration: " + BGAudioUI.media.duration);
BGAudioUI.duration = BGAudioUI.media.duration;
//BGAudioUI.allData = new Float32Array(Math.floor((AudioUI.context.sampleRate.toFixed() / AudioUI.downsampleFactor.toFixed() * BGAudioUI.duration)) + 1);
//console.log("calculated sample rate: " + Math.floor(AudioUI.context.sampleRate / AudioUI.downsampleFactor.toFixed()));
//console.log("duration: " + BGAudioUI.duration);
BGAudioUI.offlineContext = new webkitOfflineAudioContext(2, 7*48000, 48000); //SyntaxError DOM Exception 12 occurs here
BGAudioUI.mediaSource = BGAudioUI.offlineContext.createMediaElementSource(BGAudioUI.media);
BGAudioUI.offlineContext.oncomplete = function(buffer) {
data = buffer.getChannelData(0);
console.log(data.length + " records processed offline");
};
BGAudioUI.offlineContext.startRendering();
BGAudioUI.media.play();
console.log("created background media source for " + BGAudioUI.media.src);
}, false);
BGAudioUI.media.load();
console.log("created background media object for " + BGAudioUI.media.src);
} else {
alert("Background rendering complete");
}
};
最佳答案
因此,问题在于,需要将OfflineAudioContext的采样率设置为与常规AudioContext相同的值。克里斯·罗杰斯(Chris Rogers)将研究解决此问题,这对我来说适用于OSX Chrome(测试版和稳定版),但不适用于在CentOS上运行的Fedora Chrome(仅经过测试的稳定版)。但是,在将两个音频上下文设置为相同的采样率的情况下,现在一切正常。