MonoTouch:播放声音

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

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

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

你的代码看起来是正确的(我在这里比较了能够​​播放音频的代码)。

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

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

关于使用SystemSoundMP3,请参阅此问题和答案: 使用Monotouch播放声音

对于AVAudioPlayer注意以下模式是危险的:

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

因为Play是异步的。 这意味着在FinishedPlaying发生之前,托管player实例可能超出范围。 反过来,这超出范围意味着GC可能已经收集了实例。

解决此问题的方法是将player局部变量提升为类型字段。 这将确保GC在播放声音时不会收集实例。

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

  1. 文件的路径应该是relative对于你的类(即: Sounds\beep.wav )(绝对路径在模拟器上对我不起作用)
  2. 确保您在class level定义SoundSystem 。 这是因为MT有一个SoundSystem Garbage Collector ,可以在开始播放之前处理你的SoundSystem 。 看到这个问题
Interesting Posts