这个问题通常是因为 AVCaptureDeviceInput 相关代码过早执行,导致 AVCaptureSession 还没有开始运行,这会导致 AVCaptureVideoPreviewLayer 显示空白。
要解决这个问题,你可以在 AVCaptureSession 开始运行后再设置 AVCaptureDeviceInput。例如:
let session = AVCaptureSession()
// ...
session.startRunning()
let device = AVCaptureDevice.default(for: .video)
do { let input = try AVCaptureDeviceInput(device: device!) session.addInput(input)
let previewLayer = AVCaptureVideoPreviewLayer(session: session)
view.layer.addSublayer(previewLayer)
previewLayer.frame = view.layer.bounds
} catch { print(error) }
这样,AVCaptureDeviceInput 就会等到会话运行后再启动,并且可以正常连接到 AVCaptureVideoPreviewLayer。