MPMusicPlayerController不备/预装正确

问题描述 投票:3回答:1

我使用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以基本相同的问题,但没有答案。有谁知道如何使这项工作?

ios mpmusicplayercontroller
1个回答
0
投票

MPMediaPlaybackIsPreparedToPlayDidChangeNotification看起来过时的。

该MPMediaPlayerController getter和通知是一种垃圾,而不是“一致”的说法在你设定的值和预期值相同回来当你再次抓住它的方式。

我所说的“缓冲”这首歌解决了这个第一,因为我的应用程序经常会在歌曲的中间开始。所以我的缓冲算法中是 - 我会播放歌曲,然后等待播放状态改变的通知,然后再次暂停,等待另一个notifcation。这一过程将毫无疑问触发MPMusicPlayerControllerNowPlayingItemDidChangeNotification,最后这首歌是准备玩或者突变(设置currentTime的或速率)。这似乎很好地工作。

该prepareToPlay完成处理也是垃圾。这似乎触发之前这首歌实际上是准备打的,该方法实际上似乎开始播放:(,这是比它导致的,这似乎是常见的报告为苹果开发论坛一个“错误”。

在prepareToPlay回调,设置currentPlaybackTime或利率不会实际发生变异的球员 - 你需要等待了一段时间的附加MPMusicPlayerControllerNowPlayingItemDidChangeNotification回放首次在歌曲开始前后你有任何运气突变,任何玩家的属性。

currentPlaybackRate和时间也都不是很可靠的,虽然他们是更可靠的,一旦真正开始播放。我会把它缓存哪些用户将其设置为直到开始播放,解决了一致性问题。还有很多更在这里得到了currentPlaybackRate或时间一致,让我知道,如果你想有一个代码示例,为抓住这些属性的阅读会产生取决于执行的线程上不同的结果:(

检查播放状态是不可靠的或者不幸。通常我发现,玩家报告MPMusicPlaybackStatePlaying当其完全停下来,不是在玩 - 它无限期地保持这样在某些情况下。如果MPMediaPlayerController确实正在播放基于调用播放或暂停和MPMusicPlayerControllerPlaybackStateDidChangeNotification确认玩家的后续跟进已经开始采取行动,我建议抽象出来的任何裁定。

我要提到我在iOS 12.1.3,苹果似乎间歇性,修复小bug或随着时间的推移增加更多的API破损。自现在很破,任何改进可能会破坏你建立解决任何抽象层 - 所以我测试每个IOS版本,以确保一切仍然是“作品”。

希望这有助于一点,它是一个真正的斗争。

© www.soinside.com 2019 - 2024. All rights reserved.