2016-02-04 48 views
3

我正在使用Swift在視圖的AVPlayerLayer中顯示來自AVPlayer的內容。關聯AVPlayerItem有videoComposition,並稍微簡化了代碼的版本來創建它(沒有錯誤檢查等),看起來是這樣的:如何在AVVideoComposition的applyCIFiltersWithHandler中觸發重繪過濾器?

playerItem.videoComposition = AVVideoComposition(asset: someAsset, applyingCIFiltersWithHandler: { 
       [unowned self] (request: AVAsynchronousCIImageFilteringRequest) in 

    let paramDict = << set up parameter dictionary based on class vars >> 

    // filter the image 
    let filter = self.ciFilterWithParamDict(paramDict) { 
    filter.setValue(request.sourceImage, forKey: kCIInputImageKey) 
    if let filteredImage = filter.outputImage { 
     request.finishWithImage(filteredImage, context: nil) 
    } 
}) 

這個AVPlayer播放或尋求在預期所有的作品。如果創建並加載了新的videoComposition,則AVPlayerLayer將正確呈現。

但是,我沒有找到一種方法,當我更改了一些用來計算濾波器參數的值時,「觸發」AVPlayer/AVPlayerItem/AVVideoComposition來重新渲染。如果我改變了數值然後玩或尋求,它就會被正確渲染,但只有在我玩或尋求的時候。有沒有辦法觸發渲染「到位」?

+0

這方面的進展如何?我遇到同樣的問題 –

+0

沒有進展。對不起,布萊恩。我放棄了,而是隻是非實時地逐幀渲染。 –

回答

3

我用一個hack來完全替換avPlayerItem來強制刷新。但是,如果有一種方法可以觸發avPlayerItem直接重新渲染,那將會更好。

// If the video is paused, force the player to re-render the frame. 
if (self.avPlayer.currentItem.asset && self.avPlayer.rate == 0) { 
    CMTime currentTime = self.avPlayerItem.currentTime; 

    [self.avPlayer replaceCurrentItemWithPlayerItem:nil]; 
    [self.avPlayer replaceCurrentItemWithPlayerItem:self.avPlayerItem]; 
    [self.avPlayerItem seekToTime:currentTime toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero]; 
} 
0

這可能會幫助你。

let currentTime = self.player.current() 
self.player.play() 
self.player.pause() 
self.player.seek(to: currentTime, toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero) 
1

,我知道該怎麼做,這是一個暫停AVPlayer編輯CIFilter輸入時的AVPlayerItem簡單地創建一個新的AVVideoComposition實例的最好方法。根據我的經驗,這比將玩家物品交換回玩家更快更清潔。您可能認爲創建新視頻合成速度很慢,但實際上,您所做的只是重新定義該特定幀的渲染路徑,這與使您的更改受到影響的核心圖像緩存部分失效幾乎一樣有效。

這裏的關鍵是播放器項目的視頻組合必須以某種方式失效以觸發重繪。簡單地改變核心圖像過濾器的輸入參數令人難過(我知道)無效視頻合成,這是問題的根源。

通過爲AVPlayerItem創建一個AVMutableVideoComposition實例,並在暫停編輯時以某種方式改變它(通過更改諸如instructions,animationTool,frameDuration之類的東西),您可以獲得更高的效率。

相關問題