2012-03-28 209 views
4

我試圖在用戶點擊特定按鈕時播放短暫的聲音。但問題是我總是收到對象引用未設置爲實例對象。意味着空!MonoTouch:播放聲音

我第一次嘗試了MonoTouch.AudioToolBox.SystemSound。

MonoTouch.AudioToolbox.AudioSession.Initialize(); 
MonoTouch.AudioToolbox.AudioSession.Category = MonoTouch.AudioToolbox.AudioSessionCategory.MediaPlayback; 
MonoTouch.AudioToolbox.AudioSession.SetActive(true); 

var t = MonoTouch.AudioToolbox.SystemSound.FromFile("click.mp3"); 
t.PlaySystemSound(); 

讓我注意到「click.mp3」在我的根解決方案文件夾中,它被標記爲內容。另一種方法是MonoTouch.AVFoundation.AVAudioPlayer

var url = NSUrl.FromFilename("click.mp3"); 
AVAudioPlayer player = AVAudioPlayer.FromUrl(url); 
player.FinishedPlaying += (sender, e) => { player.Dispose(); }; 
player.Play(); 

但是同樣的錯誤。我搜索了它,我發現很多人都有這個問題。我們需要知道它是否是一個錯誤。

+0

注意:上面的前3行是在iOS7(初始化,類別,SetActive)不推薦使用...沒有它們的偉大工程。 – Ender2050 2014-04-26 15:11:00

回答

4

你的代碼看起來是正確的(我比較代碼here,它可以播放音頻)。

問題可能是音頻文件不包含在應用程序包中。您可以輕鬆地使用此代碼檢查:

if (!System.IO.File.Exists ("click.mp3")) 
    Console.WriteLine ("bundling error"); 
+0

太棒了!你是對的。我試過你的方法,我發現這個文件不存在。所以我再次檢查了這個文件,現在我發現它沒有被標記爲內容。我改變它,但它不會工作。我刪除了obj文件夾,問題終於解決了。謝謝。 – Peyman 2012-03-28 15:34:35

+0

仍然不適合我。聲音文件存在。我設定了一個brakpoint。我的'sound.PlaySystemSound()'行被擊中,'sound'是SystemSound的有效實例。我的設備音量一直處於上升狀態。我的聲音不起作用。期。我開始非常討厭Xamarin。即使在最愚蠢的簡單情況下,iOS也不會做它所說的事情。 – 2016-02-01 23:38:55

7

關於使用SystemSoundMP3看到這個問題的答案:Playing a Sound With Monotouch

對於AVAudioPlayer注意,下面的模式是很危險的:

AVAudioPlayer player = AVAudioPlayer.FromUrl(url); 
player.FinishedPlaying += (sender, e) => { player.Dispose(); }; 
player.Play(); 

由於Play是異步的。這意味着管理的player實例可能會在FinishedPlaying發生之前超出範圍。反過來,超出範圍意味着GC可能已經收集實例。

解決此問題的一種方法是將player局部變量提升爲類型字段。這將確保GC在播放聲音時不會收集實例。

+0

在回調發生之前玩家不會被處置。 OS具有對回調lambda的實時引用(它必須,在完成播放時實際執行回調)。在參考文件消失之前,播放器本身仍處於活動對象圖中。在調用player.Dispose()之後,玩家有資格使用GC,但不能在該點之前。 – 2016-07-07 17:30:15

1

在大多數情況下,這將是File不存在。如果你和我一樣,並且你確定文件存在。請確保以下幾點:

  1. 的文件的路徑應該是relative到類(即:Sounds\beep.wav)(絕對路徑並沒有爲我在模擬器上工作)
  2. 確保您在定義SoundSystemclass level。這是因爲MT有一個積極的Garbage Collector,並且可以在你開始玩之前處置你的SoundSystem。看到這question