1、初始化SDL接口
if (SDL_Init(SDL_INIT_VIDEO)) {
cout << SDL_GetError() << endl;
return -1;
}
static int sdl_width = ui.label->width();
static int sdl_height = ui.label->height();
2、初始化窗口
auto screen = SDL_CreateWindowFrom((void*)ui.label->winId()); // 渲染到Qt
auto screen = SDL_CreateWindow("test sdl ffmpeg",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, // 窗口位置
sdl_width, sdl_height,
SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE
);
3、生成对应窗口的渲染器
auto render = SDL_CreateRenderer(screen, -1, SDL_RENDERER_ACCELERATED); // 使用硬件加速
4、创建材质
材质是在显存当中的,需要接口和内存交互。
auto texture = SDL_CreateTexture(render, SDL_PIXELFORMAT_ARGB8888, // 像素格式
SDL_TEXTUREACCESS_STREAMING, // 材质需要修改
sdl_width, sdl_height
);
rgb = new unsigned char[sdl_width * sdl_height * pix_size]; // 分配材质内存
static int temp = 255;
temp--;
for (int j = 0; j < sdl_height; j++) { // 写入rgb数据
int b = j * sdl_width * 4; // 第一列像素位置
for (int i = 0; i < sdl_width * 4; i += 4) {
rgb[b + i] = 0; //B
rgb[b + i + 1] = 0; //G
rgb[b + i + 2] = temp; //R
rgb[b + i + 3] = 0; //A
}
}
SDL_UpdateTexture(texture, NULL, rgb, sdl_width * 4); // 把内存数据写入显存中的材质
5、渲染
SDL_RenderClear(render); // 清理屏幕
SDL_Rect sdl_rect; // 目标尺寸
sdl_rect.x = 0;
sdl_rect.y = 0;
sdl_rect.w = sdl_width;
sdl_rect.h = sdl_height;
// 复制材质到渲染器
SDL_RenderCopy(render, sdl_texture,
NULL/*原图位置和尺寸*/,
&sdl_rect/*目标位置和尺寸*/);
// 渲染
SDL_RenderPresent(render);