最简SDL显示视频实例
2017-03-13 17:24
267 查看
本实例运行的前提是正确安装了SDL。SDL的安装可以参考:linux安装编译配置ffmpeg和SDL
本实例是运行在linux平台,由雷神在Windows的程序修改而成。test.c 的代码如下:
本实例是运行在linux平台,由雷神在Windows的程序修改而成。test.c 的代码如下:
#include <stdio.h> #include "SDL.h" #define REFRESH_EVENT (SDL_USEREVENT + 1) #define BREAK_EVENT (SDL_USEREVENT + 2) #define BPP 12 #define SCREEN_W 500 #define SCREEN_H 500 #define PIXEL_W 320 #define PIXEL_H 180 const int bpp =BPP; int screen_w =SCREEN_W; int screen_h =SCREEN_H; const int pixel_w=PIXEL_W; const int pixel_h=PIXEL_H; unsigned char buffer[PIXEL_W*PIXEL_H*BPP/8]; int thread_exit=0; int refresh_video(void *opaque){ thread_exit=0; while (thread_exit==0) { SDL_Event event; event.type = REFRESH_EVENT; /* 发送一个事件 */ SDL_PushEvent(&event); SDL_Delay(40); } thread_exit=0; //Break SDL_Event event; event.type = BREAK_EVENT; /* 发送一个事件*/ SDL_PushEvent(&event); return 0; } int main(int argc, char* argv[]) { Uint32 pixformat=0; FILE *fp=NULL; SDL_Rect sdlRect; SDL_Window *screen; SDL_Event event; /* 初始化SDL系统 */ if(SDL_Init(SDL_INIT_VIDEO)) { printf( "Could not initialize SDL - %s\n", SDL_GetError()); return -1; } /* 创建窗口SDL_Window */ screen = SDL_CreateWindow("Simplest Video Play SDL2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 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, 0); //YV12: Y + V + U (3 planes) pixformat= SDL_PIXELFORMAT_IYUV; /* 创建渲染器SDL_Renderer */ SDL_Texture* sdlTexture = SDL_CreateTexture(sdlRenderer,pixformat, SDL_TEXTUREACCESS_STREAMING,pixel_w,pixel_h); fp=fopen("test_yuv420p_320x180.yuv","rb+"); if(fp==NULL){ printf("cannot open this file\n"); return -1; } /* 创建一个线程 */ SDL_Thread *refresh_thread = SDL_CreateThread(refresh_video,NULL,NULL); while(1){ /* 等待一个事件 */ SDL_WaitEvent(&event); if(event.type==REFRESH_EVENT){ if (fread(buffer, 1, pixel_w*pixel_h*bpp/8, fp) != pixel_w*pixel_h*bpp/8){ fseek(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 resize sdlRect.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){ /* 查询显示窗口大小 */ SDL_GetWindowSize(screen,&screen_w,&screen_h); }else if(event.type==SDL_QUIT){ thread_exit=1; }else if(event.type==BREAK_EVENT){ break; } } SDL_Quit(); return 0; }Makefile文件书写如下:
OUT_APP = test INCLUDE_PATH = /usr/local/include/SDL2/ INCLUDE = -I$(INCLUDE_PATH) FFMPEG_LIBS = SDL_LIBS = -lSDL2 -lSDL2main -lSDL2_test LIBS = $(FFMPEG_LIBS)$(SDL_LIBS) COMPILE_OPTS = $(INCLUDE) C = c OBJ = o C_COMPILER = cc C_FLAGS = $(COMPILE_OPTS) $(CPPFLAGS) $(CFLAGS) LINK = cc -o LINK_OPTS = LINK_OBJ = test.o .$(C).$(OBJ): $(C_COMPILER) -c $(C_FLAGS) $< $(OUT_APP): $(LINK_OBJ) $(LINK)$@ $(LINK_OBJ) $(LIBS) $(LINK_OPTS) clean: -rm -rf *.$(OBJ) $(OUT_APP) core *.core *~ include/*~注意上面Makefile的头文件路径和SDL库文件的路径,应该与你安装SDL的路径相同。
相关文章推荐
- 基于Video4linux的视频采集,用SDL显示
- windows mobile用sdl做视频显示(附sdl lib for mobile)(转)
- FFMPEG 最简滤镜filter使用实例(实现视频缩放,裁剪,水印等)
- FFMPEG小白-day06(sdl框架之视频显示)
- 基于Video4linux的视频采集,用SDL显示
- SDL视频显示进阶
- SDL视频显示
- [音视频播放] 一个用SDL来播放视频的实例代码
- (原)关于sdl在部分机器上做视频显示,改变显示窗口大小会崩溃
- FFMPEG+SDL2.0流媒体开发3---简易MP4视频播放器,提取MP4的H264视频序列解码并且显示
- python调用vlc显示视频实例
- SDL显示视频图像
- 基于Video4linux的视频采集,用SDL显示
- SDL2源代码分析8:视频显示总结
- FFmpeg再学习 -- SDL 环境搭建和视频显示
- FFMPEG 最简滤镜filter使用实例(实现视频缩放,裁剪,水印等)
- 开源项目ijkplayer使用FFmpeg视频编码SDL显示的编译使用
- FFMPEG+SDL2.0流媒体开发3---简易MP4视频播放器,提取MP4的H264视频序列解码并且显示
- FFmpeg解码视频和SDL显示
- windows mobile用sdl做视频显示(附sdl lib for mobile)