ios - Camera.app 使用什么 AVCaptureDevice?
问题描述
我的应用程序中有一个摄像头。它在大量文档之后被仔细实施,但它仍然有一个主要的烦恼;视野明显小于股票相机应用程序。这是在大约相同距离处拍摄的两个屏幕截图,以供参考。我的应用程序在右侧,显示来自相机的整个预览流。
Apple 文档建议使用AVCaptureDevice.default
or AVCaptureDevice.DiscoverySession
,而我的应用程序使用前者;
AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
我尝试了许多不同的捕捉设备,但它们都没有给我提供与相机应用程序相同的广泛预览。
我究竟做错了什么?
解决方案
首先,您需要扩展示例中的视图边界以进行比较。
然后您会注意到,在您的左图中,拍摄模式设置为“PHOTO”,而不是“VIDEO”。如果您在 Camera.app 中将选项卡切换到“视频”模式,您会看到两个会话的缩放是相同的。
要启用此功能,请稍作更改:
let session = AVCaptureSession()
session.beginConfiguration()
session.sessionPreset = AVCaptureSession.Preset.photo
通常,我会告诫不要使用照片预设,但是您正在拍摄照片..所以降低视频稳定性是可以容忍的。还需要考虑视频质量,因为.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()
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
}
如果您正在使用AVCaptureVideoPreviewLayer
,最好使用视图的输入设备尺寸以避免调整大小,previewLayer.videoGravity = .resizeAspect
即使与它相比previewLayer.videoGravity = .resize
(它具有性能开销)。
推荐阅读
- javascript - TypeError:超级表达式必须为 null 或 React Native 中的函数
- excel - Excel VBA - 如何从特定列的每一行中的字符串中提取数字
- python - PermissionError(13, 'The device does not identify the command.', None, 22) when read from multiple arduino board via pySerial
- excel - Excel - 在另一列的条件之间返回值
- ftp - 是否可以使用 SMB 访问来自 Azure 文件共享的文件的用户定义元数据?
- arrays - 玩笑匹配器 toMatchObject 与 Array 一起使用,但由于 Array 的子类而失败
- python - 如何在pyqtgraph中获取当前相机参数?
- python - python包没有安装在使用ubuntu的虚拟环境中
- r - R smartbind 警告“将非原子类型列 X 转换为类型字符。”
- python - 在 FPDF Python 中使用表格和多单元格创建 PDF 时出现问题