視頻監控、視頻會議中常用的視頻佈局實現方法

 在視頻監控、視頻會議、遠程教育等多路視頻應用軟件中經常看到如下的視頻佈局,這些佈局可以根據用戶需要自由調整.



這些佈局看起來變化多端,在程序中如何實現呢,首先需要從這些多樣的佈局中找到共同點,我們在這些佈局中疊加上一個棋盤格,形成下圖:

 

 

可以看到,這些佈局都是通過先將面板切割成基本單元的視頻棋盤格,再將棋盤格做圈選,形成各種風格的多路視頻佈局。

如果用程序來表達,需要一個結構體來描述視頻佈局(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描述,將棋盤格劃分爲紅框所示的視頻窗口:

其他視頻佈局的實現原理也一樣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章