Web Audio API演示不适用于iOS

问题描述:

我目前正致力于将这个web audio API demo适用于我正在开发的项目,但在iPhone上测试时没有声音。它可以在iPad上正常工作。Web Audio API演示不适用于iOS

我搜索过的解决方案,并发现这个thread *上与其中一个答案的下面的代码片段:

的Safari在iOS 6上有效地与网络音频API静音启动。在您尝试播放用户输入 事件(创建缓冲区来源,将其连接到目标,并呼叫 noteOn())之前,它将不会取消静音。在此之后,它取消静音并且音频播放不受限制,并且它应该是 。这是如何通过Web Audio API在iOS 6 工作的无证方面(苹果的doc是在这里,希望他们有 提到的这一声更新!)

用户输入事件应该是onclick事件在播放按钮,但改为使用noteOn()而不是start()仍然不能解决它。

更新:我也尝试绑定播放按钮与touchend事件,但无济于事。

下面是一个使用noteOn()函数:

function playNote(buffer, pan, x, y, z, sendGain, mainGain, playbackRate, noteTime) { 
    // Create the note 
    var voice = context.createBufferSource(); 
    voice.buffer = buffer; 
    voice.playbackRate.value = playbackRate; 

    // Optionally, connect to a panner 
    var finalNode; 
    if (pan) { 
     var panner = context.createPanner(); 
     panner.panningModel = "HRTF"; 
     panner.setPosition(x, y, z); 
     voice.connect(panner); 
     finalNode = panner; 
    } else { 
     finalNode = voice; 
    } 

    // Connect to dry mix 
    var dryGainNode = context.createGain(); 
    dryGainNode.gain.value = mainGain * effectDryMix; 
    finalNode.connect(dryGainNode); 
    dryGainNode.connect(masterGainNode); 

    // Connect to wet mix 
    var wetGainNode = context.createGain(); 
    wetGainNode.gain.value = sendGain; 
    finalNode.connect(wetGainNode); 
    wetGainNode.connect(convolver); 

    if (iOS) {   
     voice.noteOn(noteTime);  
    } 
    else { 
     voice.start(noteTime); 
    } 
} 

任何建议,将不胜感激。谢谢。

+0

请显示您的代码 – user7951676

+0

我已经添加了调用noteOn()的函数,但代码库相当大。该项目位于https:// github上的Github上。com/cwilso/MIDIDrums –

+0

最初的演示在这里,它也不能在iPhone上工作。 http://webaudiodemos.appspot.com/MIDIDrums/index.html –

我感觉真的很蠢。显然,如果你的iPhone处于振动模式,声音不会播放。

只要您使用用户交互事件调用函数,start()方法应该可以在iOS上没有if else语句的情况下正常工作。也翻转你传递y和z到panner的顺序,因为z有一些奇怪的原因。 这里有一个工作的例子,改变的东西在里面,以适应你的需要,大部分是不需要,我已经得到了别人的地方,使用DOM添加事件侦听器

 <script> 
     var audioCtx = new (window . AudioContext || window . webkitAudioContext) () ; 
     var oscillator = audioCtx . createOscillator () ; 
     var gainNode = audioCtx . createGain(); 
     oscillator . connect (gainNode) ; 
     gainNode . connect (audioCtx . destination); 
     oscillator . type = 'sine' ; 
     oscillator . frequency . value =440 

     gainNode . gain . value = 1; 
     </script> 
     <button onclick="oscillator . start();">play</button> 
+0

谢谢。我将删除该逻辑并修复y和z。下面是使用playNote()函数绑定播放按钮的方法:document.getElementById('play')。addEventListener('touchend',handlePlay,true); –

+0

如果有用,我添加一个工作示例 – user7951676

我自己的经验是,有时Web Audio API适用于iPhone,有时不适用。这是一个5分钟前在我的iPhone 6上工作的页面; 1分钟前它没有工作;现在它又来了!

http://www.stephenandrewtaylor.net/dna-sonification/

下面是另外一个,间歇工作;它工作2分钟前,现在它不(动画工作,只有没有音频)。

http://www.stephenandrewtaylor.net/lie-sonification/

它可能有多少个标签在Safari中打开做;您可以尝试关闭一些打开的选项卡(现在我有5个选项卡,包括2分钟前工作的lie-sonificaton页面,但现在不能)。我也是一个新手程序员,我确信有更好的方法可以编写代码。