无法在野生动物园中优化变量OfflineAudioContext

时间:2019-03-06 10:45:25

标签: javascript web web-audio-api

我正在使用Web音频API将音频流传输到远程服务器。我正在使用OfflineAudioContext。该代码在chrome和firefox中可以正常工作,但在野生动物园中,尝试使用OfflineAudioContext时会出现上述错误。我尝试将 webkit 前缀添加到OfflineAudioContext,这会给我这个错误:

  

SyntaxError:字符串与预期的模式不匹配。

我尝试将不同的值添加到OfflineAudioContext构造函数,但是它总是给我相同的错误。

我浏览了Mozilla开发人员页面以了解浏览器的兼容性,我发现了这一点:

enter image description here

因此,在这里提到了对于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文件的更多代码才能更好地了解问题。只需对其进行注释。我会补充一点,但我认为该代码段足以理解问题)

1 个答案:

答案 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