簡體   English   中英

將電影中的幀繪制到CGBitmapContext中

[英]Drawing frames from a movie into a CGBitmapContext

我有一個應用程序,需要使用任意CGAffineTransform將視頻/電影中的幀渲染到CGBitmapContext中。 我希望它有一個不錯的幀速率,至少20fps。

我嘗試使用AVURLAsset和[AVAssetImageGenerator copyCGImageAtTime:],並且該方法的文檔明確指出,它的運行速度非常慢,有時會降低到5fps。

有什么更好的方法可以做到這一點? 我認為我可以使用AVPlayerLayer設置一個AVPlayer,然后在我的轉換中使用[CGLayer renderInContext:]。 這行得通嗎? 還是當AVPlayerLayer注意到屏幕上沒有顯示它時,它是否不運行?

還有其他建議嗎?

我最終通過以下方法從視頻幀中獲得了可愛,快速的UIImage:
1)使用視頻的URL創建一個AVURLAsset。
2)使用資產創建一個AVAssetReader。
3)設置讀者的timeRange屬性。
4)使用資產的第一條軌道創建AVAssetReaderTrackOutput。
5)將輸出添加到閱讀器。

然后對於每個幀:
6)調用[輸出copyNextSampleBuffer]。
7)將樣本緩沖區傳遞到CMSampleBufferGetImageBuffer。
8)將圖像緩沖區傳遞到CVPixelBufferLockBaseAddress,只讀
9)使用CVPixelBufferGetBaseAddress獲取圖像緩沖區的基地址
10)從圖像緩沖區中調用帶有尺寸的CGBitmapContextCreate,將基址作為CGBitmap像素的位置。
11)調用CGBitmapContextCreateImage以獲取CGImageRef。

我非常高興地發現這對於擦洗效果非常好。 如果用戶想返回視頻的較早部分,只需使用新的時間范圍創建一個新的AVAssetReader即可。 相當快!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM