【问题标题】:can't fine variable OfflineAudioContext in safari在 Safari 中找不到变量 OfflineAudioContext
【发布时间】:2019-07-28 00:06:10
【问题描述】:

我正在使用网络音频 API 将音频流式传输到我的远程服务器。我正在使用离线音频上下文。该代码在 chrome 和 firefox 中运行良好,但在 safari 中,尝试使用 OfflineAudioContext 时会出现上述错误。我尝试将 webkit 前缀添加到 OfflineAudioContext,然后它给了我这个错误:

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

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

我浏览了 Mozilla 开发者页面以了解浏览器的兼容性,我发现了这个:

所以,这里提到对于 OfflineAudioContext 构造函数,edge 和 safari 的兼容性是未知的。那么,这就是为什么我无法在 Safari 中使用 OfflineAudioContext 的原因吗?还不支持吗?还是我做错了?或者在 safari 中是否有其他方法可以解决这个问题?

这是我第一次使用 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文件代码来更好地了解问题。只需评论它。我会添加,但我认为sn-p足以理解问题)

【问题讨论】:

  • @DarrenSweeney 它不是重复的。请参阅两者中的问题上下文。在发布此问题之前,我已经浏览了该链接。

标签: javascript web web-audio-api


【解决方案1】:

这有点令人困惑,但如果 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 的作者,这是一个试图缓解浏览器实现之间不一致的库,所以我必须在这里提及它。 :-) 它对 Safari 中的参数限制没有帮助,但如果参数超出范围,它至少会抛出预期的错误。

另外请注意length 独立于numberOfChannels。如果您的示例中的IfsourceAudioBuffer.duration 是以秒为单位的持续时间,那么您只需将其与TARGET_SAMPLE_RATE 相乘即可获得所需的length

【讨论】:

  • 所以,我将持续时间乘以 TARGET_SAMPLE_RATE。那么,这里的问题是采样率吗?因为我的采样率为 16000,而您说采样率必须在 44100 到 96000 之间。
  • 是的,您需要将 sampleRate 更改为至少 44100 Hz 才能让 Safari 接受它。但是,例如,您可以使用 48 kHz 来使转换在您的情况下更简单一些。
  • 实际上,我的用例需要 16000 采样率。不能以某种方式使用 16000 作为我的采样率吗??
  • 简短而令人沮丧的答案是“不”。 Apple 已经很长时间没有更新 Web Audio 实现了,而且他们似乎根本没有任何活动。
  • 但在 OfflineAudioContext 的情况下,sampleRate 只是一个单位。您可以将所有内容从 16 kHz 转换为 48 kHz,然后再转换回来。这当然很麻烦。
猜你喜欢
  • 2014-11-21
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 2018-06-09
  • 2013-12-11
  • 2021-01-21
相关资源
最近更新 更多