【问题标题】:SPPlaybackManager - latency and loadingSPPlaybackManager - 延迟和加载
【发布时间】:2014-04-01 22:11:29
【问题描述】:

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

因此出现了一些问题:首先,也是最重要的,歌曲在结束时被回调和最初播放之间存在的任何偏移量所截断。其次,从用户体验的角度来看,我需要能够向我的用户表明他们处于 SPAsyncLoading 回调和实际播放之间的“死区”(即,曲目正在准备播放,但尚未播放)。非常感谢任何有关规避或解决这些问题的方法的建议!

【问题讨论】:

    标签: ios cocoalibspotify-2.0


    【解决方案1】:

    首先,不要将SPAsyncLoading 用于与播放相关的内容——这不是它的用途,而且SPPlaybackManager 无论如何都不会确认<SPAsyncLoading>

    一旦库接受轨道进行播放,isPlaying 属性将翻转为 YES,您应该将播放/暂停 UI 基于此属性。由于延迟和缓存等原因,音频可能需要一段时间才能如您所见。

    不过,trackPosition 属性会作为音频推送到扬声器的直接结果而更新。使用计时器来观察这是多余的 - 只需使用 KVO 来观察值,您将始终保持同步。

    请注意,SPPlaybackManager 是一个非常简单的类,专为播放单个曲目而设计。对于更高级的播放,我建议查看 SPPlaybackManager 的代码并将其用作您自己的类的基础,该类直接使用 SPSessionSPCoreAudioController 的播放方法 - 您将更好地控制播放大大地。我知道的唯一 Objective-C 示例是在 Viva 项目中 - 特别是 VivaPlaybackManagerover on GitHub。该类支持随机播放、本地文件播放、Last.fm 等,因此它可能复杂,但它可以很好地进行多轨播放而不会丢失单个样本。

    【讨论】:

    • 非常有帮助的答案。看到我们不应该使用SPAsyncLoading 进行播放当然很惊讶。我们应该打电话给preloadTrackForPlayback 吗?
    • 正确。 SPAsyncLoading 仅适用于元数据,并且仅适用于公开符合 <SPAsyncLoading> 协议的类 - SPPlaybackManager 不是这些类之一。 preLoadTrackForPlayback 不是必需的,但如果您有空闲时间(例如,上一首曲目即将结束),它将减少调用 playTrack: 和获取音频之间的延迟。立即调用 preloadTrackForPlayback 后跟 playTrack: 不会让您加快速度。
    • 当我自己调用playTrack: 时,我收到错误“资源尚未加载”,因此我对如何在开始播放之前获取必要数据感到困惑。我错过了什么吗?非常感谢您的帮助。
    • 我想我误读了你原来的问题的一部分——我以为你在你的播放器类上使用 SPAsyncLoading 来找出它什么时候开始播放。那是行不通的。但是,您确实需要确保在播放曲目之前已加载它们。不过,我的其余答案仍然有效。
    猜你喜欢
    • 2018-06-24
    • 2016-12-14
    • 2019-02-12
    • 2011-02-16
    • 1970-01-01
    • 2011-03-14
    • 2011-10-17
    • 1970-01-01
    • 2019-02-01
    相关资源
    最近更新 更多