【问题标题】:Is there any way to improve time between shots with AVCaptureStillImageOutput?有什么方法可以改善使用 AVCaptureStillImageOutput 拍摄之间的时间吗?
【发布时间】:2010-12-13 23:36:26
【问题描述】:

我目前使用以下代码拍摄一系列图像:

- (void)shootSeries:(int)photos {
    if(photos == 0) {
        [self mergeImages];
    } else {
        [output captureStillImageAsynchronouslyFromConnection:connection completionHandler:
            ^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {
                NSLog(@"Shot picture %d.", 7 - photos);
                [self shootSeries:(photos - 1)];

                CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(imageDataSampleBuffer);

                CVPixelBufferLockBaseAddress(pixelBuffer, 0);
                int dataSize = CVPixelBufferGetDataSize(pixelBuffer);
                CFDataRef data = CFDataCreate(NULL, (const UInt8 *)CVPixelBufferGetBaseAddress(pixelBuffer), dataSize);
                CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);

                CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData(data);
                CFRelease(data);

                CGImageRef image = CGImageCreate(CVPixelBufferGetWidth(pixelBuffer),
                                                 CVPixelBufferGetHeight(pixelBuffer),
                                                 8, 32,
                                                 CVPixelBufferGetBytesPerRow(pixelBuffer),
                                                 colorspace,
                                                 kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little,
                                                 dataProvider, NULL, true, kCGRenderingIntentDefault);
                CFRelease(dataProvider);

                CFArrayAppendValue(shotPictures, image);
                CFRelease(image);
            }];
    }
}

虽然这工作得很好,但速度很慢。为什么像 ClearCam 这样的应用程序可以比这更快地拍摄系列照片?我该怎么做?

【问题讨论】:

  • 你发现了吗?如果是这样,如果您能发布答案,我将不胜感激。我尝试了很多技术,例如创建多个输入和输出并在它们之间循环,或者在每次拍摄后添加/删除输入/输出。我的问题是,如果允许用户非常快速地拍照,最终会出现 NULL CMSampleBuffers 和“AVFoundation out of memory”错误。最终的结果是部分照片丢失了,这显然比强迫他们更慢地拍照更糟糕。

标签: iphone objective-c ios avfoundation


【解决方案1】:

捕获图像后,将样本缓冲区存储在 CFArray 中,一旦您完成所有手机的拍摄,然后将它们转换为图像(或在您的情况下为 CGImageRefs)。

【讨论】:

  • 我现在已经尝试了很多小时来保存到 CFMutableArray 并在转换为 UIImages 之后,但我就是无法让它工作。你有这方面的示例代码吗?
猜你喜欢
  • 2023-04-05
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
相关资源
最近更新 更多