QGC视频框架是 基于Gstreamer插件机制 实现的 。
插件名称 QGC_VIDEOSINK_PLUGIN=qt5videosink ,是静态插件。
第一步 QGCApplication构造函数中调用,初始化流媒体框架
/*!
* \brief 初始化视频流
* \param argc
* \param argv
* \param filename 日志文件
* \param debuglevel GST_DEBUG级别
*/
extern void initializeVideoStreaming (int &argc, char *argv[], char* filename, char* debuglevel);
初始化GStreamer:
gst_init_check(&argc, &argv, &error)
注册GStreamer静态插件 QGC_VIDEOSINK_PLUGIN :
// Our own plugin
//--注册QGC Gstreamer 静态插件
GST_PLUGIN_STATIC_REGISTER(QGC_VIDEOSINK_PLUGIN);
注册到 QML视频后端 QGCVideoBackground.qml
import QtQuick 2.3
import QtQuick.Controls 1.2
import QGroundControl.QgcQtGStreamer 1.0
/**
* @brief qgroundcontrol-3.4.4/src/VideoStreaming/VideoItem.h
* c++类 VideoItem
* 在 VideoStreaming.cc 函数中 void initializeVideoStreaming(int &argc, char* argv[], char* logpath, char* debuglevel) 注册
* qmlRegisterType<VideoItem> ("QGroundControl.QgcQtGStreamer", 1, 0, "VideoItem");
*/
VideoItem {
id: videoBackground
property var display
property var receiver
surface: display
}
第二步 在QGCToolbox中创建媒体管理器VideoManager
//创建媒体管理器
_videoManager = new VideoManager (app, this);
第三步 在VideoManager中创建流媒体接收器
//创建流媒体接收器
_videoReceiver = toolbox->corePlugin()->createVideoReceiver(this);
第四步 在VideoReceiver中创建如下媒体流
接收处理媒体
// +-->queue-->decoder-->_videosink
// |
// datasource-->demux-->parser-->tee
//
// ^
// |
// +-Here we will later link elements for recording
+-->queue-->decoder-->_videosink
// |
// datasource-->demux-->parser-->tee
// |
// | +--------------_sink-------------------+
// | | |
// we are adding these elements-> +->teepad-->queue-->matroskamux-->_filesink |
// | |
// +--------------------------------------+