2014-02-28 109 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:'時,我得到錯誤「資源尚未加載」,因此我在啓動播放之前如何獲得必要的數據感到困惑。我錯過了什麼嗎?非常感謝你們的幫助。 –