视频监控、视频会议中常用的视频布局实现方法
在视频监控、视频会议、远程教育等多路视频应用软件中经常看到如下的视频布局,这些布局可以根据用户需要自由调整.
这些布局看起来变化多端,在程序中如何实现呢,首先需要从这些多样的布局中找到共同点,我们在这些布局中叠加上一个棋盘格,形成下图:
可以看到,这些布局都是通过先将面板切割成基本单元的视频棋盘格,再将棋盘格做圈选,形成各种风格的多路视频布局。
如果用程序来表达,需要一个结构体来描述视频布局(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描述,将棋盘格划分为红框所示的视频窗口:

其他视频布局的实现原理也一样。