You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 03:42:02