如何在AVPlayer录制完成后转场至新视图控制器并传递视频URL?
解决视频录制完成后传递URL到PreviewViewController的问题
我来帮你搞定这个视频URL传递的问题!你当前的代码里直接初始化PreviewViewController()存在一个关键问题——因为你是通过故事板创建的视图控制器,这种方式初始化的实例不会关联故事板上的界面布局,自然也没法正确完成页面跳转和视频展示。下面是完整的修正方案:
第一步:给PreviewViewController添加接收URL的属性
先在PreviewViewController里定义一个用于接收视频URL的属性,后续可以用这个属性加载并播放视频:
class PreviewViewController: UIViewController { // 用于接收来自CameraViewController的视频URL var videoURL: URL? override func viewDidLoad() { super.viewDidLoad() // 利用videoURL加载并播放视频(示例代码) guard let url = videoURL else { return } let player = AVPlayer(url: url) let playerLayer = AVPlayerLayer(player: player) playerLayer.frame = view.bounds view.layer.addSublayer(playerLayer) player.play() } }
第二步:修正CameraViewController的fileOutput方法
修改代理方法里获取PreviewViewController实例的方式,确保从故事板中获取实例并传递URL:
extension CameraViewController: AVCaptureFileOutputRecordingDelegate { func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) { // 先处理录制错误 if let error = error { print("视频录制失败:\(error.localizedDescription)") return } // 从故事板获取PreviewViewController实例(注意替换成你自己的Storyboard ID) guard let destinationVC = storyboard?.instantiateViewController(withIdentifier: "PreviewViewController") as? PreviewViewController else { print("无法从故事板获取PreviewViewController,请检查Storyboard ID是否正确") return } // 传递录制好的视频URL destinationVC.videoURL = outputFileURL // 根据你的页面结构选择跳转方式(push或present) if let navController = navigationController { navController.pushViewController(destinationVC, animated: true) } else { present(destinationVC, animated: true) } } }
关键注意事项
- 设置Storyboard ID:打开故事板,选中PreviewViewController,在右侧Identity Inspector面板里找到
Storyboard ID,填入你代码中使用的字符串(比如示例里的"PreviewViewController"),这是从故事板获取控制器实例的关键。 - 跳转方式选择:如果你的CameraViewController在导航控制器栈中,用
pushViewController;如果是独立的控制器,用present即可。
内容的提问来源于stack exchange,提问作者BigBoy1337
相关产品推荐
相关产品推荐

