Pey*_*man 4 c# avaudioplayer xamarin.ios audiotoolbox ios
当用户点击特定按钮时,我正在尝试播放短促的声音.但问题是我总是收到未设置为实例对象的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();
Run Code Online (Sandbox Code Playgroud)
让我注意到"click.mp3"在我的根解决方案文件夹中,它被标记为内容.另一种方法是MonoTouch.AVFoundation.AVAudioPlayer.
var url = NSUrl.FromFilename("click.mp3");
AVAudioPlayer player = AVAudioPlayer.FromUrl(url);
player.FinishedPlaying += (sender, e) => { player.Dispose(); };
player.Play();
Run Code Online (Sandbox Code Playgroud)
但同样的错误.我用谷歌搜索它,我发现很多人都有这个问题.我们需要知道它是否是一个bug.
关于使用SystemSound和MP3看到这个问题和答案:用Monotouch播放声音
请AVAudioPlayer注意以下模式是危险的:
AVAudioPlayer player = AVAudioPlayer.FromUrl(url);
player.FinishedPlaying += (sender, e) => { player.Dispose(); };
player.Play();
Run Code Online (Sandbox Code Playgroud)
因为Play是异步的.这意味着托管player实例在FinishedPlaying发生之前可能超出范围.反过来,这超出范围意味着GC可能已经收集了实例.
解决此问题的方法是将player局部变量提升为类型字段.这将确保GC在播放声音时不会收集实例.
| 归档时间: |
|
| 查看次数: |
5227 次 |
| 最近记录: |