FFmpeg学习笔记 – SDL的使用

前言
使用FFmpeg处理视频时,将视频流显示出来,能够看到处理后的结果,是非常有必要的.显示视频流这里用到了一个库–SDL.ffplay使用的也是这个库,截图为证.
SDL简介在SDLWiKi页面上有SDL的详细介绍.大致总结一下:
跨平台,Windows,MacOSX,Linux,iOS,andAndroid.可访问控制语音,键盘,鼠标,手柄和显卡(通过openGL和Direct3D)主要用于视频播放软件,模拟器和游戏C语言写成,可供C++,C#,Python等使用开源,协议zlibSDL的使用SDL在各个平台下的安装请参考SDLWiKi
初始化SDL_Init(SDL_INIT_VIDEO);
参数说明如下:
/\nameSDLINITThesearetheflagswhichmaybepassedtoSDL_Init().Youshouldspecifythesubsystemswhichyouwillbeusinginyourapplication.//@{/#defineSDL_INIT_TIMER0x00000001u#defineSDL_INIT_AUDIO0x00000010u#defineSDL_INIT_VIDEO0x00000020u/<SDL_INIT_VIDEOimpliesSDL_INIT_EVENTS*/#defineSDL_INIT_JOYSTICK0x00000200u/<SDL_INIT_JOYSTICKimpliesSDL_INIT_EVENTS/#defineSDL_INIT_HAPTIC0x00001000u#defineSDL_INIT_GAMECONTROLLER0x00002000u/**<SDL_INIT_GAMECONTROLLERimpliesSDL_INIT_JOYSTICK/#defineSDL_INIT_EVENTS0x00004000u#defineSDL_INIT_NOPARACHUTE0x00100000u/*<compatibility;thisflagisignored./#defineSDL_INIT_EVERYTHING(\SDL_INIT_TIMER|SDL_INIT_AUDIO|SDL_INIT_VIDEO|SDL_INIT_EVENTS|\SDL_INIT_JOYSTICK|SDL_INIT_HAPTIC|SDL_INIT_GAMECONTROLLER)/@}/创建窗口,渲染器及纹理
screen=SDL_CreateWindow(“windowname”,SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,width,height,SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);sdlRenderer=SDL_CreateRenderer(screen,-1,0);//显示AVFramesdlTexture=SDL_CreateTexture(sdlRenderer,SDL_PIXELFORMAT_IYUV,SDL_TEXTUREACCESS_STREAMING,width,height);SDL_PIXELFORMAT_BGR24//显示cv::MatsdlTexture=SDL_CreateTexture(sdlRenderer,SDL_PIXELFORMAT_BGR24,SDL_TEXTUREACCESS_STREAMING,width,height);显示内容
//显示AVFrameSDL_display_frame(AVFrameframe){SDL_RectsdlRect;sdlRect.x=0;sdlRect.y=0;sdlRect.w=frame->width;sdlRect.h=frame->height;?SDL_UpdateYUVTexture(sdlTexture,&sdlRect,frame->data[0],frame->linesize[0],frame->data[1],frame->linesize[1],frame->data[2],frame->linesize[2]);SDL_RenderClear(sdlRenderer);SDL_RenderCopy(sdlRenderer,sdlTexture,NULL,&sdlRect);SDL_RenderPresent(sdlRenderer);}?//显示cv::MatSDL_display_frame(Mat&frame){SDL_RectsdlRect;Matdata=frame.clone();sdlRect.x=0;sdlRect.y=0;sdlRect.w=data.cols;sdlRect.h=data.rows;?SDL_UpdateTexture(sdlTexture,NULL,(void)data.data,data.step1());SDL_RenderClear(sdlRenderer);SDL_RenderCopy(sdlRenderer,sdlTexture,NULL,&sdlRect);SDL_RenderPresent(sdlRenderer);}处理事件
processEvent(){SDL_PollEvent(&event);switch(event.type){caseSDL_QUIT:SDL_Quit();exit(0);break;default:break;}}