SDL是 “Simple DirectMedia Layer”的缩写,它是一个开源的项目。其主要用于游戏开发中的多媒体处理,如视频渲染,音频播放,鼠标/键盘控制等操作。
并且它是一个跨平台的多媒体库。也就是说它对外接供了一套统一的接口,但在内部,它会根据不同平台调用不同的底层 API库。如在 Linux 系统下,它会使用 opengl 做渲染,而在 Window 下它会调用 D3D API进行渲染。
我之所以要介绍它,主要是因为我要在开发的多媒体播放器中使用它。
SDL的编译与安装
目前 SDL 分为 SDL1 和 SDL2 两个主要版本。这两上版本差异非常大,无法相兼容。不过SDL1已经基本过时,主流产品都在使用的 SDL2,所以我们这里也使用SDL2作为例子进行讲解。
- 下载SDL源码(https://www.libsdl.org/download-2.0.php)(需要梯子才行)
- 编译与安装
- 生成SDL的Makefile
configure --prefix=/usr/local
-
- 编译并安装
sudo make && make install
使用 SDL2 的其本流程
当我们通过源码编译并安装好 SDL2后,在我们的程序中使用 SDL2 就非常简单了,只要按照下面的步骤就可以绘制出一个窗口来。
- 添加SDL头文件
#include <SDL.h>
- 初始化SDL
- 创建窗口
- 销毁窗口
- 退出SDL
当然,上面的步骤只是一个最基本的使用 SDL 的步骤,如果想了解更多的 SDL 的内容,敬请待我后面的文章。
API详细介绍
下面我们详细介绍一下上面用到的几个SDL API。
- 初始化 SDL
flags | 说明 |
SDL_INIT_TIMER | timer subsystem |
SDL_INIT_AUDIO | audio subsystem |
SDL_INIT_VIDEO | video subsystem; automatically initializes the events subsystem |
SDL_INIT_EVENTS | events subsystem |
SDL_INIT_EVERYTHING | all of the above subsystems |
返回值:0, 成功。非0, 失败。
- 退出 SDL
void SDL_Quit(void)
打印日志
void SDL_Log(const char* fmt, ...)
- 它与 C 语言中的 printf 格式相同。
- 创建窗口
SDL_Window* SDL_CreateWindow(const char* title,int x,int y,int w,int h,Uint32 flags)
- title:窗口标题
- x,y,w,h:窗口坐标
- flag
flags | 说明 |
SDL_WINDOW_FULLSCREEN | fullscreen window |
SDL_WINDOW_FULLSCREEN_DESKTOP | fullscreen window at the current desktop resolution |
SDL_WINDOW_OPENGL | window usable with OpenGL context |
SDL_WINDOW_HIDDEN | window is not visible |
SDL_WINDOW_BORDERLESS | no window decoration |
SDL_WINDOW_RESIZABLE | window can be resized |
SDL_WINDOW_MINIMIZED | window is minimized |
SDL_WINDOW_MAXIMIZED | window is maximized |
SDL_WINDOW_SHOWN | show window |
销毁窗口
void SDL_DestroyWindow(SDL_Window* window)
例子
下面是一个完整的使用SDL创建窗口的例子,你可以在 linux/mac环境下执行它。
#include "SDL.h"
#include <stdio.h>int main(int argc, char* argv[]) {int flag = 1;SDL_Window *window; // Declare a pointerSDL_Init(SDL_INIT_VIDEO); // Initialize SDL2// Create an application window with the following settings:window = SDL_CreateWindow("An SDL2 window", // window titleSDL_WINDOWPOS_UNDEFINED, // initial x positionSDL_WINDOWPOS_UNDEFINED, // initial y position640, // width, in pixels480, // height, in pixelsSDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS// flags - see below);// Check that the window was successfully createdif (window == NULL) {// In the case that the window could not be made...printf("Could not create window: %s\n", SDL_GetError());return 1;}// The window is open: could enter program loop here (see SDL_PollEvent())SDL_Delay(3000); // Pause execution for 3000 milliseconds, for example// Close and destroy the windowSDL_DestroyWindow(window);// Clean upSDL_Quit();return 0;
}
你可以使用下面的命令在linux/mac上编译上面的程序。
gcc/clang -g -o sdl2_base 文件名.c `pkg-config --cflags --libs sdl2`
编译出的程序名为 sdl2_base,执行下面的命令就可能看到运行的结果:
./sdl2_base
需要注意的是,虽然上面的程序可以正常编译执行,但你会发现该程序创建的窗口并不能显示出来。我会在第二篇文章中介绍如何让窗口正常的显示出来
小结
通过本文的介绍大家是不是觉得使用 SDL 非常简单易用呢?当然也许有人不太喜欢 SDL,认为直接使用 opengl 更高效。
但你要知道,SDL不只是对图像渲染做了封装,它还对其它媒体API做了封装,如对音频处理的封装等。这些封装大大减少了我们的开发工作量。
从另一方面讲,SDL 是一款非常优秀有多媒体库,除了使用它,其实我们还可以通过对其源码的分析,从中学到很多使用底层API的技巧。尤其是想学习播放器开发的同学,更是应该学好 SDL,因为著名的 ffplay 就是用的 SDL 做视频和音频的最终渲染与播放的。
最后,希望本文能帮你进行到 SDL 的世界。
粉丝福利, 免费领取C++音视频学习资料包+学习路线大纲、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓