還有另一種選擇,使用AVCaptureSession創建CIImage的實例,你可以申請CIFilters(其中有負載,從模糊到色彩校正,VFX)。
下面是使用ComicBook效果的示例。概括地說,創建一個AVCaptureSession:
let captureSession = AVCaptureSession()
captureSession.sessionPreset = AVCaptureSessionPresetPhoto
創建AVCaptureDevice表示相機的,在這裏我設置了背部攝像頭:
let backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
然後創建一個具體的實現裝置的並連接它參加會議。在斯威夫特2,實例AVCaptureDeviceInput可以拋出一個錯誤,所以我們需要趕上:
do
{
let input = try AVCaptureDeviceInput(device: backCamera)
captureSession.addInput(input)
}
catch
{
print("can't access camera")
return
}
現在,這裏有一個小「疑難雜症」:雖然我們不實際使用的AVCaptureVideoPreviewLayer但它需要得到樣品委派工作,所以我們創建了其中的一個:
// although we don't use this, it's required to get captureOutput invoked
let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
view.layer.addSublayer(previewLayer)
接下來,我們創建了一個視頻輸出,AVCaptureVideoDataOutput我們將使用它來訪問視頻飼料:
let videoOutput = AVCaptureVideoDataOutput()
確保自我實現AVCaptureVideoDataOutputSampleBufferDelegate,我們可以設置視頻輸出採樣緩衝區委託:
videoOutput.setSampleBufferDelegate(self,
queue: dispatch_queue_create("sample buffer delegate", DISPATCH_QUEUE_SERIAL))
視頻輸出,然後連接到捕獲會話:
captureSession.addOutput(videoOutput)
...最後,我們開始捕獲會話:
captureSession.startRunning()
因爲我們已經設置了委託,captureOutput將在每個幀捕獲時被調用。 captureOutput傳遞類型CMSampleBuffer的樣品緩衝液,它只是需要兩行代碼來將數據轉換爲一個CIImage爲核心圖像處理:
let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
let cameraImage = CIImage(CVPixelBuffer: pixelBuffer!)
...和圖像數據傳遞到我們的漫畫書實現這,反過來,用於填充的圖像視圖:
let comicEffect = CIFilter(name: "CIComicEffect")
comicEffect!.setValue(cameraImage, forKey: kCIInputImageKey)
let filteredImage = UIImage(CIImage: comicEffect!.valueForKey(kCIOutputImageKey) as! CIImage!)
dispatch_async(dispatch_get_main_queue())
{
self.imageView.image = filteredImage
}
我有source code for this project available in my GitHub repo here。
您還沒有提供關於你正在做的事情很多信息,但它可以編輯現場使用'GLKView'而不是'AVCapturePreviewLayer'和應用過濾器的'captureOutput(capptureOutput每一幀視頻輸入: didOutputToSampleBuffer:fromConnection連接:)'。 –
謝謝! GLKView對我更好看。 :)簡單地說:我需要將過濾器應用於視頻幀,並可以選擇將其保存到文件中。我正在做一些帶有過濾器的攝像機。 –