【发布时间】:2017-09-11 11:44:20
【问题描述】:
在 Xamarin.iOS 应用程序中,AVAudioPlayer 用于录制和播放一些音频文件。
用户非常快速地录制和保存一些音频文件,当他尝试播放其中一个文件时,它会在行中抛出 System.Exception:
NSError error;
_player = new AVAudioPlayer(NSUrl.FromFilename(_audioPlaybackFilePath), "m4a", out error);
System.Exception:无法初始化该类型的实例 'AVFoundation.AVAudioPlayer':本机 'initWithContentsOfURL:fileTypeHint:error:' 方法返回 nil。这是 可以通过设置忽略此条件 MonoTouch.ObjCRuntime.Class.ThrowOnInitFailure 为 false。
给定路径中的文件存在。
- 有任何迹象表明问题可能是什么?
- 有什么方法可以将 MonoTouch.ObjCRuntime.Class.ThrowOnInitFailure 设置为 false,因为它在 Exception StackTrace 中声明?
【问题讨论】:
-
method returned nil:您的NSUrl没有返回可用于创建AVAudioPlayer的有效文件 -
问题是文件存在(
File.Exists使用给定的路径返回 true。很少返回 false!)。那么我应该将AVAudioPlayer的初始化包装到try catch 中吗?有没有办法在我初始化AVAudioPlayer之前验证文件是否有效? -
以某种方式是的......如果文件仍然被刷新到“磁盘”并被 Mono 关闭,因此被 iOS 关闭(无论这是由于多线程用户代码还是通过 iOS)并且你正在尝试打开它(通过 AVAudioPlayer),错误是有道理的。您可以引入一些重试逻辑来检查文件是否存在,如果存在,请检查它不是零字节并且可以在排他锁中打开,等等......在使用
AVAudioPlayer.FromUrl之前。 -
我个人会使用
AVAudioPlayer.FromData,就好像你要做文件存在检查、大小检查和负载锁定测试一样,你不妨使用数据(NSData)来创建你的AVAudioPlayer实例 -
你试过
_player = new AVAudioPlayer(new NSUrl(_audioPlaybackFilePath), "m4a", out error);吗?
标签: c# ios xamarin xamarin.ios avaudioplayer