在視頻監控、視頻會議、遠程教育等多路視頻應用軟件中經常看到如下的視頻佈局,這些佈局可以根據用戶需要自由調整.
這些佈局看起來變化多端,在程序中如何實現呢,首先需要從這些多樣的佈局中找到共同點,我們在這些佈局中疊加上一個棋盤格,形成下圖:
可以看到,這些佈局都是通過先將面板切割成基本單元的視頻棋盤格,再將棋盤格做圈選,形成各種風格的多路視頻佈局。
如果用程序來表達,需要一個結構體來描述視頻佈局(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描述,將棋盤格劃分爲紅框所示的視頻窗口:
其他視頻佈局的實現原理也一樣。