SDL渲染RGB图像
一什么是SDL
在 FFmpeg 中,使用 SDL 来初始化视频和音频播放器,并将音频和视频数据从 FFmpeg 解码器中读取出来,再通过 SDL 进行处理和显示。
二SDL渲染图像的步骤
先要进行初始化接口,第二部创建一个窗口或者绑定一个窗口句柄,第三步创建一个渲染器,第四步是在这个渲染器中创建一个材质,创建完材质之后需要显示,显示涉及四个步骤,首先就是清屏,更新材质,把内存中的数据传进来,再把材质数值复制到我们的渲染区,最后进行渲染显示。
srcrect
:
-
- 类型:
const SDL_Rect *
- 描述:指向源矩形的指针,指定从纹理中复制的区域。如果为
NULL
,则使用整个纹理作为源区域。
- 类型:
dstrect
:
-
- 类型:
const SDL_Rect *
- 描述:指向目标矩形的指针,指定将纹理渲染到的目标区域。如果为
NULL
,则纹理会被渲染到整个渲染目标(通常是整个窗口)。
- 类型:
实际设置了20ms间隔发生一次,那么一秒就是50帧,设置了帧率,1s=1000ms,那么20ms发生一次,那么1000/20=50次,发生了50次,那么对应到视频图片就是50帧(但是只是理想情况下)
#include <iostream>
#include <sdl/SDL.h>
using namespace std;
#pragma comment(lib,"SDL2.lib")
#undef mainint main(int argc, char* argv[])
{int w = 800;int h = 600;//1 初始化SDL video库if (SDL_Init(SDL_INIT_VIDEO)){cout << SDL_GetError() << endl;return -1;}//2 生成SDL 窗口auto screen = SDL_CreateWindow("test sdl ffmpeg",SDL_WINDOWPOS_CENTERED,//窗口位置SDL_WINDOWPOS_CENTERED,w,h,SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);if (!screen){cout << SDL_GetError() << endl;return -2;}//3 生成渲染器auto render = SDL_CreateRenderer(screen, -1, SDL_RENDERER_ACCELERATED);if (!render){cout << SDL_GetError() << endl;return -3;}//4 生成材质auto texture = SDL_CreateTexture(render, SDL_PIXELFORMAT_ARGB8888,SDL_TEXTUREACCESS_STREAMING,// 可加锁w, h);if (!texture){cout << SDL_GetError() << endl;return -4;}// 存放图像的数据//智能指针分配和管理内存shared_ptr<unsigned char> rgb(new unsigned char[w * h * 4]);//使用智能指针,不用释放对象auto r = rgb.get();//返回原始指针unsigned char tmp = 255;for (;;){//判断退出SDL_Event ev;SDL_WaitEventTimeout(&ev, 10);//增加时间控制帧率 100帧每秒if (ev.type == SDL_QUIT){SDL_DestroyWindow(screen);break;}tmp--;for (int j = 0; j < h; j++){int b = j * w * 4;for (int i = 0; i < w*4; i += 4){//r指针相当于顺序存储在一维数组中r[b + i] = 0; //Br[b + i + 1] = 0; //Gr[b + i + 2] = tmp; //Rr[b + i + 3] = 0; //A}}//5 内存数据写入材质SDL_UpdateTexture(texture, NULL, r, w * 4);//NULL表示整幅图 //6 清理屏幕SDL_RenderClear(render);SDL_Rect sdl_rect;sdl_rect.x = 0;sdl_rect.y = 0;sdl_rect.w = w;sdl_rect.h = h;//7 复制材质到渲染器SDL_RenderCopy(render, texture,NULL,//原图位置和尺寸&sdl_rect//目标位置和尺寸);//8 渲染SDL_RenderPresent(render);}getchar();return 0;
}