SDL2 显示视频并在视频上显示文字

        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();

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值