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。
关于使用SystemSound
和MP3请参阅以下问答:使用单触式播放声音
对于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
不存在。如果你和我一样,并且你确保文件存在。确保以下内容:
- 文件的路径应该是你的类的
relative
(即:Sounds'beep.wav
)(绝对路径对我在模拟器上不起作用) - 确保您正在
class level
中定义SoundSystem
。这是因为MT有一个非常攻击性的Garbage Collector
,甚至可以在它开始播放之前处理掉你的SoundSystem
。看看这个问题