[英]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.