首页 > 技术知识 > 正文

SDL显示YUV图像数据

1.YUV简介

YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。

YUV码流的存储格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0

2.ffmpeg将mp4转yuv格式

复制ffmpeg -i test.mp4 -s 960×540 -pix_fmt yuv420p yuv420960_540.yuv

3.SDL显示示例

复制#include #include #include #include typedef enum { false, true, }bool; int main(int argc,char *argv[]) { FILE *fp=fopen(“yuv420960_540.yuv”,”rb”); if(fp==NULL) { printf(“文件打开失败n”); return 0; } //yuv420保存格式:y占2份,uv各占1份,y表示亮度,uv表示颜色 char *p=malloc(960*540*3); SDL_Init(SDL_INIT_VIDEO); /*创建窗口*/ SDL_Window *window=SDL_CreateWindow(“SDL_VIDEO”, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,800,480,SDL_WINDOW_SHOWN); /*创建渲染器*/ SDL_Renderer *render=SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED); /*清空渲染器*/ SDL_RenderClear(render); /*创建纹理*/ SDL_Texture *sdltext=SDL_CreateTexture(render,SDL_PIXELFORMAT_IYUV,SDL_TEXTUREACCESS_STREAMING,960,540); bool quit=true; SDL_Event event; while(quit) { SDL_PollEvent(&event);/*事件监测*/ if(event.type==SDL_QUIT)/*退出事件*/ { quit=false; } fread(p,1,960*540*3/2,fp);/*读取一帧数据*/ SDL_UpdateTexture(sdltext,NULL,p, 960); SDL_RenderCopy(render, sdltext, NULL, NULL); // 拷贝纹理到渲染器 SDL_RenderPresent(render); // 渲染 } }

3 Makefile文件

复制CFLAGS =-I/home/wbyq/src_pack/SDL2-2.0.14/_install/include -I/home/wbyq/src_pack/SDL2-2.0.14/_install/include/SDL2 -L/home/wbyq/src_pack/SDL2-2.0.14/_install/lib CFLAGS +=-L/home/wbyq/src_pack/SDL2_image-2.0.5/_install/lib -I/home/wbyq/src_pack/SDL2_image-2.0.5/_install/include -I/home/wbyq/src_pack/SDL2_image-2.0.5/_install/include/SDL2 CFLAGS+=-lSDL2 -lpthread -lm -ldl -lSDL2_image app: gcc sdl_test.c $(CFLAGS)

4 运行效果

审核编辑:汤梓红

猜你喜欢