本地文件使用 AVAudioPlayer 播放,但不使用 AVPlayer?

Posted

技术标签:

【中文标题】本地文件使用 AVAudioPlayer 播放,但不使用 AVPlayer?【英文标题】:Local file plays with AVAudioPlayer but not with AVPlayer? 【发布时间】:2012-02-29 07:58:52 【问题描述】:

(注意:这里的代码是 Monotouch/C#,但是欢迎 Objective-C 回答!)

我使用 AVPlayer 作为我的应用程序播放 iPod 库文件以及本地 mp3/m4a 文件。播放 iPod 库文件很好,但是我似乎无法让 AVPlayer 播放本地 mp3 文件。

例如,此代码有效:

NSUrl url;
AVAudioPlayer player2;

url = NSUrl.FromFilename(Path.Combine(Constants.TrackCacheLocation , songPath));

/* The url variable has the value file://localhost/private/var/mobile/Applications/B1ED2576-4398-43F3-8573-2FA3A0342265/Documents/Cache/Remote/dcaad4ff-452e-4d91-8788-c018e6b286f2.mp3 */

player2 = AVAudioPlayer.FromUrl(url);
player2.Play();

以上工作正常,注意它使用的是 AVAudioPlayer

这不是(使用 AVPlayer):

NSUrl url;
AVPlayer player2;

url = NSUrl.FromFilename(Path.Combine(Constants.TrackCacheLocation , songPath));

/* The url variable has the value file://localhost/private/var/mobile/Applications/B1ED2576-4398-43F3-8573-2FA3A0342265/Documents/Cache/Remote/dcaad4ff-452e-4d91-8788-c018e6b286f2.mp3 */

player2 = AVPlayer.FromUrl(url);
player2.Play();

从本地或远程 Web 服务器创建 NSUrl 也可以(使用 AVPlayer),例如:http://10.0.0.1/testing/test.mp3 在加载时延迟大约一两秒,然后开始正常播放。我有一种感觉,我没有正确创建我的 NSUrl(即使它对 AVAudioPlayer 工作正常)。任何人都知道可能出了什么问题?

另外,如果我检查 AVPlayer 的 CurrentItem.Status 它仍然是未知的,它永远不会更改为 ReadyToPlay

【问题讨论】:

你调用“PrepareToPlay()”了吗? AVPlayer 上没有 PrepareToPlay()(我可以在 Apple 的文档中看到),只有 AVAudioPlayer。 【参考方案1】:

许多使用 NSUrlNSUrlRequest 参数的 API 在设计上是 async 并且如果定义为局部变量(例如,当您的方法将被收集)会出现问题 (or even crash)当本机代码仍然需要时返回)。

您上面的代码没有提供足够的信息来说明它们的创建位置。如果您使用局部变量,请尝试将它们提升为字段并确保它们存在(例如,不要重新分配它们),直到您不再需要 AVPlayer

【讨论】:

avplayer 是在类级别创建的。作为一个音乐播放应用程序,该课程永久保留在范围内。 nsurl 是在方法中声明的。请注意,avplayer 运行良好,iTunes 库文件和远程 url 的问题为零,它只是本地文件系统文件拒绝播放 这可能是无关的,但请尝试一下,因为对 URL 的本地和远程访问将使用不同的代码路径并且行为会有所不同(仅对其进行测试,非常简单,可以判断你肯定)。 刚刚测试了这将所有变量作为类级别变量,仍然没有运气让它工作。 Track 绝对有效,因为它与 AVAudioPlayer 一起播放(表明 url 也是有效的),并且还通过 Xcode 导出并在 iTunes 中播放。 我建议您在bugzilla.xamarin.com 填写错误报告并附上我们可以用来重现您的问题的示例。 作为一种解决方法,我根据我从哪里播放音乐来换入和换出 AVPlayer 和 AVAudioPlayer。它工作得相当干净。不过,我会收集一个示例应用程序并提交一份错误报告,因为对所有音频都使用 AVPlayer 会很好。

以上是关于本地文件使用 AVAudioPlayer 播放,但不使用 AVPlayer?的主要内容,如果未能解决你的问题,请参考以下文章

iOS音频播放

无法使用 AVAudioPlayer 播放存储在文档目录中的本地 mp3 文件

使用AVAudioPlayer播放音乐文件无声音

使用 AVAudioPlayer 播放音频

来自服务器的 MP3 文件在 iOS7 中无法使用 AVAudioPlayer 播放

ios 如何播放在线的音频文件