在Xamarin Forms iOS中播放MP3及解决NSUrl序列化播放异常
我正在开发一款MP3播放应用,Android端实现很简单:
- 使用
Xamarin.Essentials.FilePicker选择MP3文件路径 - 通过Android.Media.MediaPlayer播放对应路径的MP3
iOS端尝试了两种方案,都遇到了问题:
方案一:Xamarin.Essentials.FilePicker + AVAudioEngine
流程和Android端类似:
- 用
Xamarin.Essentials.FilePicker选择iCloud或本地的MP3文件路径 - 通过AVAudioEngine播放该路径的MP3
这个方案在模拟器中可以正常运行,但真机上创建AVAudioFile时抛出异常(LibVlcSharp加载路径也失败):
NSError err; AVAudioFile file = new AVAudioFile(new NSUrl(audioUri, false), out err); // 抛出异常后err为空
异常信息:
"Could not initialize an instance of the type 'AVFoundation.AVAudioFile': the native 'initForReading:error:' method returned nil.
It is possible to ignore this condition by setting ObjCRuntime.Class.ThrowOnInitFailure to false."
即使设置ThrowOnInitFailure = false,file仍然为空。
方案二:MPMediaPickerController
怀疑是权限问题,尝试用MPMediaPickerController:
MPMediaPickerController mp = new MPMediaPickerController(); mp.AllowsPickingMultipleItems = false; mp.ShowsCloudItems = true; UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(mp, true, null);
已经将MPMediaLibraryAuthorizationStatus设置为Authorized,并在info.plist中添加了权限描述:
<key>NSAppleMusicUsageDescription</key> <string>Select a music file</string>
但这段代码没有任何效果。
请问如何让任一方案生效?
更新:新问题——NSUrl序列化后重建异常
已成功让MediaPicker正常工作,现在遇到新问题:从MediaPicker获取的NSUrl直接传入AVAudioEngine可以正常播放,但将NSUrl保存为字符串序列化后,重建的NSUrl无法创建AVAudioFile,抛出和之前相同的异常:
// url1可正常使用 NSUrl url1 = mediaItemCollection.Items[0].AssetURL; AVAudioFile file = new AVAudioFile(url1, out err); // url2抛出上述相同异常 string str = mediaItemCollection.Items[0].AssetURL.AbsoluteString; NSUrl url2 = new NSUrl(str, false); AVAudioFile file = new AVAudioFile(url2, out err);
请问有什么解决思路?
内容的提问来源于stack exchange,提问作者jho

