我正在使用Web音频API将音频流传输到远程服务器。我正在使用OfflineAudioContext。该代码在chrome和firefox中可以正常工作,但在野生动物园中,尝试使用OfflineAudioContext时会出现上述错误。我尝试将 webkit 前缀添加到OfflineAudioContext,这会给我这个错误:
SyntaxError:字符串与预期的模式不匹配。
我尝试将不同的值添加到OfflineAudioContext构造函数,但是它总是给我相同的错误。
我浏览了Mozilla开发人员页面以了解浏览器的兼容性,我发现了这一点:
因此,在这里提到了对于OfflineAudioContext构造函数,边缘和野生动物园的兼容性未知。那么,这就是原因,为什么我不能在野生动物园中使用OfflineAudioContext?还不支持吗?还是我做错了?还是有另一种方法可以解决野生动物园的问题?
这是我第一次使用Web Audio API。因此,我希望有人能消除我的疑惑,如果我错过了某个地方。谢谢。
下面添加了OfflineAudioContext的代码:
let sourceAudioBuffer = e.inputBuffer; // directly received by the audioprocess event from the microphone in the browser
let TARGET_SAMPLE_RATE = 16000;
let OfflineAudioContext =
window.OfflineAudioContext || window.webkitOfflineAudioContext;
let offlineCtx = new OfflineAudioContext(
sourceAudioBuffer.numberOfChannels,
sourceAudioBuffer.duration *
sourceAudioBuffer.numberOfChannels *
TARGET_SAMPLE_RATE,
TARGET_SAMPLE_RATE
);
(如果需要js文件的更多代码才能更好地了解问题。只需对其进行注释。我会补充一点,但我认为该代码段足以理解问题)
答案 0 :(得分:0)
这有点令人困惑,但是如果Safari不喜欢自变量,则会抛出SyntaxError
。不幸的是,Safari不喜欢通常应支持的各种参数。
据我所知,Safari仅接受1到10之间的第一个参数。这是numberOfChannels
的参数。
第二个参数(length
)只需为正数。
sampleRate
只能是44100到96000之间的数字。
但是,可以将所有计算从16kHz转换为另一个sampleRate,然后在Safari中运行。假设这是您要在16kHz下进行的计算:
const oac = new OfflineAudioContext(1, 10, 16000);
const osciallator = oac.createOscillator();
osciallator.frequency.value = 400;
osciallator.connect(oac.destination);
osciallator.start(0);
oac.startRendering()
.then((renderedBuffer) => {
console.log(renderedBuffer.sampleRate);
console.log(renderedBuffer.getChannelData(0));
});
您可以在48kHz上执行几乎相同的操作。只有sampleRate会有所不同,但是呈现的AudioBuffer的channelData会是相同的。
const oac = new webkitOfflineAudioContext(1, 10, 48000);
const osciallator = oac.createOscillator();
osciallator.frequency.value = 1200;
osciallator.connect(oac.destination);
osciallator.start(0);
oac.oncomplete = (event) => {
console.log(event.renderedBuffer.sampleRate);
console.log(event.renderedBuffer.getChannelData(0));
};
oac.startRendering();
此外:由于我是standardized-audio-context的作者,{{3}}是一个旨在缓解浏览器实现之间的不一致的库,因此在此必须提及。 :-)它对Safari中的参数限制没有帮助,但是如果参数超出范围,它将至少引发预期的错误。
还请注意,length
独立于numberOfChannels
。如果您的示例中的IfsourceAudioBuffer.duration
是持续时间(以秒为单位),则只需将其与TARGET_SAMPLE_RATE
相乘即可得到所需的length
。