【问题标题】:How to pan audio in iOS' Web Audio implementation?如何在 iOS 的 Web Audio 实现中平移音频?
【发布时间】:2020-12-16 20:30:34
【问题描述】:

WebAudio 规范为双通道 L/R 平移 (StereoPannerNode) 和 3D 空间中的平移 (PannerNode) 提供 API 调用。尽管如此,我还是找不到适用于 iOS 的方法。

关于正常的 L/R 平移,MDN says 2D audioContext.createStereoPanner() 在 iOS 中没有实现。 (或者在桌面 Safari 上。)也许你可以通过直接调用 PannerNode constructor 来创建一个,但我怀疑它是否有效,至少在 iOS 上是这样。

AudioContext panning audio of playing media 展示了一种在没有 StereoPannerNode 的情况下使用通道合并和通道拆分器进行 L/R 平移的方法。但是,MDN says 的 createChannelMerger 并未在 iOS 上实现。也许你可以直接调用ChannelMergeNode constructor,但我也怀疑这是否可行,至少在 iOS 上是这样。

至于 3D 平移,MDN says iOS 不支持 audioContext.createPanner。 (而桌面 Safari 可以。)同样,也许您可​​以直接使用 PannerNode 构造函数,但我对此表示怀疑。所以我认为 3D 平移也行不通。

【问题讨论】:

  • 我没有对此进行测试,因为我无法访问 Safari 或 iOS,但您是否尝试过 ScriptProcessorNode(现已弃用)路由或 AudioWorklet(在 iOS 上不可用, developer.mozilla.org/en-US/docs/Web/API/Worklet/addModule)?似乎您最终不得不得到一个已弃用的解决方案,或者一些奇怪的两个音频文件并在它们之间逐渐消失。

标签: ios web-audio-api


【解决方案1】:

StereoPannerNode 尚不可用,但 3D PannerNode 应该可以正常工作(尚未作为构造函数,但使用 .createPanner() 方法)。例如,您可以通过以下方式在 iOS 上使用 3D 平移器实现立体声平移:

var pan = -1;  // This should be in range [-1, 1]

if (context.createStereoPanner) {
    var panner = context.createStereoPanner();
    panner.pan.value = pan;
} else {
    var panner = context.createPanner();
    panner.panningModel = 'equalpower';
    panner.setPosition(pan, 0, 1 - Math.abs(pan));
}

someSource.connect(panner);
panner.connect(context.destination);

我认为 MDN 支持表不准确或有点过时。查看PannerNode docs at MDN,支持表与您链接的支持表看起来不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多