1

使用 AVCaptureSessionPresetMedium 时

// Create the session
AVCaptureSession * newSession = [[AVCaptureSession alloc] init];

// Configure our capturesession
newSession.sessionPreset = AVCaptureSessionPresetMedium;

有没有办法动态地告诉宽度 x 高度这将解决什么问题?显然我可以等到像这样的代表

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

被调用并在那里确定它,但我宁愿提前这样做,以便我可以出于性能原因预先计算一些值。

4

1 回答 1

4

我很高兴被证明是错误的,但是如果您不想对数字进行硬编码,以下步骤似乎是正确的方法:

-(CGSize)cameraSizeForCameraInput:(AVCaptureDeviceInput*)input
{
        NSArray *ports = [input ports];
        AVCaptureInputPort *usePort = nil;
        for ( AVCaptureInputPort *port in ports )
        {
                if ( usePort == nil || [port.mediaType isEqualToString:AVMediaTypeVideo] )
                {
                        usePort = port;
                }
        }

        if ( usePort == nil ) return CGSizeZero;

        CMFormatDescriptionRef format = [usePort formatDescription];
        CMVideoDimensions dim = CMVideoFormatDescriptionGetDimensions(format);

        CGSize cameraSize = CGSizeMake(dim.width, dim.height);

        return cameraSize;
}

这必须在调用后startRunning调用,否则结果为 0,0。我不知道将来会发生什么,所以这就是我循环ports数组的原因。

于 2011-04-10T16:58:19.093 回答