公司网站展示有哪些,淄博网站优化推广,wordpress多站点无法访问,17网站一起做网店下载我们这里采用SDL#xff08;本文所用版本为SDL2.0.5#xff09;来进行图像输出#xff0c;SDL在进行图像渲染时一般采用的会是direct3D或者opengl#xff0c;SDL对它们进行了封装#xff0c;不过我们这里只讨论SDL的使用#xff0c;并不会去涉及这些底层实现。尽管如此本文所用版本为SDL2.0.5来进行图像输出SDL在进行图像渲染时一般采用的会是direct3D或者openglSDL对它们进行了封装不过我们这里只讨论SDL的使用并不会去涉及这些底层实现。尽管如此我们还是有必要了解其中一些基本概念这些概念能帮助我们很好地理解所使用的SDL api的实际作用。 其中最重要的一个概念就是render中文译为渲染rendering在计算机图像领域指的就是图像合成image synthesis。通俗一点的解释就是render指的是把2D图像图形或者3D模型变成所展示出来的图像的过程实际进行这种转换操作的物件被称为renderer渲染器。在SDL中renderer主要处理的是2D的数据其中包括 图形画点、画线、画面、笔触上色、填充颜色等。图像裁剪、旋转等。不过本文只用到renderer最基本的功能即把图像输出到窗口。在SDL中为了方便renderer的实现renderer所处理的对象被规定为texture纹理因此图像需要先被包装成texturetexture会被render成rendered image然后就可以输出到window。 初始化 在使用SDL的函数之前需要先调用SDL_Init来进行初始化由于本文的目的是进行视频图像输出因此需要指定flag为SDL_INIT_VIDEO来初始化视频子系统。 if(SDL_Init(SDL_INIT_VIDEO)){fprintf(stderr, SDL init video failed\n);return -1;} 接下来创建window、renderer、texture。在创建texture时需要指定输入的图像像素格式通常视频的像素格式都是yuv420p对应的flag为SDL_PIXELFORMAT_IYUV。对于会频繁更换的视频图像还需要指定texture为SDL_TEXTUREACCESS_STREAMING。 window SDL_CreateWindow(Simple Player, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, DEF_WIDTH, DEF_HEIGHT, 0);if(!window){fprintf(stderr, SDL create window failed\n);return -1;}renderer SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);if(!renderer){fprintf(stderr, SDL create renderer failed\n);return -1;}texture SDL_CreateTexture(renderer, SDL_PIXELFORMAT_IYUV, SDL_TEXTUREACCESS_STREAMING, DEF_WIDTH, DEF_HEIGHT);if(!renderer){fprintf(stderr, SDL create renderer failed\n);return -1;}SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_NONE);SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);SDL_RenderClear(renderer); 创建用于存储图像像素数据的缓冲区并打开yuv文件以供后续读取图像 YPlane (unsigned char *)malloc(DEF_WIDTH*DEF_HEIGHT);UPlane (unsigned char *)malloc(DEF_WIDTH*DEF_HEIGHT/4);VPlane (unsigned char *)malloc(DEF_WIDTH*DEF_HEIGHT/4);pFile fopen(argv[1], rb);if(pFileNULL)return -1;显示 循环读取图像进入缓冲区然后把图像传入texture进行包装、渲染、最后输出每帧间隔为1/24秒。对于视频子系统来说还有一个必不可少的步骤就是在循环中调用SDL_PumpEvents。SDL_PumpEvents如其名称主要的功能是推动event队列以进行队列状态的更新不过它还有一个作用是进行视频子系统的设备状态更新如果不调用这个函数所显示的视频会在大约10秒后丢失色彩。 while(1){sizeY fread(YPlane, 1, DEF_WIDTH*DEF_HEIGHT, pFile);sizeU fread(UPlane, 1, DEF_WIDTH*DEF_HEIGHT/4, pFile);sizeV fread(VPlane, 1, DEF_WIDTH*DEF_HEIGHT/4, pFile);if(!sizeY||!sizeU||!sizeV)break;if(0!SDL_UpdateYUVTexture(texture, NULL, YPlane, DEF_WIDTH, UPlane, DEF_WIDTH/2, VPlane, DEF_WIDTH/2)){fprintf(stdout, Render Update Texture failed, reason: %s\n, SDL_GetError());}SDL_RenderCopyEx(renderer, texture, NULL, NULL, 0, NULL, 0);SDL_RenderPresent(renderer);SDL_Delay(1000/FRAMERATE);SDL_PumpEvents();} 退出 退出前的收尾处理 SDL_DestroyTexture(texture);SDL_DestroyRenderer(renderer);SDL_DestroyWindow(window);free(YPlane);free(UPlane);free(VPlane);fclose(pFile);转载于:https://www.cnblogs.com/TaigaCon/p/9622016.html