在 iOS 的 UIView 中显示摄像头画面

Display camera feed in UIView in iOS

我有一个 iOS 应用程序,在视图控制器中放置了一个简单的 UIView。我正在尝试在 UIView 中显示前置摄像头的摄像头画面。我不是要拍照或录制视频,我只是想在 UIView.

中显示实时提要

我已经尝试实施 AVCaptureVideoPreviewLayer,但是我得到的提要是空白的。似乎什么都没有发生。这是我的代码:

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);
        }
    }

会话运行得很好,但是没有显示视频源。我做错了什么?

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

为了解决这个问题,我将框架设置为与我的自定义框架相匹配 UIView:

[previewLayer setFrame:backgroundStreamView.bounds];

弃用代码修复

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

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

以下内容:

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