QGC二次开发 # 视频流代码分析

该博客主要分析QGroundControl(QGC)的视频流处理,包括GUI代码解析和业务代码分析。在GUI部分,重点介绍了MainRootWindow.qml中的配置及开启视频设置后的FlightDisplayViewUVC和FlightDisplayViewVideo组件,其中后者处理gstreamer流。视频业务代码集中在VideoSettings、VideoManager.cc,使用gstreamer进行视频接收,并提供了gstreamer基础教程链接。在视频显示窗口的实现上,提到了FlyViewVideo.qml。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

视频GUI代码分析

Gui代码的根:MainRootWindow.qml
配置文件的代码:

GeneralSetting.qml
	_videoSettings.videoSource
		settingmanager -> _videosettings
			videosetting.h -> DEFINE_SETTINGFACT(videoSource)

视频GUI代码

FlyView.qml			- 		MainRootWindow除了header(上面的toolbar部分)的部分是flyview

开启视频设置之后有一个小的窗口FlyViewVideo.qml
根据gstreamer状态分为FlightDisplayViewUVC,FlightDisplayViewVideo,前者是UVC摄像头,本地的设备,这一部分不走gstreamer处理,里面有qml的camera组建和videooutput组件

FlightDisplayViewVideo.qml是gsteamer处理的流的关键

	!gstreamer
		FlightDisplayViewUVC.qml
			camera.start()
		FlightDisplayViewDummy.qml
	gstreamer:
		FlightDisplayViewVideo.qml
		在这个qml中,有一个QGCVideoBackground组件,

QGCVideoBackground {
                id:             videoContent	
                objectName:     "videoContent"   // 标记

                Connections {
                    target: QGroundControl.videoManager
                    onImageFileChanged: {
                        videoContent.grabToImage(function(result) {
                            if (!result.saveToFile(QGroundControl.videoManager.imageFile)) {
                                console.error('Error capturing video frame');
                            }
                        });
                    }
                }
app->_initForNormalAppBoot()  // 在main.cc中,在app.exec()前面执行,用来做初始化
	// QGCApplication.cc
		bool QGCApplication::_initForNormalAppBoot()
			if (rootWindow) 
				rootWindow->scheduleRenderJob (new FinishVideoInitialization (toolbox()->videoManager()),QQuickWindow::BeforeSynchronizingStage);	
					scheduleRenderJob的用法,执行的代码是class里的run()函数部分的代码
		class FinishVideoInitialization : public QRunnable
			run(){
   
   	_manager->_initVideo(); }
				void VideoManager::_initVideo();	// 显示视频

_initVideo拿到了FlightDisplayViewVideo中的videoContent组件

void VideoManager::_initVideo()
	QQuickItem* widget = root->findChild<QQuickItem*>("videoContent");
		QGCVideoBackground.qml

视频业务代码分析

VideoSettings所在的路径
settings/settingsgroup.h

=> class SettingsGroup : public QObject
		QMap<QString, FactMetaData*> _nameToMetaDataMap;

settings/settingsgroup.cc

	_nameToMetaDataMap[videoSourceName]->setEnumInfo(videoSourceList,videoSourceVarList)

Video入口,类似LinkManager

int main(int argc, char *argv[])
->QGCApplication* app = new QGCApplication(argc, argv, runUnitTests);
   -> _toolbox = new QGCToolbox(this);
   ->  _toolbox->setChildToolboxes();
        -> _videoManager->setToolbox(this); // 核心函数 - 视频流入口
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真·skysys

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值