<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
自從做監控系統以來,就一直有打算將這個功能獨立出來一個類,這樣的話很多系統用到此類佈局切換,通用這個類就行,而且後期此佈局會增加其他異形佈局,甚至按照16:9之類的比例生成佈局,之前此功能直接寫在功能介面UI類中,不方便拓展,好多個系統用到此功能,一旦增加了64佈局、128通道佈局等,都需要做對應更改,煩不勝煩,所以務必將此功能徹底剝離出來,為後面的256通道、異形佈局、自定義佈局打基礎。
通道切換在監控系統中是最基礎的必備功能,一般都會提供1通道、4通道、6通道、8通道、9通道、16通道這幾個通道切換,可能做得比較好的還會提供24通道、32通道、64通道的,這個可能對電腦的設定就有一定要求了,一般來說,超過9個通道實時顯示視訊流,基本上會採用子碼流來顯示,如果都採用主碼流,電腦壓力非常巨大,CPU佔用很高,記憶體也高,不過現在的電腦設定越來越高,基本上四千多塊錢的桌上型電腦,設定已經非常好了,顯示個16個通道的實時視訊毫無壓力。
Qt中的佈局非常好用,尤其是QGridLayout表格佈局,可以指定行列放置控制元件,而且還可以設定每個控制元件佔用幾行幾列,這樣就可以完美的實現各種通道佈局了。比如6通道,可以設定通道1佔用兩行兩列,其他通道各站一行一列即可,當切換佈局的時候,其他隱藏即可。
主要功能:
本控制元件開源,開源地址https://gitee.com/feiyangqingyun/QWidgetDemo/tree/master/video/videobox
國內站點:https://gitee.com/feiyangqingyun
國際站點:https://github.com/feiyangqingyun
體驗地址:https://pan.baidu.com/s/1YOVD8nkoOSYwX9KgSauLeQ 提取碼:kcgz 檔名:bin_video_demo/bin_linux_video。
void VideoBox::change_video_normal(int index, int flag) { //首先隱藏所有通道 hide_video_all(); int size = 0; int row = 0; int column = 0; //行列數一致的比如 2*2 3*4 4*4 5*5 等可以直接套用通用的公式 //按照這個函數還可以非常容易的拓展出 10*10 16*16=256 通道介面 for (int i = 0; i < videoCount; ++i) { if (i >= index) { //新增到對應佈局並設定可見 gridLayout->addWidget(widgets.at(i), row, column); widgets.at(i)->setVisible(true); size++; column++; if (column == flag) { row++; column = 0; } } if (size == (flag * flag)) { break; } } } void VideoBox::change_video_custom(int index, int type) { //從開始索引開始往後衍生多少個通道 QList<int> indexs; for (int i = index; i < (index + type); ++i) { indexs << i; } if (type == 6) { change_video_6(indexs); } else if (type == 8) { change_video_8(indexs); } else if (type == 13) { change_video_13(indexs); } } void VideoBox::change_video_6(const QList<int> &indexs) { //過濾防止索引越界 if (indexs.size() < 6) { return; } //首先隱藏所有通道 hide_video_all(); //挨個重新新增到佈局 gridLayout->addWidget(widgets.at(indexs.at(0)), 0, 0, 2, 2); gridLayout->addWidget(widgets.at(indexs.at(1)), 0, 2, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(2)), 1, 2, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(3)), 2, 2, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(4)), 2, 1, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(5)), 2, 0, 1, 1); //設定通道控制元件可見 for (int i = indexs.first(); i <= indexs.last(); ++i) { widgets.at(i)->setVisible(true); } } void VideoBox::change_video_8(const QList<int> &indexs) { //過濾防止索引越界 if (indexs.size() < 8) { return; } //首先隱藏所有通道 hide_video_all(); //挨個重新新增到佈局 gridLayout->addWidget(widgets.at(indexs.at(0)), 0, 0, 3, 3); gridLayout->addWidget(widgets.at(indexs.at(1)), 0, 3, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(2)), 1, 3, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(3)), 2, 3, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(4)), 3, 3, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(5)), 3, 2, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(6)), 3, 1, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(7)), 3, 0, 1, 1); //設定通道控制元件可見 for (int i = indexs.first(); i <= indexs.last(); ++i) { widgets.at(i)->setVisible(true); } } void VideoBox::change_video_13(const QList<int> &indexs) { //過濾防止索引越界 if (indexs.size() < 13) { return; } //首先隱藏所有通道 hide_video_all(); //挨個重新新增到佈局 gridLayout->addWidget(widgets.at(indexs.at(0)), 0, 0, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(1)), 0, 1, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(2)), 0, 2, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(3)), 0, 3, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(4)), 1, 0, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(5)), 2, 0, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(6)), 1, 1, 2, 2); gridLayout->addWidget(widgets.at(indexs.at(7)), 1, 3, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(8)), 2, 3, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(9)), 3, 0, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(10)), 3, 1, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(11)), 3, 2, 1, 1); gridLayout->addWidget(widgets.at(indexs.at(12)), 3, 3, 1, 1); //設定通道控制元件可見 for (int i = indexs.first(); i <= indexs.last(); ++i) { widgets.at(i)->setVisible(true); } } void VideoBox::change_video_1(int index) { //首先隱藏所有通道 hide_video_all(); //新增通道到佈局 gridLayout->addWidget(widgets.at(index), 0, 0); //設定可見 widgets.at(index)->setVisible(true); } void VideoBox::change_video_4(int index) { change_video_normal(index, 2); } void VideoBox::change_video_6(int index) { change_video_custom(index, 6); } void VideoBox::change_video_8(int index) { change_video_custom(index, 8); } void VideoBox::change_video_9(int index) { change_video_normal(index, 3); } void VideoBox::change_video_13(int index) { change_video_custom(index, 13); } void VideoBox::change_video_16(int index) { change_video_normal(index, 4); } void VideoBox::change_video_25(int index) { change_video_normal(index, 5); } void VideoBox::change_video_36(int index) { change_video_normal(index, 6); } void VideoBox::change_video_64(int index) { change_video_normal(index, 8); }
以上就是Qt音視訊開發之通用監控佈局控制元件的實現的詳細內容,更多關於Qt監控佈局控制元件的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45