在UIView - iOS中显示相机Feed

时间:2018-03-16 09:40:01

标签: objective-c uiview avfoundation avcapturesession avcapturedevice

我在视图控制器中放置了一个简单UIView的iOS应用。我试图在UIView中显示前置摄像头的摄像头。我不想拍照或录制视频,我只想在UIView中显示实时Feed。

我尝试实施AVCaptureVideoPreviewLayer,但我得到的Feed是空白的。似乎什么也没发生。这是我的代码:

AVCaptureSession *session = [[AVCaptureSession alloc] init];
[session setSessionPreset:AVCaptureSessionPresetPhoto];

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

NSError *error = nil;
AVCaptureDeviceInput *input;

    @try {

        input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];

    } @catch (NSException *exception) {
        NSLog(@"Error; %@", error);
    } @finally {

        if (error == nil) {

            if ([session canAddInput:input]) {

                [session addInput:input];

                AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init];

                [stillImageOutput setOutputSettings:@{AVVideoCodecKey : AVVideoCodecJPEG}];

                if ([session canAddOutput:stillImageOutput]) {

                    [session setSessionPreset:AVCaptureSessionPresetHigh];
                    [session addOutput:stillImageOutput];

                    AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];

                    [previewLayer setVideoGravity:AVLayerVideoGravityResizeAspect];
                    [previewLayer.connection setVideoOrientation:AVCaptureVideoOrientationPortrait];

                    [backgroundStreamView.layer addSublayer:previewLayer];

                    [session startRunning];

                    NSLog(@"session running");

                } else {
                    NSLog(@"cannot add output");
                }

            } else {
                NSLog(@"cannot add inout");
            }

        } else {
            NSLog(@"general error: %@", error);
        }
    }

会话运行完美,但没有显示视频。我究竟做错了什么?

谢谢你的时间,Dan。

1 个答案:

答案 0 :(得分:0)

管理自己修复它,结果是一个相当简单的问题 - 我没有指定AVCapturePreviewLayer的帧大小,因此它没有出现(大概是因为它默认为帧大小为零)。

要解决此问题,我将框架设置为与自定义UIView的框架匹配:

[previewLayer setFrame:backgroundStreamView.bounds];

弃用代码修复

AVCaptureStillImageOutput也已弃用,因此为了解决这个问题,我将其替换为AVCapturePhotoOutput类。因此代码改为:

AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init];                
[stillImageOutput setOutputSettings:@{AVVideoCodecKey : AVVideoCodecJPEG}]

以下内容:

AVCapturePhotoOutput *stillImageOutput = [[AVCapturePhotoOutput alloc] init];