先给自己打个广告,本人的微信公众号:嵌入式Linux江湖,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题。
一 what
前面的几篇博文详细介绍了ffmpeg的开发环境搭建,本篇来看一下SDL环境的搭建,在搭建SDL环境之前,先思考一个问题:SDL到底是什么?
在回答这个问题之前,我们先思考:如何将一张图显示在屏幕上,不知道大家是有有做过LCD/LED屏幕显示的驱动程序。这个过程简单的分为几个部分:硬件屏幕,驱动程序,应用程序。SDL不直接关注硬件屏幕,而是关注每个平台下的屏幕驱动程序。比如windows下的DirectX,linux下的X11,以及android下的OPENGL ES,SDL通过将这三个平台(甚至更多平台)的屏幕驱动,封装成一套对外统一的API调用,让使用者可以不用关注具体某个平台,快速开发图像的绘制操作。SDL是一套成熟的跨平台渲染引擎。
二 details about SDL
2.1 SDL实现介绍
SDL,全称为Simple DirectMedia Layer,参考SDL官网,它为用户封装了各个平台底层的音视频操作,SDL是一套开放源代码的跨平台多媒体开发库,是使用C语言实现的,它提供了各种控制声音,图像等等的API接口函数,开发者可以使用相同或者相似的代码就可以开发出跨多个平台(Linux,Windows,MacOS)的应用软件。目前SDL多应用于开发游戏,模拟器,视频播放器等多媒体应用领域。以下这款游戏就是基于SDL开发的,可以在SDL官网上看到。
SDL项目框架是将不同操作系统的库再包装成相同的函数,在windows平台上其实是DirectX的再包装,旧版本使用的是DIrectX5,新版本使用的是DirectX7;而在X11平台上(包括Linux),SDL是使用Xlib库输出图像。
SDL是使用C语言编写的,但是它可以被几乎所有的编程语言所使用,包括:C++、perl、python、pascal等等。SDL采用GNU的LGPL第二版许可发行。该许可允许你自由地链接其动态链接库,甚至可以在商业软件中自由地使用。
虽然SDL被称为跨平台的DirectX,然而事实上SDL是定位成以精简的方式来完成基础的功能,它大幅度简化了控制图像,声音,输入输出等工作所需的代码。更高级的绘图功能或者音效功能则需搭配OpenGL和OpenAL等API来实现,另外它本身没有方便创建图形用户界面的函数。
2.2 SDL库和子系统
SDL库分为video,audio,CD_ROM,Joystich和Timer等若干子系统,除此之外,还有一些单独的官方扩充函数库,这些库由官网提供,共同组成了SDL的标准库。
SDL_image—支持时下流行的图像格式:BMP、PPM、XPM、 PCX、GIF、JPEG、PNG、TGA。
SDL_mixer—更多的声音输出函数以及更多的声音格式支持。
SDL_net—网络支持。
SDL_ttf—TrueType字体渲染支持。
SDL_rtf—简单的RTF渲染支持。
SDL将功能分成下列数个子系统(subsystem):
Video(图像)—图像控制以及线程(thread)和事件管理(event)。
Audio(声音)—声音控制
Joystick(摇杆)—游戏摇杆控制
CD-ROM(光盘驱动器)—光盘媒体控制
Window Management(视窗管理)-与视窗程序设计集成
Event(事件驱动)-处理事件驱动
2.3 SDL显示流程
SDL视频显示API介绍,这些API都可以在SDL的头文件找到定义,在这里不单独介绍,后期会单独列一篇文章来介绍。此时我们需要掌握的程度,就是根据上面的流程图调用SDL的API能够显示出yuv。
SDL_Init():初始化SDL系统
SDL_CreateWindow():创建窗口SDL_Window
SDL_CreateRenderer():创建渲染器SDL_Renderer
SDL_CreateTexture():创建纹理SDL_Texture
SDL_UpdateTexture():设置纹理的数据
SDL_RenderCopy():将纹理的数据拷贝给渲染器
SDL_RenderPresent():显示
SDL_Delay():工具函数,用于延时。
SDL_Quit():退出SDL系统
三 how
3.1 搭建windows平台visual studio的sdl开发环境
(1)下载源码
在官网上SDL官网下载sdl的源码
(2)创建一个sdl的visual studio工程
(3)拷贝include头文件
将sdl源码下面的include文件件拷贝一份,并重命名为SDL2_include(以便后面和ffmpeg的include文件夹做区分,当然也可以不做区分),然后将SDL2_include文件夹拷贝到visual studio项目中
(4)拷贝lib文件
将sdl源码中的三个lib文件拷贝到visual studio项目下的lib目录下
(5)拷贝dll文件
将sdl源码中的dll文件拷贝到visual studio项目下。
(6)修改visual studio的平台为x64
在我前期的debug中,发现如果在visual studio选择的x84平台,发现和添加的dll库文件不兼容,添加进来的dll库文件是x64平台的,所以我们需要修改visual studio的平台为x64。
(7)设置visual studio的头文件路劲
鼠标定位到解决方案出的test项目,右键选择“属性”,在弹出的对话框中,选择“C/C++”–>“常规”–>“附加包含目录”,输入“SDL2_include”,就是之前拷贝进来的SDL2_include目录,然后点击右下方的“应用”即可
(8)设置visual studio的库文件路劲
选择“链接器”–>“常规”–>“附加库目录”,输入“lib”,就是之前拷贝进来的lib目录,然后点击右下方的“应用”即可。
(9)设置visual studio的库文件依赖项
选择“链接器”–>“输入”–>“附加依赖项”,输入lib名,中间以英文字符";"隔开,就是之前拷贝进来lib目录下的.lib文件
实际上,步骤(2)~(9)基本上和ffmpeg的环境配置一模一样。
3.2 项目源码
环境配置好之后,就可以用SDL进行开发一个播放器了,这里给出一个SDL播放YUV视频的伪代码程序,需要源码的小伙伴,请关注公众号:嵌入式Linux江湖,回复sdl1即可获取源码。
int main(int argc, char* argv[])
{
SDL_init
SDL_CreateWindow
SDL_CreateRenderer
SDL_CreateTexture
SDL_CreateThread
while (1) {
SDL_WaitEvent
SDL_UpdateTexture
SDL_RenderClear
SDL_RenderCopy
SDL_RenderPresent
}
SDL_Quit;
}