2014-02-28 76 views
1

我正在使用SPPlaybackManager播放曲目,但在播放的一些小而重要的方面遇到困难。曲目正在加载和流式传输,但通常在调用SPAsyncLoading的回调函数后25到1.25秒内开始播放。我已经尝试了很多方法来查看曲目真正开始播放的时间,但似乎都表明播放已经在调用SPAsyncLoading回调(包括playbackManager.isPlaying,playbackManager.currentTrack等)时开始播放。我确定回放实际上是在我之前提到的短暂延迟之后开始的,通过设置NSTimer在SPAsyncLoading回调时运行10秒,在10秒后获得playbackManager.trackPosition并找出差异。 TL; DR - 当CocoaLibSpotify说它启动时,播放实际上并不开始。SPPlaybackManager - 延迟和加载

由于这个原因,出现了一些问题:首先,最重要的是,歌曲在最后由最初回调和回放之间存在的任何偏移量截断。其次,从用户体验的角度来看,我需要能够向我的用户指出他们处于SPAsyncLoading回调和实际回放(即赛道准备进行比赛但尚未比赛)之间的“死角”。任何有关如何规避或解决这些问题的建议都非常感谢!

回答

1

首先,不要使用SPAsyncLoading播放相关的东西 - 这不是它的目的,并且SPPlaybackManager无论如何都不确认<SPAsyncLoading>

一旦库已接受播放轨道,isPlaying属性将翻转为YES,并且您应该将播放/暂停UI用于此属性。由于延迟和缓存等原因,音频可能需要一段时间才会出现,就像您看到的一样。

但是,trackPosition属性会更新为将音频推送到扬声器的直接结果。使用计时器来观看这个过​​度的技巧 - 只需使用KVO观察值,并且您将始终保持同步。

请注意,SPPlaybackManager是设计用于播放单曲的非常简单的类。对于更高级的播放,我建议您查看SPPlaybackManager的代码,并将其用于您自己班级的底层,该底层直接使用SPSessionSPCoreAudioController的播放方式 - 您可以通过这种方式更好地控制播放。我所知道的唯一的Objective-C示例是Viva项目 - 特别是VivaPlaybackManagerover on GitHub。该类支持随机播放,本地文件播放,Last.fm等,因此它可能也是也是复杂的,但它确实没有丢失单个样本的多轨回放。

+0

非常有帮助的回答。当然很惊讶地发现我们不应该使用'SPAsyncLoading'进行播放。我们应该调用'preloadTrackForPlayback'吗? –

+0

正确。 SPAsyncLoading仅适用于元数据,仅适用于公共符合“”协议的类 - “SPPlaybackManager”不属于这些类之一。 'preLoadTrackForPlayback'不是必需的,但是如果你有时间备用(例如,前一首歌曲即将完成),将会减少调用'playTrack:'和获取音频之间的等待时间。调用'preloadTrackForPlayback'立即跟随'playTrack:'不会让你加速。 – iKenndac

+0

当我自己调用'playTrack:'时,我得到错误“资源尚未加载”,因此我在启动播放之前如何获得必要的数据感到困惑。我错过了什么吗?非常感谢你们的帮助。 –