2012-09-28 85 views
3

我想更好地理解AVFoundation框架以及各種核心xxxx框架,所以我決定嘗試一個簡單的視頻捕捉,看看我是否可以輸出爲圖像到用戶界面。我看着rosyWriter代碼以及文檔,但沒有回答。所以:捕獲視頻和使用captureOutput顯示圖像:captureOutput didOutputSampleBuffer:sampleBuffer fromConnection:connection

我有標準捕獲會話代碼來添加輸入和輸出。以下是相關的問題:

//moving the buffer processing off the main queue 
dispatch_queue_t bufferProcessingQueue=dispatch_queue_create("theBufferQueue", NULL); 
[self.theOutput setSampleBufferDelegate:self queue:bufferProcessingQueue]; 
dispatch_release(bufferProcessingQueue); 

然後委託:

-(void) captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
     fromConnection:(AVCaptureConnection *)connection 
    { 

    CVPixelBufferRef pb = CMSampleBufferGetImageBuffer(sampleBuffer); 

    CIImage *ciImage = [CIImage imageWithCVPixelBuffer:pb]; 
    CGImageRef ref = [self.theContext createCGImage:ciImage fromRect:ciImage.extent]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.testBufferImage.image= [UIImage imageWithCGImage:ref scale:1.0 orientation:UIImageOrientationRight]; 
    }); 
} 

問題:

1 - 我猜測,正如我上面做了,我們應該始終設置委託像上面那樣在單獨的隊列上運行,而不是主隊列。正確?

2-結合起來,在委託方法中,處理UI的任何調用必須像我一樣返回到主隊列。正確?

3-當我運行此代碼,大約5-10秒後,我收到「收到內存警告」錯誤,並關閉應用程序。什麼會造成這種情況?

在此先感謝。 KMB

回答

2

1)通常是的,你應該。您可以在主隊列上運行它,但這可能會導致UI響應性等問題。

2)正確。

3)您正在創建一系列CGImageRefs。你在哪裏發佈它們?

出於性能方面的原因,如果您需要對視頻渲染進行良好控制,您應該可以使用OpenGL。否則,您可以使用AVCaptureVideoPreviewLayer輕鬆獲取預覽。

+0

謝謝史蒂夫。這只是一個初步測試。真的,我試圖做的是甚至不在屏幕上渲染這些圖像,而是獲取它們的像素並分析它們。我希望能夠做到這一點,而不必進入OpenGL。我在這裏渲染它們以便能夠進一步分析它們。所以,我會採取一個框架,斷點,分析它,繼續該程序以確保像素分析反映捕獲的圖像。我過於複雜,我應該學習Open GL。謝謝 – Spectravideo328

+0

我會使用OpenGL出於性能原因。如果您想快速瞭解圖像處理檢查[Brad Larson's](http://stackoverflow.com/users/19679/brad-larson)[GPUImage](http://www.google.com) /url?sa=t&rct=j&q=brad%20larson%20gpuimage&source=web&cd=1&cad=rja&ved=0CB0QFjAA&url=https%3A%2F%2Fgithub.com%2FBradLarson%2FGPUImage&ei=OgRmUJmOLevpiwKzhoGoBQ&usg=AFQjCNHzBO8bMGWO2bBFhe8DTjMv7eTQBQ)。你在做什麼對於測試事情是很好的。只要確保你的CFRelease那些CVImageRefs在某處。 –

+0

我認爲通過使用ARC,我不會再釋放任何對象,但隨後讀取createCGImage方法的詳細信息(以及CF的複製/創建邏輯)。感謝您的幫助 – Spectravideo328

相關問題