如何禁用ARSCNView实时摄像头流并为ARSession传入自定义视频实现录制重放
实现方案
是的,你可以禁用ARSCNView的默认实时摄像头流,同时传入自定义视频作为ARSession的输入,以下分两种场景提供实现方法:
场景1:实现官方提供的ARSession录制重放功能
如果你是要重放之前通过ARSession录制的内容,直接使用系统自带的ARReplayConfiguration即可,无需手动处理帧数据,该配置默认不会调用设备摄像头:
录制ARSession数据
// 指定录制文件输出路径 let outputURL = FileManager.default.temporaryDirectory.appendingPathComponent("ar_recording.mov") // 启动录制 session.startRecording(to: outputURL, outputFileType: .mov) { error in guard error == nil else { // 处理录制启动错误 return } } // 结束录制 session.stopRecording { savedURL, error in guard let savedURL = savedURL, error == nil else { // 处理录制结束错误 return } // 此处可持久化存储录制好的文件 }
重放已录制的ARSession内容
do { // 传入录制好的文件路径创建重放配置 let replayConfig = try ARReplayConfiguration(contentsOf: recordedFileURL) // 配置是否循环重放 replayConfig.isLoopingEnabled = true // 运行session,此时不会启用系统摄像头,自动使用录制文件的帧和跟踪数据 session.run(replayConfig) } catch { // 处理重放配置创建错误 }
场景2:传入任意自定义视频作为ARSession输入
如果你的自定义视频不是通过ARSession录制生成的,需要手动提供每帧对应的相机参数,步骤如下:
- 使用
ARCustomTrackingConfiguration作为ARSession的运行配置,该配置不会自动启用设备摄像头 - 用
AVAssetReader读取自定义视频的每一帧像素数据 - 为每帧像素数据构建对应的
ARCamera对象,需要填入匹配的相机内参矩阵、外参矩阵、分辨率、曝光时间等参数 - 调用
session.update(_:)方法将自定义构造的ARFrame传入会话,ARSCNView会自动使用传入的帧进行渲染
注意:该场景需要你提前获取自定义视频每一帧对应的相机参数,否则AR tracking无法正常工作,建议优先使用官方的录制重放方案。
内容的提问来源于stack exchange,提问作者Saurabh Singh Rathore
相关产品推荐
相关产品推荐

