本文介绍了iPhone 3GS和kCVPixelFormatType_420YpCbCr8BiPlanarFullRange格式是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发具有最新SDK的iOS应用程序,并在iPhone 3GS上对其进行测试.

I'm developing an iOS application with latest SDK and testing it on an iPhone 3GS.

我正在使用init方法:

I'm doing this on init method:

CFDictionaryRef formatDictionary = CVPixelFormatDescriptionCreateWithPixelFormatType(kCFAllocatorDefault, kCVPixelFormatType_420YpCbCr8BiPlanarFullRange);
CFNumberRef val = (CFNumberRef) CFDictionaryGetValue(formatDictionary, kCVPixelFormatBitsPerBlock);
if (val != nil)
{
    CFNumberGetValue(val,kCFNumberSInt8Type, &_bytesPerPixel);
    _bytesPerPixel /= 8;
}
else
    _bytesPerPixel = 4;

但是val始终为零.

在这里:

- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
       fromConnection:(AVCaptureConnection *)connection
{
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

    //Lock the image buffer//
    CVPixelBufferLockBaseAddress(imageBuffer,0);
    //Get information about the image//
    uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer);

    size_t width = CVPixelBufferGetWidth(imageBuffer);
    size_t height = CVPixelBufferGetHeight(imageBuffer);
    //size_t stride = CVPixelBufferGetBytesPerRow(imageBuffer);

    //put buffer in open cv, no memory copied
    cv::Mat image = cv::Mat(height, width, CV_8UC4, baseAddress);

    // copy the image
    //cv::Mat copied_image = image.clone();
    [_previewBufferLock lock];

    memcpy(baseAddress, _lastFrame, _previewSurfaceHeight * _previewSurfaceWidth * _bytesPerPixel);

    [_previewBufferLock unlock];

     //We unlock the  image buffer//
     CVPixelBufferUnlockBaseAddress(imageBuffer,0);
}

我在memcpy行上添加了一个断点,这些是我的vars值:

I have add a breakpoint on memcpy line and I these are my vars values:

但是我在这里得到EXEC_BAD_ACCESS:memcpy(baseAddress, _lastFrame, _previewSurfaceHeight * _previewSurfaceWidth * _bytesPerPixel);

But I'm getting an EXEC_BAD_ACCESS here: memcpy(baseAddress, _lastFrame, _previewSurfaceHeight * _previewSurfaceWidth * _bytesPerPixel);

iPhone 3GS是否支持kCVPixelFormatType_420YpCbCr8BiPlanarFullRange?

推荐答案

不,iPhone 3GS不支持kCVPixelFormatType_420YpCbCr8BiPlanarFullRange作为相机的输出缓冲区类型,仅支持kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange. iPhone 4S和iPhone 5支持全范围YUV输出,但较旧的设备则不支持.

No, the iPhone 3GS does not have support for kCVPixelFormatType_420YpCbCr8BiPlanarFullRange as an output buffer type from the camera, only kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange. The iPhone 4S and iPhone 5 have support for the full-range YUV output, but older devices do not.

您可以使用以下代码测试此可用性:

You can test this availability using the following code:

videoOutput = [[AVCaptureVideoDataOutput alloc] init];

BOOL supportsFullYUVRange = NO;
NSArray *supportedPixelFormats = videoOutput.availableVideoCVPixelFormatTypes;
for (NSNumber *currentPixelFormat in supportedPixelFormats)
{
    if ([currentPixelFormat intValue] == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)
    {
        supportsFullYUVRange = YES;
    }
}

这篇关于iPhone 3GS和kCVPixelFormatType_420YpCbCr8BiPlanarFullRange格式是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-18 00:21