iOS:AVFoundation图像捕捉黑暗

时间:2013-07-23 20:50:48

标签: ios image avfoundation capture

我正在开发一款可以从iPad前置摄像头拍摄照片的应用程序。 照片非常黑暗。 有人知道如何解决这个问题吗?

这是我的代码和一些解释:

1)我初始化我的捕获会话

-(void)viewDidAppear:(BOOL)animated{

    captureSession = [[AVCaptureSession alloc] init];
    NSArray *devices = [AVCaptureDevice devices];
    AVCaptureDevice *frontCamera;
    for (AVCaptureDevice *device in devices){
        if ([device position] == AVCaptureDevicePositionFront) {
            frontCamera = device;
        }
    }

    if ([frontCamera isExposureModeSupported:AVCaptureExposureModeContinuousAutoExposure]){
        NSError *error=nil;
        if ([frontCamera lockForConfiguration:&error]){
            frontCamera.exposureMode = AVCaptureExposureModeContinuousAutoExposure;
            frontCamera.focusMode=AVCaptureFocusModeAutoFocus;
            [frontCamera unlockForConfiguration];
        }
    }

    NSError *error = nil;
    AVCaptureDeviceInput *frontFacingCameraDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:frontCamera error:&error];
    [captureSession addInput:frontFacingCameraDeviceInput];
    [captureSession setSessionPreset:AVCaptureSessionPresetHigh];
    captureVideoOutput = [[AVCaptureVideoDataOutput alloc] init];
    captureImageOutput =[[AVCaptureStillImageOutput alloc] init];
    [captureSession addOutput:captureVideoOutput];
    [captureSession addOutput:captureImageOutput];

}

2)当用户按下按钮Record时,它会启动一个计时器并将相机的内容预览到预览图层

- (IBAction)but_record:(UIButton *)sender {

    MainInt = 4;
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(countup) userInfo:nil repeats:YES];
    previewLayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:captureSession];
    previewLayer.connection.videoOrientation = AVCaptureVideoOrientationPortrait;
    CGRect rect = CGRectMake(0, 0, self.aView.bounds.size.width, self.aView.bounds.size.height);
    previewLayer.frame = rect;
    [self.aView.layer addSublayer:previewLayer];
    [captureSession startRunning];

}

3)在计时器结束时,拍摄并保存照片

- (void)countup {
    MainInt -=1;
    if (MainInt == 0)  {      
        [timer invalidate];
        timer = nil;

        [captureSession stopRunning];
        AVCaptureConnection *videoConnection = nil;
        for (AVCaptureConnection *connection in captureImageOutput.connections)
        {
            for (AVCaptureInputPort *port in [connection inputPorts])
            {
                if ([[port mediaType] isEqual:AVMediaTypeVideo] )
                {
                    videoConnection = connection;
                    break;
                }
            }
            if (videoConnection) { break; }
        }

        [captureImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error)
        {
            CFDictionaryRef exifAttachments = CMGetAttachment( imageSampleBuffer, kCGImagePropertyExifDictionary, NULL);
            NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
            stillImage = [[UIImage alloc] initWithData:imageData];
        }];

        [captureSession startRunning];
        [captureSession stopRunning];
    }  
}

4)最后,当用户按下保存按钮时,图像将记录在特定的相册中

- (IBAction)but_save:(UIButton *)sender {
    UIImage *img = stillImage;
    [self.library saveImage:img toAlbum:@"mySpecificAlbum" withCompletionBlock:^(NSError *error)];  
}

事实上,所有代码都能正常工作,但结果图像很暗......

2 个答案:

答案 0 :(得分:5)

这也发生在我身上,事实证明我试图过早捕捉并且相机没有足够的时间来稳定。在图片正常亮度之前,我不得不添加大约0.5秒的延迟。

HTH

答案 1 :(得分:1)

我在iOS 7第5代ipod touch上遇到了同样的问题,但在使用iOS 6.1的第4代ipod touch上却没有。

我发现修复是显示相机的预览:

// Setup camera preview image
AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];
[_previewImage.layer addSublayer:previewLayer];

按照https://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_MediaCapture.html#//apple_ref/doc/uid/TP40010188-CH5-SW22

的指示

注意:如果没有预览,我没有调查完成此操作