视频监控、视频会议中惯用的视频布局实现方法
在视频监控、视频会议、远程教育等多路视频应用软件中经常看到如下的视频布局,这些布局可以根据用户需要*调整.
这些布局看起来变化多端,在程序中如何实现呢,首先需要从这些多样的布局中找到共同点,我们在这些布局中叠加上一个棋盘格,形成下图:
可以看到,这些布局都是通过先将面板切割成基本单元的视频棋盘格,再将棋盘格做圈选,形成各种风格的多路视频布局。
如果用程序来表达,需要一个结构体来描述视频布局(VIDEO_LAYOUT)和一个结构体来描述视频窗口(VIDEO_WINDOW)。
VIDEO_LAYOUT:描述视频面板切割成棋盘格的方式以及包含的所有VIDEO_WINDOW元素。
typedef struct _ VIDEO_LAYOUT{ BYTE xDiv; // 切割成的棋盘格(列)数 BYTE yDiv; //切割成的棋盘格(行)数 int iWindowNum; // 视频窗口的个数,即pVideoWindow元素的个数 VIDEO_WINDOW * pArrWindow; } VIDEO_LAYOUT; |
VIDEO_WINDOW:基于棋盘格的视频窗口的描述结构,LeftTop到RightDown位置的棋盘关格组成一个视频窗口。
typedef struct _ VIDEO_WINDOW { struct{ BYTE x; BYTE y; } POINT POINT LeftTop; //左上角的棋盘格 POINT RightDown; //右下角的棋盘格 } VIDEO_WINDOW; |
例如对于描述:
VIDEO_LAYOUT videoPanel; videoPanel. xDiv = 3; videoPanel. yDiv = 3; videoPanel.iWindowNum =6; videoPanel. pArrWindow = new VIDEO_WINDOW [6]; pArrWindow [0].LeftTop.x = 0; pArrWindow [0].LeftTop.y = 0; pArrWindow [0].RightDown.x = 2; pArrWindow [0] .RightDown.y = 2; pArrWindow [1].LeftTop.x = 2; pArrWindow [1].LeftTop.y = 0; pArrWindow [1].RightDown.x =3; pArrWindow [1].RightDown.y = 1; pArrWindow [2].LeftTop.x = 2; pArrWindow [2].LeftTop.y = 1; pArrWindow [2].RightDown.x = 3; pArrWindow [2].RightDown.y = 2; pArrWindow [3].LeftTop.x = 2; pArrWindow [3].LeftTop.y = 2; pArrWindow [3].RightDown.x = 3; pArrWindow [3].RightDown.y = 3; pArrWindow [4].LeftTop.x = 0; pArrWindow [4].LeftTop.y = 2; pArrWindow [4].RightDown.x = 1; pArrWindow [4].RightDown.y = 3; pArrWindow [5].LeftTop.x = 1; pArrWindow [5].LeftTop.y = 2; pArrWindow [5].RightDown.x = 2; pArrWindow [5].RightDown.y = 3; |
xDiv = 3; yDiv= 3,将面板分割为如下的棋盘格:
根据pArrWindow描述,将棋盘格划分为红框所示的视频窗口:
其他视频布局的实现原理也一样。