SDL2可以直接显示视频,也可以在mfc控件上显示,光显示图像比较简单,但是SDL本身不带字库,因此不能直接显示文字,需要调用第三方库完成。
SDL2可以直接从官方下载,但显示文字需要用扩展库SDL_ttf实现,ttf是True Type Font的缩写,ttf是Windows下的缺省字体,它有美观,放大缩小不变形的优点,因此广泛应用很多场合。使用ttf库的第一件事要从Windows的字库下拷贝出一个字库出来,最好是中文字体,这样可以同时支持英文和中文显示。它一般在c:\windows\fonts 目录下面。比如simhei.ttf 就是仿黑体的字库,将这个文件拷贝到你的源文件目录下。
要使用SDL_ttf库首先要下载该扩展库:http://www.libsdl.org/projects/SDL_ttf/docs/SDL_ttf.html
拷贝 SDL_ttf.h 和 SDL2_ttf.lib 到工程目录
拷贝 SDL2_ttf.dll libfreetype-6.dll zlib1.dll 到程序目录
扩展库跟SDL库一样需要初始化,并释放资源。过程代码如下:
void CTabPage1::SDL_ShowVideo(unsigned int width, unsigned int height, unsigned char* dataY, unsigned char* dataU, unsigned char* dataV)
{
s_user_onvif_device_inf* inf;
SDL_Rect rect;
//SDL 2.0 Support for multiple windows
screen = SDL_CreateWindowFrom(GetDlgItem(ID)->GetSafeHwnd());
sdlRenderer = SDL_CreateRenderer(screen, -1, SDL_RENDERER_ACCELERATED);
sdlTexture = SDL_CreateTexture(sdlRenderer, SDL_PIXELFORMAT_IYUV, SDL_TEXTUREACCESS_STREAMING, width, height);
SDL_SetHint(SDL_HINT_RENDER_DRIVER, "direct3d");
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1");//D3D 支持
SDL_SetHint(SDL_HINT_RENDER_VSYNC, "1");
rect.x = 0;
rect.y = 0;
rect.w = width;
rect.h = height;
SDL_UpdateYUVTexture(sdlTexture, &rect, dataY, width, dataU, width / 2, dataV, width / 2);//绘制背景 YUV方式
SDL_RenderClear(sdlRenderer);//清除前绘图
SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, NULL);//靠背背景
if (1)
{
//用户数据有效
CRect r;
int i, w, h;
GetDlgItem(ID)->GetWindowRect(&r);
w = 100;
h = 10;
SDL_Rect sdl_rect = { 0, 0, w, h };
SDL_SetRenderDrawColor(sdlRenderer, 0, 255, 0, 0);//绘制画笔颜色
SDL_RenderDrawRect(sdlRenderer, &sdl_rect);//绘制矩形
TTF_Font* font = TTF_OpenFont("simsun.ttc", 30);
if (font == NULL)
{
fprintf(stderr, "font open failure %s\n", SDL_GetError());
exit(-1);
}
SDL_Color color = { 0, 255, 0, 0};
SDL_Rect sdl_rect1 = { 0, 0, 40, 20 };
SDL_Surface* surf = TTF_RenderText_Blended(font, "SDL_tft", color);//绘制文字到图片
SDL_Texture* text = SDL_CreateTextureFromSurface(sdlRenderer, surf);
SDL_RenderCopy(sdlRenderer, text, NULL, &sdl_rect1);//拷贝该图片
SDL_DestroyTexture(text);
SDL_FreeSurface(surf);
TTF_CloseFont(font);
}
SDL_RenderPresent(sdlRenderer);
}
之前需要初始化:
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER))
return;
TTF_Init();
之后需要释放资源:
SDL_DestroyTexture(sdlTexture);
SDL_DestroyRenderer(sdlRenderer);
SDL_DestroyWindow(screen);
TTF_Quit();
SDL_Quit();