2015-09-03 304 views
8

可以將過濾器應用於AVLayer並將其添加到視圖addSublayer將過濾器應用於視頻實時?我想改變顏色並使用Swift爲相機的視頻添加一些噪點,我不知道如何。如何使用雨燕

我想,這可能添加filterLayerpreviewLayer這樣的:

self.view.layer.addSublayer(previewLayer) 
self.view.layer.addSublayer(filterLayer) 

,這也許可以創建我的自定義過濾器的視頻,但我認爲,這是可能做到這一點更有效地usign AVComposition

所以我需要知道:

  1. 將濾鏡應用於攝像機視頻輸出的最簡單方法是什麼?
  2. ,可以合併AVCaptureVideoPreviewLayer的CALayer

感謝每一個建議..

+0

您還沒有提供關於你正在做的事情很多信息,但它可以編輯現場使用'GLKView'而不是'AVCapturePreviewLayer'和應用過濾器的'captureOutput(capptureOutput每一幀視頻輸入: didOutputToSampleBuffer:fromConnection連接:)'。 –

+0

謝謝! GLKView對我更好看。 :)簡單地說:我需要將過濾器應用於視頻幀,並可以選擇將其保存到文件中。我正在做一些帶有過濾器的攝像機。 –

回答

21

還有另一種選擇,使用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

+1

非常感謝!你的文章和回購真的幫助我。但我得到的錯誤,當我嘗試創建dispatch_queue'不能援引「setSampleBufferDelegate」類型的參數列表「(視圖控制器,隊列:dispatch_queue_attr_t)」' –

+0

感謝您的客氣話!看看這個類:https://github.com/FlexMonkey/ParticleCam/blob/master/ParticleCam/ViewController.swift –

+1

哈,我的錯......我使用的是iOS 8.4.1 所以,問題就迎刃而解了。再次謝謝你。 –