【问题标题】:Capturing video and displaying images using captureOutput:captureOutput didOutputSampleBuffer:sampleBuffer fromConnection:connection使用 captureOutput:captureOutput didOutputSampleBuffer:sampleBuffer fromConnection:connection 捕获视频和显示图像
【发布时间】:2012-09-28 14:27:42
【问题描述】:

我试图更好地理解 AVFoundation 框架以及各种 Core xxxx 框架,因此我决定尝试一个简单的视频捕获,看看是否可以将图像作为图像输出到 UI。我查看了 rosyWriter 代码和文档,但没有任何答案。所以:

我有标准的捕获会话代码来添加输入和输出。以下与问题相关:

//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 秒后,我收到“收到内存警告”错误并且应用程序关闭。这是什么原因造成的?

【问题讨论】:

    标签: ios avfoundation objective-c-blocks avcapturesession


    【解决方案1】:

    1) 通常是的,您应该这样做。您可以在主队列上运行它,但这可能会导致 UI 响应等问题。

    2) 正确。

    3) 您正在创建一系列 CGImageRefs。你在哪里释放它们?

    如果您需要对视频的渲染进行精细控制,出于性能原因,您可能应该使用 OpenGL。否则,您可以使用 AVCaptureVideoPreviewLayer 轻松获得预览。

    【讨论】:

    • 谢谢史蒂夫。这只是一个初步测试。真的,我想做的甚至不是在屏幕上渲染这些图像,而是获取它们的像素并分析它们。我希望能够做到这一点而不必进入 OpenGL。我在这里渲染它们以便能够进一步分析它们。所以,我会取一帧,断点,分析它,继续程序以确保像素分析反映捕获的图像。我是否过于复杂了,我应该只学习 Open GL。谢谢
    • 出于性能原因,我会使用 OpenGL。如果您想快速了解图像处理,请查看Brad Larson'sGPUImage。您正在做的事情可以很好地进行测试。只要确保你在某处 CFRelease 那些 CVImageRefs。
    • 我认为通过使用 ARC,我不必再释放任何对象,而是阅读 createCGImage 方法详细信息(以及 CF 的复制/创建逻辑)。感谢您的帮助
    猜你喜欢
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多