MonoTouch:播放声音

本文关键字:播放声音 MonoTouch | 更新日期: 2023-09-27 18:29:26

当用户点击特定按钮时,我正在尝试播放一个简短的声音。但问题是,我总是收到对象引用,而不是设置为实例对象。表示空!

我第一次尝试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"在我的根解决方案文件夹中,它被标记为Content。另一种方法是MonoTouch.AVFoundation.AVAudioPlayer

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

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

MonoTouch:播放声音

关于使用SystemSoundMP3请参阅以下问答:使用单触式播放声音

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

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

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

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

您的代码看起来是正确的(我比较了这里的代码,它可以播放音频)。

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

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

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

  1. 文件的路径应该是你的类的relative(即:Sounds'beep.wav)(绝对路径对我在模拟器上不起作用)
  2. 确保您正在class level中定义SoundSystem。这是因为MT有一个非常攻击性的Garbage Collector,甚至可以在它开始播放之前处理掉你的SoundSystem。看看这个问题