簡體   English   中英

將CIFilter與AVFoundation一起使用(iOS)

[英]Using CIFilter with AVFoundation (iOS)

我正在嘗試將過濾器應用於在iOS上使用AVFoundation創建的視頻合成(過濾器可能是,例如,模糊,像素化,棕褐色等)。 我需要實時應用效果並能夠將復合視頻渲染到磁盤,但我很高興從一個或另一個開始。

不幸的是,我似乎無法想出這個。 這是我能做的:

  • 我可以為正在播放電影的UIView添加一個動畫層,但是我不清楚我是否可以這樣處理傳入的視頻圖像。
  • 我可以向AVPlayerLayer添加一組CIFilter,但事實證明這些在iOS中被忽略(它只適用於Mac OS X)。
  • 我可以將一個AVVideoCompositionCoreAnimationTool添加到AVVideoCompopsition,但我不確定這會完成視頻處理(而不是動畫),並且它會因為無法設計用於實時播放的消息而崩潰。 我相信這是渲染到磁盤時渲染動畫的解決方案。

其他應用程序這樣做(我認為),所以我認為我錯過了一些明顯的東西。

注意:我已經研究了GPUImage,我很樂意使用它,但它對電影,特別是帶有音頻的電影效果不佳。 參見例如:

您可以使用AVVideoCompositingAVAsynchronousVideoCompositionRequest協議來實現自定義合成器。

CVPixelBufferRef pixelBuffer = [AVAsynchronousVideoCompositionRequest sourceFrameByTrackID:trackID];
CIImage *theImage = [CIImage imageWithCVPixelBuffer:pixelBuffer];
CIImage *motionBlurredImage = [[CIFilter *filterWithName:@"CIMotionBlur" keysAndValues:@"inputImage", theImage, nil] valueForKey:kCIOutputImageKey];
CIContext *someCIContext = [CIContext contextWithEAGLContext:eaglContext];
[someCIContext render:motionBlurredImage toCVPixelBuffer:outputBuffer];

然后使用Apple的文檔中描述的OpenGL渲染像素緩沖區。 這將允許您實現所需的任意數量的轉換或過濾器。 然后,您可以設置AVAssetExportSession.videoCompostion,然后您就可以將合成視頻導出到磁盤。

您可以使用AVAssetReader讀取AVComposition(它是AVAsset子類)。 獲取像素緩沖區,將其傳遞給CIFilter(設置它以便它使用GPU進行渲染(無顏色管理等)並根據您的需要在屏幕/輸出緩沖區上渲染它。我不認為Blur可以實時實現,除非你直接使用GPU。

您可以閱讀有關CIFilter應用程序的視頻(應用過濾器到視頻部分):

https://developer.apple.com/library/ios/documentation/graphicsimaging/conceptual/CoreImaging/ci_tasks/ci_tasks.html#//apple_ref/doc/uid/TP30001185-CH3-BAJDAHAD

暫無
暫無

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

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