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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:50:23