2012-02-04 142 views
6

我在高精度同步外部內容CALayerAVPlayer的問題。與AVPlayer的幀同步

我的第一個想法是在CAKeyframeAnimation內佈置一排幀(等於視頻中的幀數),並與AVSynchronizedLayer同步。但是,逐幀逐幀瀏覽視頻時,似乎AVPlayer和Core Animation在不同的週期重繪,因爲它們之間有一個輕微(但明顯的)延遲,然後它們同步。

缺乏處理和通過核心視頻顯示,有沒有一種方法可以在幀級別與AVPlayer準確同步?

更新:2012年2月5日

到目前爲止,我發現做到這一點的最好辦法是通過AVAssetExportSession加上AVVideoCompositionCoreAnimationToolCAKeyFrameAnimation預渲染。但是,我仍然非常有興趣學習任何實時的方法來做到這一點。

回答

3

「高精度」是什麼意思?

儘管文檔聲稱AVAssetReader不是爲實時使用而設計的,但在實踐中,使用它實時閱讀視頻沒有問題(參見https://stackoverflow.com/a/4216161/42961)。返回的幀帶有'演示時間戳',您可以使用CMSampleBufferGetPresentationTimeStamp來獲取。

你會希望項目的一部分成爲'主'計時員。假設你的CALayer動畫是快速計算的,並且不涉及潛在的塊狀的東西,比如磁盤訪問,我會用它作爲主時間源。當你需要繪製(您UIView子類在draw選擇如)的含量,則應該從CALayer動畫讀currentTime,如果必要的話通過AVAssetReader的視頻幀使用copyNextSampleBuffer直到CMSampleBufferGetPresentationTimeStamp收益> = currentTime出發,繪製框架和然後在頂部繪製CALayer動畫內容。

1

如果您的播放器正在使用AVURLAsset,您是否使用精確的持續時間標誌設置了它?即例如:

NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; 
AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:aUrl options:options];