为何使用AVCaptureDevice获取双摄像头设备崩溃,改用默认方法正常?
为什么指定双摄像头的代码会崩溃,而默认视频设备的代码正常?
这问题我做相机功能时也踩过坑,核心原因很简单:你指定的.builtInDualCamera设备在当前测试的设备上不存在,导致guard语句触发了fatalError(),直接让程序崩溃了。
两个API的核心区别
AVCaptureDevice.default(.builtInDualCamera, for: .video, position: .back)
这个方法是精准指定要获取后置双摄像头设备,只有当你的设备确实配备了后置双摄(比如iPhone 7 Plus、iPhone X及后续部分机型)时,才会返回有效的设备实例。如果当前设备是单摄机型(比如iPhone 7、SE系列等),这个方法会返回nil,触发你写的fatalError(),程序直接崩溃。AVCaptureDevice.default(for: AVMediaType.video)
这个方法的兼容性强很多,它会自动返回当前设备上最适合拍摄视频的默认摄像头——不管是单摄、双摄还是三摄,只要设备有可用的视频采集设备,就会返回对应的实例,自然不会返回nil(除非设备完全没有摄像头,这种情况极少)。
优化建议
如果你的应用需要特定类型的摄像头(比如双摄、超广角),不要直接用fatalError()做兜底,应该做降级处理,保证在不同设备上都能正常运行:
- 可以用
AVCaptureDevice.DiscoverySession枚举所有符合条件的设备,优先选你需要的类型,找不到就降级到通用类型:
// 先找双摄,找不到就找广角单摄 let discoverySession = AVCaptureDevice.DiscoverySession( deviceTypes: [.builtInDualCamera, .builtInWideAngleCamera], mediaType: .video, position: .back ) guard let captureDevice = discoverySession.devices.first else { // 这里可以给用户提示“无法找到可用摄像头”,而不是直接崩溃 print("No available camera found") return } // 继续后续的摄像头配置逻辑
这样既满足了特定设备的功能需求,也能兼容更多机型,避免不必要的崩溃。
内容的提问来源于stack exchange,提问作者Apple Dog
相关产品推荐
相关产品推荐

