1、写在后面

上一篇咱们曾经把握了 Qml 中动态创建 & 销毁组件的技巧。

当初, 咱们要利用这个技巧来动态创建视频容器。

先来看看效果图 (来自 SkeyeARS ) :

  • 全景视频容器
  • 球机(相机) 视频容器

2、注释开始

咱们实现的外围容器组件命名为 VideoContainer.qml

当然,须要为动态创建的实例辨别类型, 这里应用了 Qml 的新个性 enum

    enum VideoType {        None = 1,        PanoVideo,        BallVideo    }

其中,PanoVideo 为全景, BallVideo 为球机。

而后,咱们实现实现要害的动静加载:

//VideoContainer.qmlimport QtQuick 2.15Item {    id: container        enum VideoType {        None = 1,        PanoVideo,        BallVideo    }        property var videoType: VideoContainer.VideoType.None    property alias instance: contentLoader.item    property bool finished: contentLoader.status === Loader.Ready        function destoryContent() {        contentLoader.source = "";    }    //更改VideoType时触发加载    onVideoTypeChanged: {        if (finished) {            if (videoType === VideoContainer.VideoType.PanoVideo) {                if (instance.objectName !== "PanoVideo" ) {                    contentLoader.source = "PanoVideoComponent.qml";                }            } else if (videoType === VideoContainer.VideoType.BallVideo) {                if (instance.objectName !== "BallVideo" ) {                    contentLoader.source = "BallVideoComponent.qml";                }            } else {                container.destoryContent();            }        } else {            if (videoType === VideoContainer.VideoType.PanoVideo) {                contentLoader.source = "PanoVideoComponent.qml";            } else if (videoType === VideoContainer.VideoType.BallVideo) {                contentLoader.source = "BallVideoComponent.qml";            }        }    }        function loadVideo() {        if (instance == undefined) return;        if (videoType === VideoContainer.VideoType.BallVideo) {            //这里进行一些球机的初始化            instance.cameraIp = cameraIp;            instance.cameraPort = cameraPort;            instance.username = username;            instance.password = password;            instance.initialize();        } else if (videoType === VideoContainer.VideoType.PanoVideo) {            //这里进行一些全景的初始化            instance.channel = 1;        }    }        Loader {        id: contentLoader        asynchronous: false //不应用异步,立刻创立        anchors.fill: parent        //更改VideoType时触发加载,加载实现后处理        onLoaded: {            if (videoType !== VideoContainer.VideoType.None) {                container.loadVideo();            }        }    }

接着咱们须要实现两个对应的组件 PanoVideoComponent.qmlBallVideoComponent.qml

    //PanoVideoComponent.qml    import QtQuick 2.15        Item {        id: root        clip: true        objectName: "PanoVideo"                VideoFrameProvider {             id: provider            //这是一个全景流            source: "rtsp://192.168.0.33:8554/channel=1"        }            VideoOutput {            id: videoOutput            anchors.fill: parent            source: provider        }                //这里放全景相干的一些组件等等        .....    }
    //BallVideoComponent.qml    import QtQuick 2.15        Item {        id: root        clip: true        objectName: "BallVideo"                VideoFrameProvider {             id: provider            //这是一个安讯士的相机            source: "rtsp://admin:12345@192.168.0.33:6003/axis-media/media.amp"        }            VideoOutput {            id: videoOutput            anchors.fill: parent            source: provider        }                //这里放球机(云台)相干的一些组件等等        .....    }

最初,如何应用:

例如,咱们想要实例化一个 全景视频:

VideoContainer {    videoType: VideoContainer.VideoType.PanoVideo}

又或者,想要实例化一个 球机视频:

VideoContainer {    videoType: VideoContainer.VideoType.BallVideo}

如果想要销毁:

VideoContainer {    videoType: VideoContainer.VideoType.None}

切实是简略不便且实用~

对于SkeyeARS

SkeyeARS全景AR加强监视系统, 是视开科技开发的一款基于宽场景多路视频无缝拼接、视频实时加强、监督指标加强显示、指标主动跟踪、视频存储回放、近程数据传输和多通道全景视频同步显示等性能的综合视频AR加强监视系统,广泛应用于智慧交通、智慧城市、智慧机场等大场景智能监控畛域。

具体阐明:http://www.openskeye.cn/web/product/ars