【大疆无人机】MSDK实现落地回传功能

【大疆】MSDK实现电子围栏,自定义飞行区,上云api使用官方提供的接口即可
开发平台:大疆MSDK
开发工具:okHttp等
开发语言:Kotlin

0. 整体思路

无人机飞行时需要占用宽带(直播以及飞控等),所以对于媒体文件(拍照、录像)我们采用落地回传的形式来实现。首先,获取无人机状态,当无人机落地时调用落地回传方法,在方法内我们先将媒体文件从无人机中下载到遥控器(RC)中,然后再将RC中的文件以此传输到服务器中。

1. 获取无人机状态

可以通过以下代码获取无人机的飞行状态,如果飞行状态由true 到 false 则说明无人机降落。

val flyStatus : Boolean = KeyTools.createKey(FlightControllerKey.KeyIsFlying).get() == true

2. 回传媒体文件

大致逻辑如下,由于大疆msdk无法获取文件的文件夹信息,所以我们可以采取文件索引来获取当此飞行所产生的飞行媒体文件。
注意:大疆拍摄的高清视频源文件较大,可以采用自带的压缩进行拍摄以及降低画面质量等。亦可采用分段上传优化。

private fun passBackMedia(startIndex: Int, endIndex: Int) {
    "文件回传开始".eLog()
    OsdSender.instance.setPassBackStatus(1)
    MediaDataCenter.getInstance().mediaManager.pullMediaFileListFromCamera(
        PullMediaFileListParam.Builder().mediaFileIndex(endIndex).count(50).build(),
        object : CommonCallbacks.CompletionCallback {
            override fun onSuccess() {
                // 获取当前任务回传
                val mediaFileList = mediaVM.getMediaFileList().filter { mediaFile -> mediaFile.fileIndex > startIndex }
                for (mediaFile in mediaFileList) {
                    mediaFile.fileName.iLog()
                }
                "任务 $taskExecuteId 回传文件数量 : ${mediaFileList.size}".eLog()
                if (mediaFileList.isNotEmpty()) {
                    val downloadFileList = ArrayList<File>()
                    val downloadMediaFileList = ArrayList<MediaFile>()
                    "文件开始下载".iLog()
                    val deferredList = mediaFileList.map { mediaFile ->
                        CompletableDeferred<Unit>().also { deferred ->
                            timerScope.launch(Dispatchers.IO) {
                                try {
                                    downloadFile(mediaFile, downloadFileList, downloadMediaFileList, deferred)
                                } catch (e: Exception) {
                                    deferred.completeExceptionally(e)
                                }
                            }
                        }
                    }
                    timerScope.launch {
                        deferredList.forEach { it.await() } // 等待所有下载完成
                        OsdSender.instance.setPassBackStatus(0)
                        "文件下载完成,成功数量 ${downloadFileList.size}".iLog()
                        val uploadUrl = ""
                        for ((index, value) in downloadFileList.withIndex()) {
                            uploadFile(uploadUrl, value, mediaFileList[index])
                        }
                    }
                }
            }
            override fun onFailure(error: IDJIError) {
                "文件回传失败 $error".eLog()
            }
        })
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值