使用sdl2
sdl2是一个显示工具,Simple DirectMedia Layer is a cross-platform development ,跨平台媒体显示层 sdl2 官网 无论在何种操作系统中,我们都可以使用其良好的特性和高性能。
显示矩阵我们可以使用一个SDL2 窗口来显示多个画面,而没有必要使用多个sdl2 窗口,以下是显示矩阵的真实画面,画面来自于rtsp协议的各个摄像头,并且叠加了文字。有关于rtsp协议,可以参考我的其他文章。
在渲染的过程中,我们是可以使用一个窗口来分割显示,这样只有一个显示窗口,比起多窗口显示多画面,节省了很多资源。以下为显示分割算法。画面分割为行列,xn 和 yn 为分割的行列,算法求出显示的矩形区域。
//准备显示的区域
void calc_show_rect(int x1, int y1, int x2, int y2, int xn, int yn,
vector & txbuf,int pixelx,int pixely)
{
//电影画格个数
bool inflag = false;
if (txbuf.size() != xn*yn){
//清除
auto iter = txbuf.begin();
while (iter != txbuf.end()){
delete *iter;
iter++;
}
txbuf.clear();
//必须插入
inflag = true;
}
size_t movesize = xn * yn;
float cx = x2-x1;
float cy = y2-y1;
if (xn > 0 && yn > 0)
{
float w = cx / (float)xn;
float h = cy / (float)yn;
//int n = -1;
int nx;
int ny;
//auto iter = wins.begin();
for (size_t n = 0; n rect);
//tx->rect.x = x1+nxpos;
//tx->rect.y = y1+nypos;
//tx->rect.w = w;
//tx->rect.h = h;
}
}
}
单个区域成比例显示算法
上面的函数中有一个cal0 函数,是为了计算显示区域的图像成比例,否则拉伸会把图像扭曲。
/*
w: 视频宽度
h: 视频高度
*/
int calc0(int w, int h, SDL_Rect &canvas, SDL_Rect& rect){
if (w = h){
rect.w = w;
rect.h = h;
rect.x = canvas.x + (canvas.w - w) / 2;
rect.y = canvas.y + (canvas.w - h) / 2;
}
else if (canvas.w = h){
rect.w = canvas.w;
rect.h = (float)canvas.w / scale;
rect.x = canvas.x;
rect.y = canvas.y + abs(canvas.h - rect.h) / 2;
}
else if (canvas.w > w && canvas.h copy_text(_pRender);
tex++;
}
}
void SDLPlayer::Present()
{
SDL_RenderPresent(_pRender);
}
三维显示
我们可以利用这种方式在三维中画出显示矩阵,原理是一样的,下一次我们再放出三维的做法。 三维的好处是: 1 、可以更多地利用空间, 2、在需要的时候,我们可以使用vr 3、可以加入三维本地场景。 希望能帮助到大家。