iOS视频录制后在didFinishRecordingTo中创建AVPlayerLayer为nil问题
问题原因
核心错误出在previewLayer? = AVPlayerLayer(player: player)这行赋值语句的写法上。
你声明的previewLayer是可选类型,初始默认值为nil,而你用了可选链的赋值语法?=,这种语法的规则是只有当可选变量本身不为nil时,才会执行赋值操作,否则会直接跳过赋值步骤。所以你的AVPlayerLayer实例根本没有被成功赋值给previewLayer变量,变量一直保持初始的nil状态,自然会走guard的失败分支。
修复方案
把赋值语句里的可选链符号?去掉,直接给可选变量赋值即可:
private var previewLayer : AVPlayerLayer? let player = AVPlayer(url: outputFileURL) // 去掉赋值前的? previewLayer = AVPlayerLayer(player: player) previewLayer?.videoGravity = .resizeAspectFill previewLayer?.frame = cameraView.bounds print(previewLayer) guard let previewLayer = previewLayer else { print("preview Layer nil") return } cameraView.layer.addSublayer(previewLayer) previewLayer.player?.play() recordButton.isHidden = true
额外优化建议
- 每次播放新视频前可以先把旧的previewLayer从父层移除,避免图层叠加
- 建议校验outputFileURL的有效性,确认文件确实存在,避免AVPlayer初始化空实例
// 增加文件存在校验 guard FileManager.default.fileExists(atPath: outputFileURL.path) else { print("录制文件不存在") return } let player = AVPlayer(url: outputFileURL)
内容的提问来源于stack exchange,提问作者Artun
相关产品推荐
相关产品推荐

