MPMusicPlayerController 未正确准备/预加载

2024-01-20

我正在使用 MPMusicPlayerController,因此我的应用程序可以播放用户通过 iTunes 购买的音乐。当我选择一首歌曲并开始播放时,声音开始之前有一段延迟。我假设这首歌是从云端缓冲的。

问题是我还没有找到一种方法来知道缓冲何时完成以及音频何时实际开始。

要播放我使用的歌曲:

_mediaController = [MPMusicPlayerController applicationMusicPlayer];
[_mediaController setQueueWithItemCollection:collection];
[_mediaController beginGeneratingPlaybackNotifications];
[_mediaController play];

一旦我调用“play”,就会调用播放状态更改通知,并且播放状态为“MPMusicPlaybackStatePlaying”,即使用户听不到任何音乐。我注意到,即使 mediaController 处于“播放”播放状态,_mediaController.currentPlaybackTime 始终等于 0,直到可以听到音乐,此时 currentPlaybackTime 可以正确跟踪音乐。

我以为我可以使用 [_mediaControllerprepareToPlay] 方法来预加载音频文件,但是当我使用它时,永远不会调用 MPMediaPlaybackIsPreparedToPlayDidChangeNotification 通知。所以 mediaController 永远不会被标记为“准备好”。

尽管如此,我还没有找到使用 MPMusicPlayerController 预缓冲歌曲的方法。我知道这个问题已经存在了一段时间,因为有一个老问题 https://stackoverflow.com/questions/12171343/mpmusicplayercontroller-buffering-preloading几年前有本质上相同的问题,但没有答案。有谁知道如何进行这项工作?


MPMediaPlaybackIsPreparedToPlayDidChangeNotification 看起来已弃用。

MPMediaPlayerController getter 和通知是一种垃圾,并且在您设置值并期望再次获取它时返回相同值的方式上根本不“一致”。

我通过首先“缓冲”歌曲来解决这个问题,因为我的应用程序经常会在歌曲中间启动。所以我的缓冲算法是 - 我将播放歌曲,然后等待播放状态更改通知,然后再次暂停并等待另一个通知。这个过程无疑会触发 MPMusicPlayerControllerNowPlayingItemDidChangeNotification,然后最终歌曲准备好播放或被改变(设置 currentTime 或 Rate)。这看起来效果很好。

prepareToPlay 完成处理程序也是垃圾。它似乎在歌曲真正准备好播放之前就触发了,并且该方法实际上似乎开始播放:(,这比它引导的要多。这似乎在苹果开发论坛中通常被报告为“错误”。

在prepareToPlay回调中,设置currentPlaybackTime或Rate实际上不会改变播放器 - 您需要在歌曲第一次开始播放后等待额外的MPMusicPlayerControllerNowPlayingItemDidChangeNotification,然后才能有幸改变任何播放器属性。

currentPlaybackRate 和 Time 也不是很可靠,尽管一旦播放实际开始它们就更可靠。我会将其缓存为用户设置的值,直到开始播放以解决一致性问题。这里还有更多内容可以一致地获取 currentPlaybackRate 或时间,如果您想要代码示例,请告诉我,因为获取这些属性进行读取将根据执行线程产生不同的结果:(

不幸的是,检查播放状态也不可靠。我经常发现播放器在完全暂停且不播放时会报告 MPMusicPlaybackStatePlaying - 在某些情况下它会无限期地保持这种状态。我建议根据播放或暂停的调用以及 MPMusicPlayerControllerPlaybackStateDidChangeNotification 的后续后续确认播放器已开始该操作来抽象出 MPMediaPlayerController 是否实际正在播放的任何确定。

我应该提到我使用的是 iOS 12.1.3,因为随着时间的推移,Apple 似乎会间歇性地修复一个小错误或添加更多 API 损坏。由于它现在已经很糟糕了,任何改进都可能会破坏您为修复它而构建的任何抽象层 - 因此我正在测试每个 iOS 版本以确保一切仍然“有效”。

希望这能有所帮助,这是一场真正的斗争。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MPMusicPlayerController 未正确准备/预加载 的相关文章

随机推荐