2017-05-10 66 views
1

有沒有辦法在AVPlayer上設置觀察者/回調以在幀改變時得到通知?改變幀的AVPlayer回調(觀察者)

我知道這兩個addBoundaryTimeObserveraddPeriodicTimeObserver但是這些都是需要我估計幀速率近似等

還有一個需要注意的是:

國家總的意見:你可以使用鍵值觀察(KVO)觀察許多玩家動態屬性的狀態變化,例如其當前項或其回放速率。您應該在主線程上註冊並取消註冊KVO更改通知。這樣可以避免在另一個線程正在進行更改時收到部分通知的可能性。 AV Foundation調用主線程上的observeValue(forKeyPath:of:change:context :),即使更改操作是在另一個線程上進行的。

然而currentTimeAVPlayerItem是一種方法,而不是一個性質,所以我不能用志願爲。

回答

0

您可以將AVPlayerItemVideoOutput添加到您的AVPlayerItem中,並定期輪詢hasNewPixelBufferForItemTime的輸出,它會告訴您新幀的到達。但是,您需要獲取copyPixelBufferForItemTime的幀,因此您應該立即發佈它。以下是設置AVPlayerItemVideoOutput的示例。這是輪詢,所以你可能會遲到,甚至錯過一次幀改變。

您也可以快速預處理視頻文件(如果它文件)而不解壓縮幀,以確定幀的顯示時間戳。您可以將這些時間戳一次輸入addBoundaryTimeObserver,以確定何時穿過框架邊界。這裏有一個parsing a video file的例子。

AVSampleBufferDisplayLayer,這是一個較低的水平AVPlayerLayer,讓你給它的視頻幀CMSampleBuffer小號看起來像一個有前途的方法來找出當一個幀的變化,但它似乎不告訴你它已經顯示了你給它的樣本緩衝區之一。我不認爲AVSampleBufferDisplayLayer也可以處理音頻。

您也可以重新實現AVPlayer播放系統 - 然後您會痛苦地(並準確地)意識到幀變化(以及音頻變化和opengl /金屬)。這裏肯定不需要那種努力。你想要實現什麼樣的功能?

+0

嘗試繪製與給定框架對應的屏幕上方的覆蓋物頂部。由於覆蓋圖對應於給定的幀(與給定的時間戳相對應,比如洗刷程序),所以我想在幀更改時更新覆蓋圖。 –