通过大疆PSDK,将第三方摄像头的视频流推到M300遥控器显示

1.首先确保跑通了大疆官方的demo,demo功能是可以将本地h264的视频文件推到遥控器显示。

2.将264格式设置为普通264(默认为大疆264),更改demo里的代码如下

   //returnCode = DjiPayloadCamera_SetVideoStreamType(DJI_CAMERA_VIDEO_STREAM_TYPE_H264_DJI_FORMAT);returnCode = DjiPayloadCamera_SetVideoStreamType(DJI_CAMERA_VIDEO_STREAM_TYPE_H264_CUSTOM_FORMAT);if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {USER_LOG_ERROR("DJI camera set video stream error.");return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;}//s_cameraVideoStreamType = DJI_CAMERA_VIDEO_STREAM_TYPE_H264_DJI_FORMAT;s_cameraVideoStreamType = DJI_CAMERA_VIDEO_STREAM_TYPE_H264_CUSTOM_FORMAT;

3.通过ffmpeg将获取的摄像头数据进行264编码,然后通过DjiPayloadCamera_SendVideoStream函数将编码完的一帧数据发送出去,主要实现如下,以供参考。

void Ffmpeg_Encoder_Init(){av_register_all();avcodec_register_all();m_pRGBFrame = new AVFrame[1];//RGB帧数据赋值m_pYUVFrame = new AVFrame[1];//YUV帧数据赋值c = NULL;//解码器指针对象赋初值}void Ffmpeg_Encoder_Setpara(AVCodecID mycodeid, int vwidth, int vheight){pCodecH264 = avcodec_find_encoder(mycodeid);//查找h264编码器if (!pCodecH264){fprintf(stderr, "h264 codec not found\n");exit(1);}width = vwidth;height = vheight;c = avcodec_alloc_context3(pCodecH264);//函数用于分配一个AVCodecContext并设置默认值,如果失败返回NULL,并可用av_free()进行释放c = avcodec_alloc_context3(pCodecH264);//函数用于分配一个AVCodecContext并设置默认值,如果失败返回NULL,并可用av_free()进行释放c->bit_rate = 400000; //设置采样参数,即比特率c->width = vwidth;//设置编码视频宽度c->height = vheight; //设置编码视频高度c->time_base.den = 25;//设置帧率,num为分子和den为分母,如果是1/25则表示25帧/sc->time_base.num = 1;c->gop_size = 25; //设置GOP大小,该值表示每25帧会插入一个I帧c->pix_fmt = AV_PIX_FMT_YUV420P;//设置像素格式c->profile = FF_PROFILE_H264_BASELINE;//仅支持I帧P帧av_opt_set(c->priv_data, "tune", "zerolatency", 0);//设置编码器的延时,解决前面的几十帧不出数据的情况if (avcodec_open2(c, pCodecH264, NULL) < 0)return;//打开编码器nDataLen = vwidth*vheight * 3;//计算图像rgb数据区长度yuv_buff = new uint8_t[nDataLen / 2];//初始化数据区,为yuv图像帧准备填充缓存rgb_buff = new uint8_t[nDataLen];//初始化数据区,为rgb图像帧准备填充缓存outbuf_size = 100000;//初始化编码输出数据区outbuf = new uint8_t[outbuf_size];scxt = sws_getContext(c->width, c->height, AV_PIX_FMT_BGR24, c->width, c->height, AV_PIX_FMT_YUV420P, SWS_POINT, NULL, NULL, NULL);//初始化格式转换函数}void Ffmpeg_Encoder_Encode(FILE *file, uint8_t *data){av_init_packet(&pkt);memcpy(rgb_buff, data, nDataLen);//拷贝图像数据到rgb图像帧缓存中准备处理avpicture_fill((AVPicture*)m_pRGBFrame, (uint8_t*)rgb_buff, AV_PIX_FMT_RGB24, width, height);//将rgb_buff填充到m_pRGBFrame//av_image_fill_arrays((AVPicture*)m_pRGBFrame, (uint8_t*)rgb_buff, AV_PIX_FMT_RGB24, width, height);avpicture_fill((AVPicture*)m_pYUVFrame, (uint8_t*)yuv_buff, AV_PIX_FMT_YUV420P, width, height);//将yuv_buff填充到m_pYUVFramesws_scale(scxt, m_pRGBFrame->data, m_pRGBFrame->linesize, 0, c->height, m_pYUVFrame->data, m_pYUVFrame->linesize);// 将RGB转化为YUVint myoutputlen = 0;int returnvalue = avcodec_encode_video2(c, &pkt, m_pYUVFrame, &myoutputlen);if (returnvalue == 0){unsigned long dataLength = pkt.size;int lengthOfDataHaveBeenSent = 0;while (dataLength - lengthOfDataHaveBeenSent) { //如果发送完成一帧uint16_t lengthOfDataToBeSent = USER_UTIL_MIN(60000,dataLength - lengthOfDataHaveBeenSent);DjiPayloadCamera_SendVideoStream((const uint8_t *) pkt.data + lengthOfDataHaveBeenSent,lengthOfDataToBeSent); //发送一帧lengthOfDataHaveBeenSent += lengthOfDataToBeSent; //发送的大小}}av_free_packet(&pkt);}void Ffmpeg_Encoder_Close(){delete[]m_pRGBFrame;delete[]m_pYUVFrame;delete[]rgb_buff;delete[]yuv_buff;delete[]outbuf;sws_freeContext(scxt);avcodec_close(c);//关闭编码器av_free(c);}int main(){//开启大疆服务main1();cv::VideoCapture capture(10);if (!capture.isOpened()) {printf("Failed to open camera");}cv::Mat imageTemp;capture >> imageTemp;Ffmpeg_Encoder_Init();//初始化编码器Ffmpeg_Encoder_Setpara(AV_CODEC_ID_H264, imageTemp.cols, imageTemp.rows);//设置编码器参数//图象编码FILE *f = NULL;char * filename = "myData.h264";fopen_s(&f, filename, "wb");//打开文件存储编码完成数据while(1){capture >> imageTemp;Ffmpeg_Encoder_Encode(f, (uchar*)imageTemp.data);//编码//imshow("send", imageTemp);cv::waitKey(30);}return 0;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/661777.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《云原生安全攻防》-- 云原生安全概述

从本节课程开始&#xff0c;我们将正式踏上云原生安全的学习之旅。在深入探讨云原生安全的相关概念之前&#xff0c;让我们先对云原生有一个全面的认识。 什么是云原生呢? 云原生&#xff08;Cloud Native&#xff09;是一个组合词&#xff0c;我们把它拆分为云和原生两个词来…

Arduino 推出基于乐鑫 ESP32-S3 的 STEM 教育机器人

Arduino Alvik 是 Arduino Education 推出的一款新型机器人&#xff0c;可作为一种跨学科工具&#xff0c;为当前教育和未来机器人世界筑起连接的桥梁。Hackster 的 Gareth Halfacree 表示&#xff1a;“Alvik 的设计灵感来自 Arduino 简化复杂技术的理念&#xff0c;同时它也 …

【Spring Boot 3】事件机制

【Spring Boot 3】事件机制 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或少的…

css实现按钮边框旋转

先上效果图 本质&#xff1a;一个矩形在两个矩形互相重叠遮盖形成的缝隙中旋转形成&#xff0c;注意css属性z-index层级关系 直接上代码 <div class"bg"><div class"button">按钮</div></div><style>.bg {width: 100%;heigh…

C++从零开始的打怪升级之路(day27)

这是关于一个普通双非本科大一学生的C的学习记录贴 在此前&#xff0c;我学了一点点C语言还有简单的数据结构&#xff0c;如果有小伙伴想和我一起学习的&#xff0c;可以私信我交流分享学习资料 那么开启正题 今天分享的是关于vector&#xff0c;这篇博客内容紧跟上一篇 1.…

80.如何评估一台服务器能承受的最大TCP连接数

文章目录 一、一个服务端进程最多能支持多少条 TCP 连接&#xff1f;二、一台服务器最大最多能支持多少条 TCP 连接&#xff1f;三、总结 一个服务端进程最大能支持多少条 TCP 连接&#xff1f; 一台服务器最大能支持多少条 TCP 连接&#xff1f; 很多朋友可能第一反应就是端…

【pytorch】anaconda使用及安装pytorch

https://zhuanlan.zhihu.com/p/348120084 https://blog.csdn.net/weixin_44110563/article/details/123324304 介绍 Conda创建环境相当于创建一个虚拟的空间将这些包都装在这个位置&#xff0c;不需要了可以直接打包放入垃圾箱&#xff0c;同时也可以针对不同程序的运行环境选…

有趣的css - 动态的毛玻璃背景

页面效果 此效果主要使用 backdrop-filter 属性&#xff0c;以及配合 animation 属性来实现毛玻璃模糊和一些动效。 此效果可适用于登录窗口&#xff0c;网站背景或者一些卡片列表中&#xff0c;使网页更具科技感和空间感。 核心代码部分&#xff0c;简要说明了写法思路&#x…

【Docker】使用VS创建、运行、打包、部署.net core 6.0 webapi

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

应用智能家居领域中的低功耗蓝牙模块

智能家居&#xff08;smart home, home automation&#xff09;是以住宅为平台&#xff0c;利用综合布线技术、网络通信技术、 安全防范技术、自动控制技术、音视频技术将家居生活有关的设施集成&#xff0c;构建高效的住宅设施与家庭日程事务的管理系统&#xff0c;提升家居安…

MySQL for update锁表还是锁行校验

select * from user where id 1 for update ; 1. for update作用 在MySQL中&#xff0c;使用for update子句可以对查询结果集进行行级锁定&#xff0c;以便在事务中对这些行进行更新或者防止其他事务对这些行进行修改。 当使用for update时&#xff0c;锁定行的方式取决于wh…

AI 智能体:探索自主智能的世界

AI 智能体&#xff1a;探索自主智能的世界 认真的飞速小软 飞速创软 2024-01-30 11:06 发表于新加坡 想象一下&#xff0c;在这样一个世界里&#xff0c;软件自身可以自主地与环境交互&#xff0c;根据收集的数据做出决策&#xff0c;并以最少的人工干预来执行任务。这些AI智能…

WPF 中 Loaded 和 Closing 窗口事件

在 WPF 中&#xff0c;Loaded 和 Closing 是两个常用的窗口事件。下面是对这两个事件的详细解释和示例说明&#xff1a; Loaded 事件&#xff1a; Loaded 事件在窗口&#xff08;或其他可视元素&#xff09;加载完成并准备好进行显示时触发。在 Loaded 事件中&#xff0c;您可…

2024美赛C题全网最早思路 网球运动(持续更新)

2024美赛已经于今天早上6点准时公布题目。本次美赛将全程跟大家一起战斗冲刺O奖&#xff01;思路持续更新。 2024 MCM Problem C: Momentum in Tennis &#xff08;网球运动的势头&#xff09; 注&#xff1a;在网球运动中&#xff0c;"势头"通常指的是比赛中因一系…

npm和yarn区别

都是包管理工具&#xff0c;但是yarn的出现是为了弥补npmV4&#xff08;npmV5结合yarn和自身的一些问题做了很大的升级&#xff0c;性能和速度都提高了&#xff09;及之前版本的一些问题 npmV4的缺点 npm install的时候巨慢。特别是新的项目拉下来要等半天&#xff0c;删除nod…

数据分析基础之《pandas(3)—DataFrame运算》

一、算术运算 1、add() 加法运算 2、sub() 减法运算 3、想要得到每天的涨跌幅大小&#xff0c;求出每天close-open价格差 # 算术运算 close data[close] open1 data[open] # 收盘价减去开盘价 data[m_price_change] close.sub(open1) data.head() 二、逻辑运算 1、逻辑…

2024 美国大学生数学建模竞赛 美赛(C题)网球比赛趋势问题 国际大学生数学建模竞赛| 建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍希望大家都能轻松建模呀&#xff0c;华数杯也会持续给大家放送思路滴~ 抓紧小秘籍&#xff0c;我们出发吧~ 完整内容可以在文章末尾领取&#xff01; 问题1 • 开发一个模型&#xff0c;捕捉到比赛进行时点的流动&#xff0c;…

在linux上,内存不够,设置虚拟内存

在 Linux 上&#xff0c;虚拟内存是指系统将硬盘空间作为内存使用的技术。当系统内存不足时&#xff0c;可以将不常用的内存数据保存到硬盘的交换分区&#xff08;swap partition&#xff09;上&#xff0c;这样释放出来的内存空间就可以被其他应用程序使用&#xff0c;从而避免…

倒计时67天

复习。 一.倒计时79天-CSDN博客 1. #include<bits/stdc.h> using namespace std; #define int long long const int N3e45; const int inf0x3f3f3f3f; int month[13]{0,31,28,31,30,31,30,31,31,30,31,30,31}; void solve() {int a[110]{},cn0;for(int i0;i<100;i)…

LeetCode --169

169. 多数元素 简单 相关标签 相关企业 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff…