Camera.app 使用什么 AVCaptureDevice?
What AVCaptureDevice does Camera.app use?
我的应用程序中有一个摄像头。它在大量文档之后得到了仔细的实施,但它仍然有一个主要的烦恼;视野明显小于库存相机应用程序。这是在大约相同距离处截取的两个屏幕截图,以供参考。我的应用程序在右边,显示了来自相机的整个预览流。
Apple 文档建议使用 AVCaptureDevice.default
或 AVCaptureDevice.DiscoverySession
,而我的应用程序使用前者;
AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
我尝试过许多不同的捕捉设备,其中 none 为我提供了与普通相机应用程序相同的宽预览。
我做错了什么?
首先,您需要扩展示例中的视图边界以进行同类比较。
然后您会注意到在左图中,拍摄模式设置为“照片”,而不是“视频”。如果您在 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
如果您想为备份设备选项提供更清洁的解决方案,以防广角不可用,则可以使用
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
相比有效(它有性能开销).
我的应用程序中有一个摄像头。它在大量文档之后得到了仔细的实施,但它仍然有一个主要的烦恼;视野明显小于库存相机应用程序。这是在大约相同距离处截取的两个屏幕截图,以供参考。我的应用程序在右边,显示了来自相机的整个预览流。
Apple 文档建议使用 AVCaptureDevice.default
或 AVCaptureDevice.DiscoverySession
,而我的应用程序使用前者;
AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
我尝试过许多不同的捕捉设备,其中 none 为我提供了与普通相机应用程序相同的宽预览。
我做错了什么?
首先,您需要扩展示例中的视图边界以进行同类比较。
然后您会注意到在左图中,拍摄模式设置为“照片”,而不是“视频”。如果您在 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
如果您想为备份设备选项提供更清洁的解决方案,以防广角不可用,则可以使用
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
相比有效(它有性能开销).