为了实现一份资源的多次复制(将一个视频投射到多个窗口),降低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();