天天看點

Metal 攝像頭采集渲染

一、建立MTKView

這裡增加了framebufferOnly設定為NO,正常預設是YES,如果不設定該參數則在執行drawInMTKView的時候調用

會提示執行錯誤

-[MTLDebugComputeCommandEncoder setTexture:atIndex:]:380: failed assertion `frameBufferOnly texture not supported for compute.'

這裡将sourceTexture通過filter的編碼commandbuffer的方法寫到了destinationTexture;由于如果不設定為NO則預設view.currentDrawable.texture隻是隻讀的情況

在建立MTKView的時候增加

建立CVMetalTextureCacheRef _textureCache,這是Core Video的Metal紋理緩存

二、由于是實時顯示攝像頭的内容,則需要從捕獲攝像頭内容到螢幕顯示這樣的一個過程

1、該過程我就把它稱之為捕獲回話AVCaptureSession;則先建立一個該會話

這裡增加了預設值1920x1080,指定了接收者(螢幕要顯示的分辨率)在攝像頭的分辨率範圍内,設定的值越大則越清晰。

2、設定攝像頭為捕獲會話輸入的裝置

這裡可以看到,先擷取所有的攝像頭,然後枚舉找到後置的攝像頭作為輸入的攝像頭。

判斷能否加入輸入裝置,再加入。

3、設定輸出到螢幕上的資料格式

由于每一針都是要按照先後順序顯示的,是以使用了線程的序列。并設定了本身為代理的類,則通過代理的協定實作對應的函數captureOutput

4、設定顯示的連接配接方向

通過輸出裝置來設定視訊相對于home鍵的方向

5、最後串聯了輸入和輸出之後則開始運作

[self.mCaptureSession startRunning];

三、captureOutput 是從輸出裝置中捕獲到的,需要對該捕獲的内容進行适當的處理為drawInMTKView需要的内容進行顯示

攝像頭回傳<code>CMSampleBufferRef</code>資料,找到<code>CVPixelBufferRef</code>,用<code>CVMetalTextureCacheCreateTextureFromImage</code>建立CoreVideo的Metal紋理緩存<code>CVMetalTextureRef</code>,最後通過<code>CVMetalTextureGetTexture</code>得到Metal的紋理;

四、每一幀的MTKView的顯示回調drawInMTKView

1、MPSImageGaussianBlur的頭檔案是#import &lt;MetalPerformanceShaders/MetalPerformanceShaders.h&gt;

這個是metal顯示的shader相關則需要導入該頭檔案

2、建立完成之後通過encodeToCommandBuffer 執行:Encode a MPSKernel into a command Buffer.  The operation shall proceed out-of-place.

參考:https://www.jianshu.com/p/d3d698120891