4

当用户点击特定按钮时,我正在尝试播放短声。但问题是我总是收到Object reference not set to an instance 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了一下,发现很多人都有这个问题。我们需要知道它是否是一个错误。

4

3 回答 3

7

关于使用SystemSoundMP3看到这个问题和答案:用 Monotouch 播放声音

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

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

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

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

于 2012-03-28T12:50:32.017 回答
4

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

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

if (!System.IO.File.Exists ("click.mp3"))
    Console.WriteLine ("bundling error");
于 2012-03-28T10:47:28.330 回答
1

在大多数情况下,它是File不存在的。如果您像我一样,并且确保该文件存在。确保以下内容:

  1. 文件的路径应该是relative你的类(即:Sounds\beep.wav)(绝对路径在模拟器上对我不起作用)
  2. 确保您SoundSystemclass level. 这是因为 MT 具有很强的攻击性,甚至可以在它开始播放之前Garbage Collector就处理掉你。SoundSystem看到这个问题
于 2013-05-30T00:30:43.473 回答