前置摄像头的 AVCaptureSession canAddInput 在 iPad 上总是 returns false
AVCaptureSession canAddInput for front-camera always returns false on iPad
以下代码在 iPhone 上运行完美。在后置和前置摄像头之间来回切换。
但是,当 运行 它在 iPad 上时,canAddInput
-方法在选择前置摄像头时总是 returns 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");
}
很可能,它失败是因为您将 sessionPreset
设置为 1080p,而 iPad 的前置摄像头不是 1080p。
我遇到了同样的问题,只是将其设置为 .high
,根据 Apple 的定义指定适合 high-quality 视频和音频输出的捕获设置。它应该只选择任何相机支持的最高分辨率。
如果您不相信此描述,您还可以创建一组您喜欢的预设,并在切换相机之前检查它们是否适用于您希望使用的相机。
我从对基本相同问题的回答中提取了以下代码:
let videoPresets: [AVCaptureSession.Preset] = [.hd4K3840x2160, .hd1920x1080, .hd1280x720] //etc. Put them in order to "preferred" to "last preferred"
let preset = videoPresets.first(where: { device.supportsSessionPreset([=10=]) }) ?? .hd1280x720
captureSession.sessionPreset = preset
我运行跨过另一个选项,我想在这里分享。在这个问题中并非如此,但它可能会帮助某人。
我正在使用 AVCaptureMulticamSession
,但在 iPhone X 及更早版本上无法正常工作:我收到一个错误消息,指出会话无法添加设备输入。
原因是 AVCaptureMulticamSession
仅在新设备上受支持,从 iPhone XR、iPhone XS、iPhone XS Max 和 iPad Pro(第 3 代)。您可以使用 isMultiCamSupported.
检查当前设备是否支持它
以下代码在 iPhone 上运行完美。在后置和前置摄像头之间来回切换。
但是,当 运行 它在 iPad 上时,canAddInput
-方法在选择前置摄像头时总是 returns 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");
}
很可能,它失败是因为您将 sessionPreset
设置为 1080p,而 iPad 的前置摄像头不是 1080p。
我遇到了同样的问题,只是将其设置为 .high
,根据 Apple 的定义指定适合 high-quality 视频和音频输出的捕获设置。它应该只选择任何相机支持的最高分辨率。
如果您不相信此描述,您还可以创建一组您喜欢的预设,并在切换相机之前检查它们是否适用于您希望使用的相机。
我从对基本相同问题的回答中提取了以下代码:
let videoPresets: [AVCaptureSession.Preset] = [.hd4K3840x2160, .hd1920x1080, .hd1280x720] //etc. Put them in order to "preferred" to "last preferred"
let preset = videoPresets.first(where: { device.supportsSessionPreset([=10=]) }) ?? .hd1280x720
captureSession.sessionPreset = preset
我运行跨过另一个选项,我想在这里分享。在这个问题中并非如此,但它可能会帮助某人。
我正在使用 AVCaptureMulticamSession
,但在 iPhone X 及更早版本上无法正常工作:我收到一个错误消息,指出会话无法添加设备输入。
原因是 AVCaptureMulticamSession
仅在新设备上受支持,从 iPhone XR、iPhone XS、iPhone XS Max 和 iPad Pro(第 3 代)。您可以使用 isMultiCamSupported.