gpt4 book ai didi

ios - 使用 captureOutput :captureOutput didOutputSampleBuffer:sampleBuffer fromConnection:connection 捕获视频并显示图像

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:06:26 26 4
gpt4 key购买 nike

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

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

//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- 我猜,正如我上面所做的那样,我们应该始终将委托(delegate)设置为像我上面所做的那样在单独的队列上运行,而不是在主队列上运行。正确吗?

2- 结合起来,在委托(delegate)方法中,任何处理 UI 的调用都必须像我一样放回主队列。正确吗?

3- 当我运行此代码时,大约 5 到 10 秒后,我收到“收到内存警告”错误并且应用程序关闭。什么可能导致这种情况?

最佳答案

1) 一般来说是的,你应该。您可以在主队列上运行它,但这可能会导致 UI 响应问题等。

2) 正确。

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

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

关于ios - 使用 captureOutput :captureOutput didOutputSampleBuffer:sampleBuffer fromConnection:connection 捕获视频并显示图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12641974/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com