MonoTouch:播放声音

时间:2012-03-28 09:49:19

标签: c# ios xamarin.ios avaudioplayer audiotoolbox

当用户点击特定按钮时,我正在尝试播放短促的声音。但问题是我总是收到对象引用未设置为实例对象。意味着空虚!

我首先尝试了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();

但同样的错误。我用谷歌搜索它,我发现很多人都有这个问题。我们需要知道它是否是一个bug。

3 个答案:

答案 0 :(得分:7)

关于使用SystemSound MP3 ,请参阅此问题和答案: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在播放声音时不会收集实例。

答案 1 :(得分:4)

您的代码看起来是正确的(我与能够播放音频的代码here进行了比较)。

可能的问题是音频文件未以某种方式包含在应用程序包中。您可以使用以下代码轻松检查:

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

答案 2 :(得分:1)

在大多数情况下,File不存在。如果你像我一样,并确保文件存在。确保以下内容:

  1. 文件的路径应为relative到您的班级(即:Sounds\beep.wav)(绝对路径在模拟器上对我不起作用)
  2. 确保您在SoundSystem中定义class level。这是因为MT具有强大的Garbage Collector并且可以在开始播放之前处置您的SoundSystem。见question