视频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); // 核心函数 - 视频流入口