2017-09-02 113 views
0

我目前正致力於將這個web audio API demo適用於我正在開發的項目,但在iPhone上測試時沒有聲音。它可以在iPad上正常工作。Web Audio API演示不適用於iOS

我搜索過的解決方案,並發現這個thread StackOverflow上與其中一個答案的下面的代碼片段:

的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 –

回答

1

我感覺真的很蠢。顯然,如果你的iPhone處於振動模式,聲音不會播放。

0

只要您使用用戶交互事件調用函數,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

0

我自己的經驗是,有時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頁面,但現在不能)。我也是一個新手程序員,我確信有更好的方法可以編寫代碼。