来源:http://blog.youkuaiyun.com/lezhiyong
在视频监控、视频会议、远程教育等多路视频应用软件中经常看到如下的视频布局,这些布局可以根据用户需要自由调整.

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

可以看到,这些布局都是通过先将面板切割成基本单元的视频棋盘格,再将棋盘格做圈选,形成各种风格的多路视频布局。
如果用程序来表达,需要一个结构体来描述视频布局(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描述,将棋盘格划分为红框所示的视频窗口:

其他视频布局的实现原理也一样。
本文探讨了视频监控和视频会议应用中常见的视频布局方式,通过在布局上叠加棋盘格,揭示其共通性。利用VIDEO_LAYOUT和VIDEO_WINDOW结构体,可以描述并实现各种视频窗口的排列,例如将面板切割成棋盘格,再进行组合布局。
3131

被折叠的 条评论
为什么被折叠?



