QT 6.6.0 + SDL2 + SDL2_mixer实现音频播放器(改进)

B站视频讲解

GitHub源码下载地址

目录

实现思路

问题答疑1:为什么通过Mix_GetMusicPosition时刻获取播放音频的进度时,需要在while循环中使用SDL_PollEvent(&e)函数才能保证程序正常运行?


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音频格式的播放(过程详解)
QT 6.6.0 中SDL2库的基本使用以及利用SDL2库创建的界面实现音频播放(过程详解)
QT 6.6.0 中基于SDL2,SDL2_ttf,SDL2_image,SDL2_mixer实现音频播放器(改进版)

        上一篇博文利用基于SDL2,SDL2_ttf,SDL2_image,SDL2_mixer实现音频播放器,可以看到上次我们实现不仅仅是加载WAV格式的音频文件,还可以加载MP3等格式的音频文件呢,因此本文主要是QT 6.6.0 + SDL2 + SDL2_mixer继续改进音频播放器,建议读者先去看前面几篇篇博文的内容,然后来看本文也需要会更好理解。

        从最初使用QT中mediamulti的模块实现了一个简单的额音频播放器,到现在使用相关的SDL库实现了音频播放器,然后再反过来将QT 6.6.0和SDL2_mixer + SDL2进一步结合得到更加晚上的音频播放器,整个过程都是清晰和比较完整的,我相信坚持到这里的小伙伴一定有了不少的收获,也感谢大家的观看。

        现在来绘制一下已经实现了的音频播放器案例的学习路线(后期的学习计算未给出):

实现思路

  1. 初始化SDL2以及SDL2_mixer子系统,加载CSS文件渲染界面控件;

  1. 选择音频文件并加载音频文件;

  1. 点击播放,暂停播放,快进和后退,重置播放,静音播放(播放时间进度显示);音量调整;(仅仅只是列举出了核心部分)

  1. 显示播放列表;任意选择播放列表中的音频文件进行播放;

  1. 关闭程序并释放申请的资源和关闭音频设备。

问题答疑1:为什么通过Mix_GetMusicPosition时刻获取播放音频的进度时,需要在while循环中使用SDL_PollEvent(&e)函数才能保证程序正常运行?

  1. 事件处理:SDL 是基于事件驱动的框架。SDL_PollEvent(&e) 用于处理事件,比如窗口关闭、鼠标点击等。如果不调用该函数来处理事件,SDL 的事件队列可能会阻塞或者导致程序没有机会处理用户输入或其他系统事件。因此这可能导致程序在某些情况下不响应。

  2. 避免主线程阻塞:如果程序在一个循环中只进行音频播放,而不处理任何事件,可能会导致主线程被阻塞。通过调用 SDL_PollEvent(),能够确保主线程仍然能够处理中断、刷新UI等操作,在大多数情况下保持程序的响应性。

  3. 时间同步:在 while 循环中,通常会有一个延时(如使用 SDL_Delay(),但是我们整个程序中并没有使用),以控制检查音频进度的频率。这期间调用 SDL_PollEvent() 可以确保程序在空闲时间仍然能处理中断并执行其他任务,而不会消耗过多的 CPU 资源。

注:其实关于这个SDL_PollEvent(&e) 的使用之前的程序实现中也有,只不过是没有做出解释,看到这里大家应该能够大致明白为什么要这么做了。

QT 6.6.0 + SDL2_mixer实现音频播放器

mp3音乐音频文件下载地址

<think>我们被要求回答:SDL2_ttf和SDL2_image是否可以同时使用以及是否存在库冲突风险。 根据引用[2]中提到,在同一个QT项目中同时使用了SDL2, SDL2_ttf, SDL2_image, SDL2_mixer实现音频播放器。这说明在同一个项目中同时使用SDL2_ttf和SDL2_image是可行的。 同时,从技术角度分析: 1. SDL2_ttf和SDL2_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_ttf和SDL2_image版本与SDL2核心库版本兼容。通常建议使用相同发布周期的版本(例如,SDL2_image-2.6.3与SDL2-2.26.3兼容)。 - **链接顺序**:在编译链接时,需要正确链接所有库。添加库的顺序一般不影响,但如果有间接依赖,需要按照依赖关系调整(通常是先链接高层库,再链接底层库)。例如: ``` gcc main.c -lSDL2_ttf -lSDL2_image -lSDL2 ``` 引用[2]的示例证明了在同一个项目中同时使用这两个库是可行的,而且没有提到冲突。因此,我们可以认为同时使用是安全的。 综上所述: 回答:SDL2_ttf和SDL2_image可以同时使用,不存在库冲突风险。但需要注意正确初始化和清理,以及确保版本兼容性。 最后,按照要求生成相关问题。 </think>SDL2_ttf 和 SDL2_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_ttf与SDL2_image可安全协同工作,通过遵循初始化/释放顺序和版本匹配规范,可构建稳定高效的多媒体应用[^2][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值