SDL入门(二)代码模板
来源:互联网 发布:刘邦心机 知乎 编辑:程序博客网 时间:2024/05/25 16:38
流程图见http://blog.csdn.net/leixiaohua1020/article/details/38868499
// 0202_2.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"/** * 最简单的SDL2播放视频的例子(SDL2播放RGB/YUV) * Simplest Video Play SDL2 (SDL2 play RGB/YUV) * * 雷霄骅 Lei Xiaohua * leixiaohua1020@126.com * 中国传媒大学/数字电视技术 * Communication University of China / Digital TV Technology * http://blog.csdn.net/leixiaohua1020 * * 本程序使用SDL2播放RGB/YUV视频像素数据。SDL实际上是对底层绘图 * API(Direct3D,OpenGL)的封装,使用起来明显简单于直接调用底层 * API。 * * 函数调用步骤如下: * * [初始化] * SDL_Init(): 初始化SDL。 * SDL_CreateWindow(): 创建窗口(Window)。 * SDL_CreateRenderer(): 基于窗口创建渲染器(Render)。 * SDL_CreateTexture(): 创建纹理(Texture)。 * * [循环渲染数据] * SDL_UpdateTexture(): 设置纹理的数据。 * SDL_RenderCopy(): 纹理复制给渲染器。 * SDL_RenderPresent(): 显示。 * * This software plays RGB/YUV raw video data using SDL2. * SDL is a wrapper of low-level API (Direct3D, OpenGL). * Use SDL is much easier than directly call these low-level API. * * The process is shown as follows: * * [Init] * SDL_Init(): Init SDL. * SDL_CreateWindow(): Create a Window. * SDL_CreateRenderer(): Create a Render. * SDL_CreateTexture(): Create a Texture. * * [Loop to Render data] * SDL_UpdateTexture(): Set Texture's data. * SDL_RenderCopy(): Copy Texture to Render. * SDL_RenderPresent(): Show. */#include <stdio.h>#include "SDL/SDL.h"const int bpp=12;int screen_w=352,screen_h=288;const int pixel_w=352,pixel_h=288;unsigned char buffer[pixel_w*pixel_h*bpp/8];//Refresh Event#define REFRESH_EVENT (SDL_USEREVENT + 1)#define BREAK_EVENT (SDL_USEREVENT + 2)int thread_exit=0;int refresh_video(void *opaque){thread_exit=0;while (!thread_exit) {SDL_Event event;event.type = REFRESH_EVENT;SDL_PushEvent(&event);SDL_Delay(40);}thread_exit=0;//BreakSDL_Event event;event.type = BREAK_EVENT;SDL_PushEvent(&event);return 0;}int _tmain(int argc, _TCHAR* argv[]){if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO)) { printf( "Could not initialize SDL - %s\n", SDL_GetError()); return -1;} SDL_Window *screen; //SDL 2.0 Support for multiple windowsscreen = SDL_CreateWindow("Simplest Video Play SDL2", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,screen_w, screen_h,SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);if(!screen) { printf("SDL: could not create window - exiting:%s\n",SDL_GetError()); return -1;}SDL_Renderer* sdlRenderer = SDL_CreateRenderer(screen, -1, SDL_RENDERER_SOFTWARE);Uint32 pixformat=0;//IYUV: Y + U + V (3 planes)//YV12: Y + V + U (3 planes)pixformat= SDL_PIXELFORMAT_IYUV; SDL_Texture* sdlTexture = SDL_CreateTexture(sdlRenderer,pixformat, SDL_TEXTUREACCESS_STREAMING,pixel_w,pixel_h);FILE *fp=NULL;fp=fopen("BigBuckBunny_CIF_24fps.yuv","rb+");if(fp==NULL){printf("cannot open this file\n");return -1;}SDL_Rect sdlRect; SDL_Thread *refresh_thread = SDL_CreateThread(refresh_video,NULL,NULL);SDL_Event event;while(1){//WaitSDL_WaitEvent(&event);if(event.type==REFRESH_EVENT){if (fread(buffer, 1, pixel_w*pixel_h*bpp/8, fp) != pixel_w*pixel_h*bpp/8){// Loopfseek(fp, 0, SEEK_SET);fread(buffer, 1, pixel_w*pixel_h*bpp/8, fp);}SDL_UpdateTexture( sdlTexture, NULL, buffer, pixel_w); //FIX: If window is resizesdlRect.x = 0; sdlRect.y = 0; sdlRect.w = screen_w; sdlRect.h = screen_h; SDL_RenderClear( sdlRenderer ); SDL_RenderCopy( sdlRenderer, sdlTexture, NULL, &sdlRect); SDL_RenderPresent( sdlRenderer ); }else if(event.type==SDL_WINDOWEVENT){//If ResizeSDL_GetWindowSize(screen,&screen_w,&screen_h);}else if(event.type==SDL_QUIT){thread_exit=1;}else if(event.type==BREAK_EVENT){break;}}SDL_Quit();getchar();return 0;}
0 0
- SDL入门(二)代码模板
- SDL入门(一)
- SDL学习(二)
- SDL入门学习二.事件查询机制
- SDL编程二(视频)
- SDL编程二(视频)
- OpenCV入门(二十五)-- 模板匹配
- Flask入门(二)Jinja2 模板
- SDL学习(二) 设置SDL扩展库
- Eclipse 代码模板入门
- ffmpeg 和 SDL学习(二)
- ffmpeg 和 SDL学习(二)
- SDL2 教程(二) Hello SDL!
- SDL系列讲解(二) 环境搭建
- Erlang入门:gen_server代码模板
- Windows 驱动入门(二)代码结构
- 代码Python入门(二、数据类型)
- dwr入门代码二
- Java 代理模式和装饰者模式的区别
- Hive学习笔记1:Hive创建外部表指向Hbase表时的汉字乱码问题
- Quartz 2D原文档及中文翻译收藏
- 文字左右无缝滚动
- 4.3.3 空值与GROUP BY和ORDER BY
- SDL入门(二)代码模板
- php操作数组
- 4.3.4 空值与聚合函数
- ecplise android 项目转AndroidStrudio 流程
- 自定义模块
- 4.4 小结
- Android开发环境、镜像服务地址、工具网址
- Light OJ 1033 Generating Palindromes (最长回文子串 区间DP)
- GitHub 上都有哪些值得关注学习的 iOS 开源项目?