使用AVFoundation捕获时获取黑色照片

时间:2014-09-21 10:00:51

标签: ios

我制作了照片捕捉和视频录制自定义视图(在一个视图中有2个功能)。

初始视图:

_session = [[AVCaptureSession alloc] init];
        _session.sessionPreset = AVCaptureSessionPreset640x480;

        _captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_session];
        _captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
        _captureVideoPreviewLayer.frame = _previewView.layer.bounds; // parent of layer
        [_previewView.layer addSublayer:_captureVideoPreviewLayer];

        AVCaptureDevice *videoDevice = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo][0];

        if ([videoDevice isFlashAvailable] && videoDevice.flashActive && [videoDevice lockForConfiguration:nil]) {
            videoDevice.flashMode = AVCaptureFlashModeOff;
            [videoDevice unlockForConfiguration];
        }

        NSError * error = nil;
        AVCaptureDeviceInput * input = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];
        if (!input) {
            if (_delegate && [_delegate respondsToSelector:@selector(customCameraViewDidLoadFailed)]) {
                [_delegate customCameraViewDidLoadFailed];
            }
        }

        if ([_session canAddInput:input]) {
            [_session addInput:input];
        }

        AVCaptureDevice *audioDevice = [[AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio] firstObject];
        AVCaptureDeviceInput *audioDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error];

        if (!audioDeviceInput) {
            if (_delegate && [_delegate respondsToSelector:@selector(customCameraViewDidLoadFailed)]) {
                [_delegate customCameraViewDidLoadFailed];
            }
        }

        if ([_session canAddInput:audioDeviceInput]) {
            [_session addInput:audioDeviceInput];
        }


        _stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
        NSDictionary * outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG, AVVideoCodecKey, nil];
        [_stillImageOutput setOutputSettings:outputSettings];

        if ([_session canAddOutput:_stillImageOutput]) {
            [_session addOutput:_stillImageOutput];
        }


        _movieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
        if ([_session canAddOutput:_movieFileOutput])
        {
            [_session addOutput:_movieFileOutput];
            AVCaptureConnection *connection = [_movieFileOutput connectionWithMediaType:AVMediaTypeVideo];
            if ([connection isVideoStabilizationSupported]) {
                [connection setEnablesVideoStabilizationWhenAvailable:YES];
            }
        }

        [_session startRunning];

在Capture方法中:

_session.sessionPreset = AVCaptureSessionPreset640x480;
_isCapturing = YES;
AVCaptureConnection *videoConnection = nil;
for (AVCaptureConnection *connection in _stillImageOutput.connections)
{
    for (AVCaptureInputPort *port in [connection inputPorts])
    {
        if ([[port mediaType] isEqual:AVMediaTypeVideo] )
        {
            videoConnection = connection;
            break;
        }
    }

    if (videoConnection) {
        break;
    }
}

[_loadingView startAnimating];

[_stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error)
 {

     NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];

     UIImage * capturedImage = [[UIImage alloc]initWithData:imageData scale:1];

     _isCapturing = NO;
     imageData = nil;

     [_loadingView stopAnimating];

     if (_delegate && [_delegate respondsToSelector:@selector(customCameraView:didFinishCaptureImage:)]) {
         [_delegate customCameraView:self didFinishCaptureImage:capturedImage];
     }
 }];

我遇到的问题是,当我拍摄的第一张照片/视频时,它总是黑色照片,视频。

Photo

你能帮我解决这个问题吗? 非常感谢!

0 个答案:

没有答案