gpt4 book ai didi

ios - MPMusicPlayerController 不准备/预加载正确

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:48 25 4
gpt4 key购买 nike

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

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

要播放我使用的歌曲:

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

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

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

综上所述,我还没有找到使用 MPMusicPlayerController 预缓冲歌曲的方法。我知道这个问题已经存在一段时间了,因为有一个 old question几年前基本相同的问题,但没有答案。有谁知道如何进行这项工作?

最佳答案

MPMediaPlaybackIsPreparedToPlayDidChangeNotification 看起来已弃用。

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

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

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

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

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

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

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

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

关于ios - MPMusicPlayerController 不准备/预加载正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31520681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com