You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Xamarin Forms iOS中播放MP3及解决NSUrl序列化播放异常

iOS平台Xamarin MP3播放问题及序列化NSUrl异常解决思路

我正在开发一款MP3播放应用,Android端实现很简单:

  • 使用Xamarin.Essentials.FilePicker选择MP3文件路径
  • 通过Android.Media.MediaPlayer播放对应路径的MP3

iOS端尝试了两种方案,都遇到了问题:

方案一:Xamarin.Essentials.FilePicker + AVAudioEngine

流程和Android端类似:

  1. 用Xamarin.Essentials.FilePicker选择iCloud或本地的MP3文件路径
  2. 通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:02:38