首页 文章

AVQueuePlayer无法播放本地MP3文件

提问于
浏览
1

我目前正在编写一个iOS应用程序,允许用户从soundcloud流式传输音乐 . 目前,我能够在Soundcloud,前台和后台应用程序状态中流畅地播放 . 当我下载MP3文件并试图播放它并且当应用程序在后台,特别是在锁定屏幕或屏幕关闭时连续播放时,我遇到了问题 .

当我播放下载的文件并锁定屏幕时,音频会继续播放一段时间 . 通常它会播放2-3分钟 . 之后播放将停止,播放列表中任何其他下载的mp3文件将无法播放,直到用户返回应用程序 . 如果用户具有互联网连接,则无论下载的项目是否未能播放,播放列表中未下载的项目都将完美播放 .

有时我收到以下错误:

AVPlayerItemStatusFailed:错误域= AVFoundationErrorDomain代码= -11800“操作无法完成”UserInfo = 0x170270500 {NSUnderlyingError = 0x170059380“操作无法完成 . 操作不允许”,NSLocalizedFailureReason =发生未知错误(1),NSLocalizedDescription =操作无法完成}

我还将从AVPlayerItem获得以下通知

通知:NSConcreteNotification 0x1700538c0 {name = AVPlayerItemDidPlayToEndTimeNotification; object = AVPlayerItem:0x178009300,asset = AVURLAsset:0x17822aaa0,URL = file:///var/mobile/Applications/51118E74-3334-4EFC-B148-B485DE675F9E/Documents/Downloads/SC_165903784.mp3}

当正在播放的第一个项目停止播放时,将收到此通知 . 在没有完成播放到其持续时间结束时收到此通知是没有意义的 .

我的猜测是,因为应用程序处于后台模式,所以读取文件的时间有限,但我对此表示怀疑 .

我正在使用以下内容从本地文件创建AVPlayerItem .

NSURL* url = [NSURL fileURLWithPath:song.downloadFilePath]; [AVPlayerItem playerItemWithURL:url];

我已经尝试构建自己的AVQueuePlayer并使用iOS Hysteria Player,但两个实例都给了我相同的离线下载播放错误 .

任何见解或解决方案都非常感谢 .

谢谢!

2 回答

  • 0

    我相信这个问题是由AVQueuePlayer的限制引起的,而HysteriaPlayer使用AVQueuePlayer作为核心播放器,所以这就是原因 .

    我已经看到提到的AVQueuePlayer文件(遗憾的是我找不到)它无法处理与本地和远程音频混合的队列 .

    有一些解决方法:

    使用AVPlayer

    不要使用AVQueuePlayer,自己处理队列并将其提供给AVPlayer .

    分开两个AVQueuePlayer

    一个用于本地媒体,一个用于远程媒体 . 正确插入并使用PlayerItem和Player .

    我会在一个月后修补HysteriaPlayer以满足这个要求,你可以回来那个时候 .

  • 1

    你在Documents目录中播放文件吗? (或者应用程序包之外的任何地方?)

    如果是这样,请确保使用 [fileToSave writeToFile:filePath options:NSDataWritingFileProtectionNone error:nil]; 将文件保存到目录中 .

    NSDataWritingFileProtectionNone 是关键位!至少在我的情况下,正在发生的是:iOS正在尝试保护安全,因此默认情况下对您添加到Documents目录的文件(以及其他非app-bundle目录)启用文件保护, 我相信) . 通过添加 NSDataWritingFileProtectionNone ,您要求系统不再对您的文件启用此保护 .

    Apple's iOS Documentation

    如果您保护文件,您的应用必须准备好失去对该文件的访问权限 . 启用完整文件保护后,当用户锁定设备时,您的应用程序将无法读取和写入文件内容 .

    现在,一旦我读到这一点,我几乎肯定这是我的应用程序无法在设备锁定后无法继续播放的原因 . 出于安全考虑,iOS似乎默认自动将文件置于保护状态......但这会使包括您应用程序在内的所有内容在设备锁定时无法访问它 . 我的错误是它只在设备被锁定时才播放了部分歌曲,这是有道理的...因为它对实际歌曲文件的访问被撤销,它只能播放已经播放过的歌曲的一部分缓冲到RAM!

    这是一个长达一个月的问题的解决方案,我一直在努力解决问题 . 我真诚地希望它能为你解决问题 .

相关问题