强大无比的嵌入式多媒体开发神器:SDL2

article/2025/10/12 0:14:23

SDL 是什么?

SDL(Simple DirectMedia Layer)是一套开源的跨平台多媒体开发库,使用 C 语言写成。

它提供了绘制图像、播放声音、获取键盘输入等相关的 API,大大降低多媒体应用开发难度的同时,也让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。

多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。

SDL 有两个常见版本:SDL1.2 和 SDL2.x。在不支持 OpenGL ES2 的嵌入式平台上,只能使用 SDL1.2,SDL2.x 依赖 OpengGL ES2。

官网

https://sourceforge.net/projects/mjpg-streamer/

Github

https://github.com/libsdl-org/SDL


示例:显示图片

void main(){SDL_Window *window = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN);/* Create a Render */SDL_Renderer *render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);/* Load bitmap image */SDL_Surface *bmp = SDL_LoadBMP("./hello.bmp");SDL_Texture *texture = SDL_CreateTextureFromSurface(render, bmp);SDL_FreeSurface(bmp);SDL_RenderClear(render);SDL_RenderCopy(render, texture, NULL, NULL); // Copy the texture into renderSDL_RenderPresent(render); // Show render on window/* Free all objects*/[...]/* Quit program */SDL_Quit();return 0;
}

要快速上手 SDL,需要理解下面几个核心结构体和 API:

对于这些结构体,网上有各种各样的解释,但是都比较晦涩生硬,下面是我理解。

SDL_Window

想要显示东西,首先要有一个容器来容纳程序绘制的内容。

这个容器,最常见的就是窗口。

对于 PC 机,一般都会有窗口的支持。

但是即便是没有桌面环境的嵌入式平台,SDL_Window 也能兼容,只不过这个窗口没有最小化、最大化、拉伸的功能罢了,都是纯软件的概念,和硬件无关。

一般只需要关注 x、y、w、h 4个成员变量,即窗口的原点坐标和宽高。

通过 SDL_CreateWindow() 可以创建一个窗口。

SDL_Renderer

当描述用 GPU 来进行绘画图像时,就用术语渲染。

渲染器,你可以认为就是画笔。

现实世界里,你可以用圆珠笔来画画,也可以用铅笔来画画,所以渲染器也有多种类型,不同的渲染器就好比不同的笔。

SDL2 支持的渲染器:

7f143b5a7a9cef0462a0a0b94f472e7c.png

在嵌入式平台上,一般就只支持 OpengGL ES2 这种渲染器类型。

通过 SDL_CreateRenderer() 可以创建一个渲染器。

SDL_Texture

渲染器有了之后,就轮到要渲染的内容了。

Texture 负责描述渲染的内容。

既然是要显示图像,自然需要像素数据、像素格式、宽度、高度、渲染器类型等信息,这些都包含在 Texture 里。

最常见的情况:
调用SDL_CreateTextureFromSurface() 基于某个 Surface 来创建 Texture。Surface 用于描述像素数据。

SDL_RenderCopy()/SDL_RenderPresent()

我们把内存想象成是一块备用的画布,而此时屏幕正在显示另一块画布的内容。

你可以不断地调用 SDL_RenderCopy() 来往备用画布上画东西,无论你画多少次都可以。

只有当你调用 SDL_RenderPresent() 时,备用画布才会真正第切换到屏幕上。


实践应用

在上一篇文章《五分钟拆解流媒体入门项目 MJPG-Streamer》里,我介绍了 MJPG-Streamer 将每一种输入或输出是都抽象为一个插件。

例如采集摄像头的功能被实现为一个输入插件, 而 http 视频流被实现为一个输出插件。

我们可以为 MJPG-Streamer 添加一个 SDL2 输出插件。

这样就可以在本地显示屏上查看到浏览器的图像了,效果如下:

$ ./mjpg_streamer -i "input_uvc.so /dev/video0 -r 640x480 -f 30" -o "output_sdl2.so"

da587d3bf6a4ee9a1c7b6d42e4678cab.png

点击查看大图

代码很简单,核心内容就是使用 SDL2 显示 JPG 图片,代码就不贴了。


内部实现

最后,我想简单地看一下 SDL2 的内部实现。

以最重要的显示功能为例。

SDL2 将底层显示封装为 video driver:

0317b9765ad8b1f3d652339dfb3bd709.png

我们比较熟悉的包括:Wayland、X11、KMSDRM。

以 KMSDRM 这个 video driver 为例,为了支持这个显示驱动,需要实现这么多 API:

cd7b7dcba24ef6ee579846239c609150.png

如果你想了解 SDL2 是如何实现屏幕显示的,可以尝试阅读这些 API。

总结

SDL2 的功能非常丰富,代码质量也很高。

如果你想在板子进行多媒体开发,例如显示一些东西,又不想用 Qt 那么庞大的图形框架,可以考虑基于 SDL2 进行开发。

—— The End ——

推荐阅读:

专辑 | Linux 系统编程

专辑 | Linux 驱动开发

专辑 | Linux 内核品读

专辑 | 每天一点 C

专辑 | 开源软件

专辑 | Qt 入门


http://chatgpt.dhexx.cn/article/Gjj49r5s.shtml

相关文章

SDL2 简明教程(五):OpenGL 绘制

系列文章目录 SDL2 简明教程(一):使用 Cmake 和 Conan 构建 SDL2 编程环境 SDL2 简明教程(二):创建一个空的窗口 SDL2 简明教程(三):显示图片 SDL2 简明教程&#xf…

SDL —— SDL2及API简介

SDL2框架 SDL( Simple DirectMedia Layer) 是一套开放源代码的跨平台多媒体开发库, 使用 C 语 言写成。 SDL 提供了数种控制图像、 声音、 输出入的函数, 让开发者只要用相同或是相似的 代码就可以开发出跨多个平台( L…

SDL2学习笔记(一):SDL2初步

一、Windows系统下的安装 MinGW ①安装MinGW并配置好环境变量; ②官网下载SDL for MinGW; ③将解压文件中的 .\i686-w64-mingw32\include\SDL2 复制到 .\MinGW\include ; //有的设备需要用x86_64-w64-mingw32中的文件,下同 ④将解…

ISCC2021—ISCC客服一号冲冲冲(二)

ISCC客服一号冲冲冲(二) 呦,又见面了,狗子 打开链接,发现登录接口似乎是个图片截了一块啊,把图片下载下来,lsp隐写发现源代码,同时php弱比较登录页面 (都看到这里啦&a…

ISCC2021——web部分

练武 ISCC客服冲冲冲(一) 该题目需要左边的客服票数高于右边的 我会的就两种方法,毕竟是废物嘛,允许 1、 把左右按钮换一下 然后就 2、在控制台输入 回车,走你 你涨啊,涨啊,接着涨啊…没吃…

ISCC,Misc:隐秘的信息

解码得到解压密码 解压出一张图,低位时头部显示有一串字符被 f f f f f 包裹,将可疑的字符单独拿出来 由于单个字符可能是由二进制错位导致的 fffffa4a9a1a1bd9 9b7a1a9ba34b127a 0b8abbc20b7a2b7a 2b524b43e9f8007f fffc7e3fe00fff00 71fffffffffffff…

ISCC理论题小解

B 域、工作组和家庭组表示在网络中组织计算机的不同方法。它们之间的主要区别是对网络中的计算机和其他资源的管理方式。 网络中运行 Windows 的计算机必须属于某个工作组或某个域。家庭网络中运行 Windows 的计算机也可以属于某个家庭组,但这不是必需的。 家庭网络…

ISCC web4

ISCC web4 打开网页看到: 代码审计。。。。。。。。。 一开始以为是sha256解密,结果半天搞不出来 后来才知道parse_url函数存在变量覆盖漏洞 因为要存在action参数,传入actionauth key也要传入key0 由于key是要被sha256加密的 传入一个has…

ISCC2022 擂台misc

文章目录 666扫!弱雪真扫黑暗森林PNGstego这是压缩包吗?小 数 学习了 P.S:抬杠就是你对 666 考查知识点:伪加密、猜谜的steghide弱口令爆破、流量分析、gif帧、键盘密码、AES 下载下来是一个压缩包,但是图片显示需要密码&#xf…

ISCC-2022 部分wp

目录 Web冬奥会解题步骤详细描述解题收获 Easy_sql解题步骤详细描述解题收获 Pop2022解题步骤详细描述解题收获 findme解题步骤详细描述 爱国敬业好青年-2解题步骤详细描述解题收获 这是一道代码审计题 Misc单板小将苏翊鸣解题步骤详细描述解题收获 2022冬奥会解题步骤详细描述…

ISCC——部分题wp

练武场 WEB: ISCC客服冲冲冲(一) 知识点: js解密 解题思路: 1.打开后出现投票的页面 2.查看源码 发现可疑的function.js 3.function.js,js加密 var _0xodqjsjiami.com.v6,_0x3e40[_0xodq,\x77\x35\x4c\x…

ISCC ISCC客服一号冲冲冲(二)

这个题其实是转自Bugku的Login4 (CBC字节翻转攻击) 题目有提示密码就是web1 的flag 然后登入 这里有回显,然后我们换一下 下面cookie里的iv和cipher看着就像CBC加密的方式 利用的就是CBC解密的特点:前16个密文字符用来解密接下来的一组16个密文&#…

ISCC 2021 SSTI

文章目录 FUZZ测试:了解一下SSTI常用的语句格式:说一下构造思路:构造题外话:(反转结果字符串) 再ISCC中遇到了一道SSTI的题目,拿来练练手,题目难度的化,相对于普遍的过滤…

[ISCC 2021]部分wp

文章目录 海市蜃楼-1Retrieve the passcode我的折扣是多少小明的表情包Hack the Victim美人计李华的红包小明的宠物兔ISCC客服冲冲冲(一)这是啥Web01登录tornadowhich is the true isccISCC客服一号冲冲冲(二)Explore Rubylovely …

ISCC-WP

练武wp: MISC 2022冬奥会 图片在kali中,没有显示缩略图,其宽高很可能被修改过 修改图片的长之后,下面出些一些&#x编码,这是html实体编码。进行unicode解码得到 冰敦敦的小伙伴经常被人冷落,你知道他的原型是什…

ISCC认证的申请条件是什么?

ISCC国际可持续发展和碳认证介绍 ISCC - International Sustainability & Carbon Certification 国际可持续发展和碳认证,是满足欧盟《可再生能源指令》(2009/28/ECRED)的第一个标准,于2010年开始实施,现已发展成为…

ISCC 2022 部分

目录 web冬奥会popfindme爱国敬业好青年-2Easy-SQL让我康康&#xff01;这是一道代码审计题 MISC隐秘的信息真相只有一个单板小将苏翊鸣藏在星空中的诗-1藏在星空中的诗-22022冬奥会降维打击 REVERSEGetTheTableBobs Code web 冬奥会 <?phpshow_source(__FILE__);$Step1F…

ISCC 2022 wp

目录 解题步骤及过程&#xff1a; 练武题WP&#xff1a; Web: 冬奥会&#xff1a; 爱国敬业好青年-2&#xff1a; Pop2022&#xff1a; 这是一道代码审计题&#xff1a; Easy-SQL&#xff1a; Findme&#xff1a; 让我康康!&#xff1a; misc&#xff1a; 2022冬奥…

ISCC-2021

文章目录 一、ISCC客服冲冲冲&#xff08;一&#xff09;二、这是啥三、Web01四、ISCC客服一号冲冲冲&#xff08;二&#xff09;五、登录六、which is the true iscc 一、ISCC客服冲冲冲&#xff08;一&#xff09; 可以下载一个点击器&#xff0c;或者直接F12在html中改&…

ISCC 2021 WP

文章目录 MISC李华的红包Retrieve the passcode海市蜃楼-1美人计我的折扣是多少区块链Hack the Victim检查一下小明的宠物兔变异的SM2 WEBISCC客服冲冲冲&#xff08;一&#xff09;这是啥Web01ISCC客服一号冲冲冲&#xff08;二&#xff09;登录which is the true iscclovely …