Camera.app 使用什么 AVCaptureDevice?

Osc*_*and 7 avfoundation ios swift

我的应用程序中有一个相机。它已经按照大量文档进行了仔细的实现,但它仍然有一个主要的烦恼;视野明显小于普通相机应用程序。这是在大约相同距离处拍摄的两张屏幕截图,以供参考。我的应用程序位于右侧,显示来自相机的整个预览流。

在此输入图像描述

Apple 文档建议使用AVCaptureDevice.defaultAVCaptureDevice.DiscoverySession,我的应用程序使用前者;

AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
Run Code Online (Sandbox Code Playgroud)

我已经尝试了许多不同的捕获设备,但没有一个能够为我提供与库存相机应用程序相同的宽预览。

我究竟做错了什么?

Pra*_*tti 8

首先,您需要扩展示例中的视图范围以进行同类比较。

然后您会注意到,在左图中,拍摄模式设置为“照片”,而不是“视频”。如果您在 Camera.app 中将选项卡切换到“视频”模式,您将看到两个会话的缩放是相同的。

要启用此功能,只需进行一个小更改:

let session = AVCaptureSession()
session.beginConfiguration()
session.sessionPreset = AVCaptureSession.Preset.photo
Run Code Online (Sandbox Code Playgroud)

通常,我会警告不要使用照片预设,但是您要拍摄照片......因此降低视频稳定性是可以容忍的。还需要考虑视频质量,因为.hd1920x1080会话预设会生成更高分辨率的视频,并且还针对视频进行了优化。

let session = AVCaptureSession()
session.beginConfiguration()
session.sessionPreset = AVCaptureSession.Preset.photo

// Add a video input
guard session.canAddInput(deviceInput) else {
  print("Couldn't add device input")
  return
}
session.addInput(deviceInput) 

session.startRunning()
Run Code Online (Sandbox Code Playgroud)

DiscoverySession如果您希望在广角不可用的情况下为备份设备选项提供更清晰的解决方案,则可以使用此方法来替代此方法。但默认情况下,获取设备输入如下:

guard let videoDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) else {
  print("Couldn't find wide angle camera")
  return
}

guard let deviceInput = try? AVCaptureDeviceInput(device: videoDevice) else {
  print("Could not create video device input.")
  return
}
Run Code Online (Sandbox Code Playgroud)

如果您正在使用,AVCaptureVideoPreviewLayer最好使用视图的输入设备尺寸,以避免调整大小,即使它与(它有性能开销)previewLayer.videoGravity = .resizeAspect相比也有效。previewLayer.videoGravity = .resize