QT 6.6.0 中SDL2库的基本使用以及利用SDL2库创建的界面实现音频播放(过程详解)

B站视频讲解

键盘事件案例GitHub源码

SDL2实现音频播放GitHub源码

目录

实现思路

一个键盘事件案例基础 

问题1:SDL_CreateWindowAndRenderer和SDL_CreateWindow的区别?

SDL2_ttf和SDL2_image库使用方式

问题2:SDL_CreateTextureFromSurface的作用?(网上查询结果)

问题三:从网上下载的图像,加载图像的过程报错误,

SDL2实现的音频播放


QT初学案例教程
QT6.6.0实现打开电脑摄像头或其他的外接摄像头(实现拍照功能)
QT6.6.0实现简单的录音器
QT6.6.0实现一个简单的视频和音频播放器
QT6.6.0实现简单的视频录制(包含语音录制)器
QT6.6.0关于QMediaMetaData功能以及列子说明使用方法
QT6.6.0实现QtCamera功能(拍照,录像以及图像和视频的相关配置)
T6.6.0实现更好的视频播放器(前期改进)
QT6.6.0实现图表如饼图,柱状图,散点图以及盒图等的基本使用
QT6.6.0实现客户端Socket编程以及socket测试软件通信
QT6.6.0 实现服务端Server和多个客户端Client通信以及socket测试软件通信
QT6.6.0 实现QNetworkAccessManager的基本应用以及其拓展使用
QT6.6.0 实现服务端Server和多个客户端Client互相发送文件信息
QT6.6.0和QT6.0以下的版本实现FTP文件上传和下载(过程详解)
QT6.6.0实现QNetworkInterface网络接口,QHostAddress网络地址IP以及域名解析等相关信息查询。
QT6.6.0基于QTcpSocket和QTcpServer实现多个客户端群聊
QT6.6.0实现基于UDP协议的简单通信(过程详解)
QT 6.6.0基于UDP协议实现广播和多播机制(过程详解)
QT 6.6.0基于UDP协议实现群聊功能(过程详解)
QT 6.6.0中OpenCV两种环境的配置方法以及基本使用例子
QT 6.6.0 中基于OpenCV的图像变换以及基于鼠标点击移动事件的图像绘制
QT 6.6.0 基于OpenCV对图像进行旋转,缩放和裁剪等操作
QT 6.6.0 基于OpenCV实现图像风格的改变(add和subtract)
PyTorch 训练之后的网络模型.pth转.onnx文件并对图像进行预测
QT 6.6.0 基于OpenCV加载.pth模型文件转换之后的ONNX模型文件,并且实现图像分类
QT 6.6.0 基于OpenCV中的cv::dnn::ClassificationModel实现图像分类
yolov5目标检测和QT 6.6.0 基于OpenCV加载yolov5.onnx模型文件实现目标检测
FCN图像分割和QT 6.6.0 加载分割FCN_Resnet50.ONNX模型文件进行图像分割(过程详解)
QT 6.6.0 中基于SDL2库实现WAV音频格式的播放(过程详解)

上一篇博文主要是讲解了SDL2库播放音频 ,本文才进入主题,主要是对SDL2库的基本使用,了解了SDL2的使用基础上之后,后期对其进行拓展使用将会快速的上手,并且可以了解到SDL2的应用非常广泛。而且使用起来也比较灵活,在某些应用上和OpenCV有类似之处。

实现思路

  1. 创建窗口和渲染器,用于显示图像或者其他画面;
  2. 事件处理(比如按下鼠标键盘事件加载图像,显示图像,矩形等操作);
  3. 渲染器渲染图像,矩形等内容。
  4. 显示结果(SDL_RenderPresent)。

一个键盘事件案例基础 

问题1:SDL_CreateWindowAndRenderer和SDL_CreateWindow的区别?

SDL_CreateWindow

  • 只创建一个窗口。创建窗口后,如果需要进行渲染,开发者必须手动使用 SDL_CreateRenderer 来创建一个渲染器。

SDL_CreateWindowAndRenderer

  • 一次性创建一个窗口和与之关联的渲染器。这个函数同时创建了这两个对象,简化了窗口和渲染器的获取过程。

注:SDL_CreateWindow只是创建了一个窗口,如果要显示图像等内容的话,需要创建一个渲染器。

以下是一个键盘按下的响应案例:

https://github.com/KeepTryingTo/QT_Learning/tree/main/QtSDL_Application/QtSDL_KEYDOWN

SDL2实现一个简单的键盘按下事件


SDL2_ttf和SDL2_image库使用方式

① 由于需要渲染绘制文字,因此SDL2_ttf需要单独下载,关于SDL2_ttf库的使用方式和使用SDL2方式一样,下载链接:https://github.com/libsdl-org/SDL_ttf/releases

② 渲染图像也是一样的道理,下载编译好的库文件SDL2_image,然后加载库文件,下载链接:https://github.com/libsdl-org/SDL_image/releases

注:由于SDL2_ttf和SDL2_image库中的依赖库和头文件都很少,建议直接复制到之前配置的库路径下即可。

可以加载Windows中自带的字体:C:\\Windows\\Fonts\\Times New Roman.ttf

   

问题2:SDL_CreateTextureFromSurface的作用?(网上查询结果)
  • SDL_Surface 通常用于存储图像的像素数据和信息(如宽度、高度、格式等),而 SDL_Texture 是更高效的图像表示形式,适合在 GPU 上进行渲染。
  • 纹理 (SDL_Texture) 通常位于 GPU 内存中,能够比在 CPU 内存中的表面更高效地进行渲染。使用纹理来绘制图像可以显著提高绘制性能,尤其是在需要频繁更新屏幕内容的场景中。

绘制本文的SDL2_ttf库初始化:

绘制图像的SDL_image库初始化子系统:

 * - `IMG_INIT_JPG`
 * - `IMG_INIT_PNG`
 * - `IMG_INIT_TIF`
 * - `IMG_INIT_WEBP`
 * - `IMG_INIT_JXL`
 * - `IMG_INIT_AVIF`

PNG(便携式网络图形格式): 具有无损压缩、透明支持。
JPEG(联合图像专家组格式):适用于照片和复杂图像,采用有损压缩。
BMP(位图文件格式):      对于基本图像格式,通常没有压缩。
GIF(图形交换格式):      支持动图和透明色,但采用8位色彩。
TGA(TARGA格式):         支持图像的无损压缩和透明度。
WEBP(谷歌的图像格式):   支持无损和有损压缩。
问题三:从网上下载的图像,加载图像的过程报错误,

如果从网上下载的图像并且加载图像的过程中报以下错误的话,那么需要到libwebp动态库 下载libwebp源码,由于官方并没有提供编译好的源码,因此需要自己编译,关于编译源码的过程请看:https://mydreamambitious.blog.youkuaiyun.com/article/details/141427212 (加载本地相册的图像应该不会报这个错误)。  

   其次进入命令行对图像进行解码操作:dwebp [输入图像] -o [输出图像]

  

注:经过解码得到的output.jpg图像可以用于IMG_LoadTexture函数加载了,可能也许会有人问了,是不是在初始化IMG_Init的时候把IMG_INIT_JPG放在了最前面,不是的,读者可以尝试一下调换位置还是会报这个错误,主要还是因为直接从网上下载的图像编码格式可能存在问题,需要使用libwebp进行转换。

SDL2实现的音频播放

关于使用SDL2实现的音频播放界面代码,请看链接:https://github.com/KeepTryingTo/QT_Learning/tree/main/QtSDL_Application/QtSDL_AudioPlayer_v2

SDL2利用自带窗口实现音频播放

<think>我们被要求回答:SDL2_ttfSDL2_image是否可以同时使用以及是否存在冲突风险。 根据引用[2]中提到,在同一个QT项目中同时使用SDL2, SDL2_ttf, SDL2_image, SDL2_mixer来实现音频播放器。这说明在同一个项目中同时使用SDL2_ttfSDL2_image是可行的。 同时,从技术角度分析: 1. SDL2_ttfSDL2_image都是SDL2的扩展,它们都依赖于SDL2,但彼此之间没有直接的依赖关系。 2. 它们分别提供不同的功能: - SDL2_ttf:用于加载和渲染TrueType字体。 - SDL2_image:用于加载多种格式的图像(如PNG, JPEG等)。 3. 在同一个项目中同时使用这两个,只要分别正确初始化并使用,就不会有冲突。 但是需要注意以下几点以避免潜在问题: - **初始化顺序**:SDL2本身需要先初始化(通常使用`SDL_Init()`),然后分别初始化SDL2_image使用`IMG_Init()`)和SDL2_ttf使用`TTF_Init()`)。这些初始化函数返回成功与否,需要检查。 - **内存管理**:两个各自管理自己的资源,但都需要在程序退出前正确释放(使用`TTF_Quit()`和`IMG_Quit()`)。 - **版本兼容性**:确保使用SDL2_ttfSDL2_image版本与SDL2核心版本兼容。通常建议使用相同发布周期的版本(例如,SDL2_image-2.6.3与SDL2-2.26.3兼容)。 - **链接顺序**:在编译链接时,需要正确链接所有。添加的顺序一般不影响,但如果有间接依赖,需要按照依赖关系调整(通常是先链接高层,再链接底层)。例如: ``` gcc main.c -lSDL2_ttf -lSDL2_image -lSDL2 ``` 引用[2]的示例证明了在同一个项目中同时使用这两个是可行的,而且没有提到冲突。因此,我们可以认为同时使用是安全的。 综上所述: 回答:SDL2_ttfSDL2_image可以同时使用,不存在冲突风险。但需要注意正确初始化和清理,以及确保版本兼容性。 最后,按照要求生成相关问题。 </think>SDL2_ttfSDL2_image 可以安全地在同一项目中同时使用,不存在冲突风险。以下是关键分析和技术建议: ### 兼容性验证与技术依据 1. **功能独立性** - SDL2_ttf:专注于字体渲染(TrueType字体加载与文本绘制)[^1] - SDL2_image:处理图像格式解码(PNG/JPEG/BMP等)[^2] - 二者功能域无重叠,核心对象(`TTF_Font`与`SDL_Surface`/`SDL_Texture`)互不干扰 2. **协同工作实例** 引用[2]明确展示在QT 6.6.0项目中同时集成四个SDL2扩展: ```plaintext SDL2(核心) + SDL2_ttf(字体) + SDL2_image(图像) + SDL2_mixer(音频) ``` 实现完整的多媒体播放器,验证了间的兼容性[^2]。 ### 正确使用规范 1. **初始化顺序** 需严格遵循初始化序列以避免资源竞争: ```c SDL_Init(SDL_INIT_VIDEO); // 先初始化SDL2核心 IMG_Init(IMG_INIT_PNG | IMG_INIT_JPG); // 再初始化SDL2_image TTF_Init(); // 最后初始化SDL2_ttf ``` 2. **资源释放顺序** 退出时反向释放资源: ```c TTF_Quit(); // 先关闭字体引擎 IMG_Quit(); // 再关闭图像解码器 SDL_Quit(); // 最后关闭SDL2核心 ``` 3. **链接配置要点** 编译时需正确链接所有文件: ```makefile # Linux示例(参考引用[4]) LIBS = -lSDL2 -lSDL2_image -lSDL2_ttf -lfreetype -lpng # Windows MSVC配置(参考引用[1]) 附加依赖项 = SDL2.lib; SDL2_image.lib; SDL2_ttf.lib ``` ### 冲突规避建议 1. **版本一致性** - 使用相同主版本的SDL2核心(如全部基于SDL 2.26.x) - 验证扩展兼容性:SDL2_image 2.6.x ↔ SDL2_ttf 2.20.x 2. **内存管理** - 交叉使用纹理时需显式转换: ```c SDL_Surface* text_surface = TTF_RenderText_Blended(font, "Hello", color); SDL_Texture* text_texture = SDL_CreateTextureFromSurface(renderer, text_surface); // 字体→纹理 SDL_FreeSurface(text_surface); SDL_Surface* img_surface = IMG_Load("icon.png"); SDL_Texture* img_texture = SDL_CreateTextureFromSurface(renderer, img_surface); // 图像→纹理 SDL_FreeSurface(img_surface); ``` ### 典型应用场景 ```mermaid graph LR A[游戏UI系统] --> B[SDL2_ttf渲染文本] A --> C[SDL2_image加载图标] D[多媒体播放器] --> E[TTF显示歌词] D --> F[Image显示专辑封面] ``` 综上,SDL2_ttfSDL2_image可安全协同工作,通过遵循初始化/释放顺序和版本匹配规范,可构建稳定高效的多媒体应用[^2][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值