IOS WebAudio仅适用于耳机

问题描述 投票:3回答:4

我已经遇到了一段时间的问题,在某些ios设备上,我的webaudio系统似乎只能与耳机配合使用,其他设备(完全相同的操作系统,型号等)音频通过扬声器或耳机播放完美。我已经搜索过这个问题的解决方案但是没有找到关于这个问题的任何内容。我唯一能想到的是它可能是一个音频通道问题。我很难过。有没有人遇到过这个问题,或者有任何修复建议?谢谢!

ios safari volume
4个回答
9
投票

这可能是因为iPhone的侧面开关处于“静音”状态。这非常令人困惑 - 当手机静音时,HTML5 <audio>标签仍能正常播放,但WebAudio却没有。为什么?谁知道。但这是一个限制,我目前还没有找到解决办法。


5
投票

@Alastair是正确的,静音切换开关会使WebAudio静音,但它不会使HTML5标签静音。由于他的工作,我设法找到了一个Web的工作,即使在静音切换开关打开时也可以播放WebAudio。我发布这个作为对他回复的评论,但我没有声誉。

要播放WebAudio,您还必须在用户操作期间播放至少一个WebAudio声源节点和一个HTML5标记。如果这些声音是短暂的沉默,那就没问题。我发现这个自包含代码无需任何额外文件即可运行:

var isWebAudioUnlocked = false;
var isHTMLAudioUnlocked = false;

function unlock() {
    if (isWebAudioUnlocked  && isHTMLAudioUnlocked) return;

    // Unlock WebAudio - create short silent buffer and play it
    // This will allow us to play web audio at any time in the app
    var buffer = myContext.createBuffer(1, 1, 22050); // 1/10th of a second of silence
    var source = myContext.createBufferSource();
    source.buffer = buffer;
    source.connect(myContext.destination);
    source.onended = function()
    {
        console.log("WebAudio unlocked!");
        isWebAudioUnlocked = true;
        if (isWebAudioUnlocked && isHTMLAudioUnlocked)
        {
            console.log("WebAudio unlocked and playable w/ mute toggled on!");
            window.removeEventListener("mousedown", unlock);
        }
    };
    source.start();

    // Unlock HTML5 Audio - load a data url of short silence and play it
    // This will allow us to play web audio when the mute toggle is on
    var silenceDataURL:string = "data:audio/mp3;base64,//MkxAAHiAICWABElBeKPL/RANb2w+yiT1g/gTok//lP/W/l3h8QO/OCdCqCW2Cw//MkxAQHkAIWUAhEmAQXWUOFW2dxPu//9mr60ElY5sseQ+xxesmHKtZr7bsqqX2L//MkxAgFwAYiQAhEAC2hq22d3///9FTV6tA36JdgBJoOGgc+7qvqej5Zu7/7uI9l//MkxBQHAAYi8AhEAO193vt9KGOq+6qcT7hhfN5FTInmwk8RkqKImTM55pRQHQSq//MkxBsGkgoIAABHhTACIJLf99nVI///yuW1uBqWfEu7CgNPWGpUadBmZ////4sL//MkxCMHMAH9iABEmAsKioqKigsLCwtVTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVV//MkxCkECAUYCAAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV";
    var tag:HTMLAudioElement = document.createElement("audio");
    tag.controls = false;
    tag.preload = "auto";
    tag.loop = false;
    tag.src = silenceDataURL;
    tag.onended = function()
    {
        console.log("HTMLAudio unlocked!");
        isHTMLAudioUnlocked = true;
        if (isWebAudioUnlocked && isHTMLAudioUnlocked)
        {
            console.log("WebAudio unlocked and playable w/ mute toggled on!");
            window.removeEventListener("mousedown", unlock);
        }
    };
    var p = tag.play();
    if (p) p.then(function(){console.log("play success")}, function(reason){console.log("play failed", reason)});
}

window.addEventListener("mousedown", unlock);

1
投票

有同样的问题,终于明白了问题。

如果手机静音,WebView不会在内置扬声器上播放声音。

当我深入挖掘时,我找到了一个解决方法:)原始帖子=> https://stackoverflow.com/a/37874619/8064246

do {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
    //print("AVAudioSession Category Playback OK")
    do {
        try AVAudioSession.sharedInstance().setActive(true)
        //print("AVAudioSession is Active")
    } catch _ as NSError {
        //print(error.localizedDescription)
    }
} catch _ as NSError {
    //print(error.localizedDescription)
}

1
投票

如果iPhone静音按钮关闭,意味着iPhone静音,则通过Web Audio Api播放的内容将被静音。

不幸的是,没有办法检查是否通过Javascript打开或关闭了物理按钮(位于iPhone顶部的左边缘)。

此问题完全独立于以下事实:在iOS Safari中,音频必须由用户操作启动才能取消静音。有一些技巧可以克服这个事实,包括Spencer建议的那个,你是否使用用户启动的“任何动作或特定动作”来“播放”静音音频文件以允许随后播放音频文件玩无人的。

© www.soinside.com 2019 - 2024. All rights reserved.