iOS端DJI SDK集成相机视图并获取录制视频输出文件名咨询
iOS对接DJI SDK:相机视图集成与视频录制文件信息获取方案
Hey there! 针对你在iOS上对接DJI SDK时,想要集成DJI相机视图到自有应用,同时实现类似AVCaptureFileOutput的captureOutput方法那样获取录制完成的视频文件URL和文件名的需求,我来给你详细梳理下可行的实现方案:
一、先搞定DJI相机视图集成
DJI SDK提供了专门的DJICameraPreviewView来展示相机实时画面,集成步骤很简单:
- 在你的ViewController的xib/storyboard中添加一个UIView,将其类设置为
DJICameraPreviewView - 代码中获取相机实例并关联预览视图:
import DJISDK class CameraViewController: UIViewController { @IBOutlet weak var previewView: DJICameraPreviewView! override func viewDidLoad() { super.viewDidLoad() // 获取当前飞行器的相机 guard let camera = DJISDKManager.product()?.camera else { print("无法获取相机实例") return } // 将预览视图与相机绑定 camera.setPreviewView(previewView) // 启动预览 camera.startPreview(completion: { error in if let error = error { print("预览启动失败:\(error.localizedDescription)") } else { print("预览启动成功") } }) } }
二、实现视频录制完成的回调(对应你要的captureOutput逻辑)
DJI SDK并没有直接提供和AVFoundation完全一致的captureOutput方法,但提供了功能等价的代理回调,通过DJICameraDelegate的camera:didFinishRecordingVideo:withError:方法,你可以获取到录制完成的视频文件信息:
1. 设置相机代理
在上面的ViewController中,记得设置相机的代理:
override func viewDidLoad() { super.viewDidLoad() guard let camera = DJISDKManager.product()?.camera else { return } camera.delegate = self // ... 其他预览初始化代码 }
2. 实现代理回调方法
这个方法就是你要找的“替代版captureOutput”,里面的DJIVideoFile对象包含了文件的URL和文件名:
extension CameraViewController: DJICameraDelegate { func camera(_ camera: DJICamera, didFinishRecordingVideo videoFile: DJIVideoFile, withError error: Error?) { if let error = error { print("视频录制失败:\(error.localizedDescription)") return } // 获取视频文件的URL(对应AVFoundation中的outputFileURL) let outputFileURL = videoFile.fileURL // 获取视频文件名 let fileName = videoFile.fileName print("视频录制完成,文件URL:\(outputFileURL)") print("文件名:\(fileName)") // 这里可以添加你的后续逻辑,比如保存到自定义位置、上传服务器等 } }
3. 触发视频录制的代码
如果你需要手动控制录制开始/结束,可以调用相机的startRecordVideo和stopRecordVideo方法:
// 开始录制 @IBAction func startRecording(_ sender: UIButton) { guard let camera = DJISDKManager.product()?.camera else { return } camera.startRecordVideo(completion: { error in if let error = error { print("开始录制失败:\(error.localizedDescription)") } else { print("开始录制成功") } }) } // 结束录制 @IBAction func stopRecording(_ sender: UIButton) { guard let camera = DJISDKManager.product()?.camera else { return } camera.stopRecordVideo(completion: { error in if let error = error { print("结束录制失败:\(error.localizedDescription)") } else { print("结束录制成功,等待回调获取文件信息") } }) }
三、额外注意事项
- 确保你的应用已经获取了相机权限和相册权限(如果需要保存到系统相册)
- 调用相机相关方法前,要确保DJI SDK已经完成初始化,并且飞行器处于连接状态
DJIVideoFile的fileURL指向的是DJI SDK临时保存的文件位置,如果你需要长期保存,建议将文件复制到你应用的沙盒目录下
内容的提问来源于stack exchange,提问作者Alessio Stramacci
相关产品推荐
相关产品推荐

