IOS WebAudio仅适用于耳机

时间:2014-01-14 19:37:01

标签: ios safari volume

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

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分: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);

答案 2 :(得分:1)

有同样的问题,最后明白了问题。

如果手机处于静音状态,WebView确实不会在内置扬声器上播放声音。

当我深入挖掘时,我发现了一个解决方法:) 原帖=&gt; 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)
}

答案 3 :(得分:1)

如果iPhone静音按钮按下,则表示iPhone已静音,通过Web Audio Api播放的内容将被静音。

不幸的是,无法通过Javascript来检查该物理按钮(位于iPhone顶部的左边缘)是打开还是关闭。

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