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
ffmpeg -i test.mp4 -s 960x540 -pix_fmt yuv420p yuv420960_540.yuv
#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); // 渲染
}
}
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)
全部0条评论
快来发表一下你的评论吧 !