QT使用SDL多窗口显示视频(linux,ubuntu)

为了实现一份资源的多次复制(将一个视频投射到多个窗口),降低cpu占用率,取代传统的setpixmap或者qpainter,不使用复杂的qopengl类也能调用显卡资源,那么选择SDL2是非常好的。
三步走
首先linux编译安装SDL2,包含头文件和链接库文件
编译安装sdl2相关链接:
安装sdl2到系统路径

#include <SDL2/SDL.h>
LIBS += -lSDL2

1.创建SDL相关资源

	SDL_Window *SDL_Window;
	SDL_Renderer *SDL_Renderer;
	SDL_Texture *SDL_Texture;
	SDL_Init(SDL_INIT_VIDEO);
	//创建视频资源窗口
    SDL_Window = SDL_CreateWindowFrom(资源窗口->winId());
    SDL_Renderer = SDL_CreateRenderer(SDL_Window, -1, 0);
    //视频具体格式自行确定,应该统一为视频源(流或本地文件)的格式
    SDL_Texture = SDL_CreateTexture(SDL_Renderer, SDL_PIXELFORMAT_IYUV,
                                    SDL_TEXTUREACCESS_STREAMING, 1920, 1080);
    SDL_ShowWindow(SDL_Window);
	//创建主窗口资源  
	mSDL_Window = SDL_CreateWindowFrom(主窗口->winId());
	mSDL_Renderer = SDL_CreateRenderer(mSDL_Window, -1, 0);
	//视频具体格式自行确定,应该统一为视频源(流或本地文件)的格式
	mSDL_Texture = SDL_CreateTexture(mSDL_Renderer, SDL_PIXELFORMAT_IYUV,
	                                SDL_TEXTUREACCESS_STREAMING, 1920, 1080);

2.视频帧的处理
本人使用qmediaplayer配合qabstractvideosurface获取了QVideoFrame
qmediaplayer配合qabstractvideosurface获取视频帧链接

	QVideoFrame &frame;
	//资源窗口刷新
	SDL_Rect rect = {0, 0, 1920, 1080};
	SDL_UpdateTexture(SDL_Texture, &rect,
	                  frame.bits(), frame.bytesPerLine());
	SDL_RenderClear(SDL_Renderer);
	SDL_RenderCopy(SDL_Renderer, SDL_Texture, NULL, NULL);
	SDL_RenderPresent(SDL_Renderer);
	//主窗口刷新
	SDL_UpdateTexture(mSDL_Texture, &rect,
	                 frame.bits(), frame.bytesPerLine());
	SDL_RenderClear(mSDL_Renderer);
	SDL_RenderCopy(mSDL_Renderer, mSDL_Texture, NULL, NULL);
	SDL_RenderPresent(mSDL_Renderer);

3.销毁资源

    SDL_DestroyTexture(mSDL_Texture);
    SDL_DestroyRenderer(mSDL_Renderer);
    SDL_DestroyWindow(mSDL_Window);

    SDL_DestroyTexture(SDL_Texture);
    SDL_DestroyRenderer(SDL_Renderer);
    SDL_DestroyWindow(SDL_Window);
    
    SDL_Quit();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值