视频监控、视频会议中惯用的视频布局实现方法

视频监控、视频会议中常用的视频布局实现方法

在视频监控、视频会议、远程教育等多路视频应用软件中经常看到如下的视频布局,这些布局可以根据用户需要*调整.
视频监控、视频会议中惯用的视频布局实现方法

这些布局看起来变化多端,在程序中如何实现呢,首先需要从这些多样的布局中找到共同点,我们在这些布局中叠加上一个棋盘格,形成下图:
视频监控、视频会议中惯用的视频布局实现方法

可以看到,这些布局都是通过先将面板切割成基本单元的视频棋盘格,再将棋盘格做圈选,形成各种风格的多路视频布局。

如果用程序来表达,需要一个结构体来描述视频布局(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描述,将棋盘格划分为红框所示的视频窗口:
视频监控、视频会议中惯用的视频布局实现方法
其他视频布局的实现原理也一样。