前置摄像头的 AVCaptureSession canAddInput 在 iPad 上总是返回 false

Posted

技术标签:

【中文标题】前置摄像头的 AVCaptureSession canAddInput 在 iPad 上总是返回 false【英文标题】:AVCaptureSession canAddInput for front-camera always returns false on iPad 【发布时间】:2020-09-17 14:25:58 【问题描述】:

以下代码在 iPhone 上运行良好。在后置摄像头和前置摄像头之间来回切换。 但是,当在 iPad 上运行它时,canAddInput-方法在选择前置摄像头时总是返回 NO(后置摄像头工作正常)。任何想法为什么?

- (void)addVideoInput:(BOOL)isFront

    AVCaptureDevice *videoDevice;

    //NSLog(@"Adding Video input - front: %i", isFront);

    [self.captureSession removeInput:self.currentInput];

    if(isFront == YES)
        self.isFrontCam = YES;
        videoDevice = [self frontFacingCameraIfAvailable];
    else
        self.isFrontCam = NO;
        videoDevice = [self backCamera];
    



    if (videoDevice) 

        NSError *error;
        AVCaptureDeviceInput *videoIn = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];
        if (!error) 

          // Everything's fine up to here.
          // the next line always resolves to NO and thus the
          // Video input isn't added.



            if ([[self captureSession] canAddInput:videoIn])
                [[self captureSession] addInput:videoIn];
                self.currentInput = videoIn;

                // Set the preset for the video input

                if([self.captureSession canSetSessionPreset:AVCaptureSessionPreset1920x1080])
                    [self.captureSession setSessionPreset:AVCaptureSessionPreset1920x1080];
                
            
            else 
                NSLog(@"Couldn't add video input");
                NSLog(@"error: %@", error.localizedDescription);
            
        
        else
            NSLog(@"Couldn't create video input");
            NSLog(@"error: %@", error.localizedDescription);
        
    else
        NSLog(@"Couldn't create video capture device");


【问题讨论】:

【参考方案1】:

很可能,它失败了,因为您将sessionPreset 设置为 1080p 而 iPad 的前置摄像头不是 1080p。

我遇到了同样的问题,只是将其设置为 .high,这是 Apple 定义的指定适合高质量视频和音频输出的捕获设置。它应该只为任何相机选择支持的最高分辨率。

如果您不相信此描述,您还可以创建一组您喜欢的预设,并在切换相机之前检查它们是否可用于您希望使用的相机。

我从一个基本相同的问题的答案中提取了以下代码:

let videoPresets: [AVCaptureSession.Preset] = [.hd4K3840x2160, .hd1920x1080, .hd1280x720] //etc. Put them in order to "preferred" to "last preferred"
let preset = videoPresets.first(where:  device.supportsSessionPreset($0) ) ?? .hd1280x720
captureSession.sessionPreset = preset

https://***.com/a/53214766/3338129

【讨论】:

谢谢哥们,帮帮我!我是 AV 新手,不知道这个。【参考方案2】:

我遇到了另一个选项,我想在这里分享。这个问题并非如此,但它可能对某人有所帮助。

我使用的是AVCaptureMulticamSession,但它无法在 iPhone X 和更早版本上运行:我收到一个错误,即会话无法添加设备输入。

原因是 AVCaptureMulticamSession 仅在新设备​​上受支持,从 iPhone XR、iPhone XS、iPhone XS Max 和 iPad Pro(第 3 代)开始。可以通过isMultiCamSupported查看当前设备是否支持。

【讨论】:

以上是关于前置摄像头的 AVCaptureSession canAddInput 在 iPad 上总是返回 false的主要内容,如果未能解决你的问题,请参考以下文章

将前置摄像头更改为后置摄像头

AVCaptureSession 获得与 iPhone 内置摄像头相同的设置

在使用 AVCaptureMovieFileOutput 保存之前修改 AVCaptureSession

在使用 AVCaptureSession 捕获图像之前获取输出图像分辨率

如何正确释放 AVCaptureSession

使用 AVCaptureSession 和 AVAssetWriter 在翻转相机时无缝录制音频