Qt循环播放音乐后程序异常崩溃 (SIGSEGV错误)

2024-02-10 02:30

本文主要是介绍Qt循环播放音乐后程序异常崩溃 (SIGSEGV错误),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、出现问题

当我想为我的游戏添加背景音乐并让它循环播放时,我采取的方式是写一个bgmusic类(文章末尾我会给出没有问题的bgmusic的具体实现),它继承自QThread,并重写其中的run方法。至于这个类的使用,就是在需要播放背景音乐的地方直接new出一个对象,调用其start方法即可

普遍的做法(也是我刚开始出错的做法)如下代码所示:

QMediaPlaylist *playlist = new QMediaPlaylist();
playlist->addMedia(QUrl("qrc:/res/bg-Music.mp3")); // 请关注这里,只添加了一个音频
playlist->setPlaybackMode(QMediaPlaylist::Loop);
playerlist->setCurrentIndex(0);
QMediaPlayer *music = new QMediaPlayer();
music->setPlaylist(playlist);
music->play();

但如果直接这样写的话,当程序播放完背景音乐后,程序便会异常崩溃

小Tips:请关注资源的路径写法 ,如下图所示。

在这里插入图片描述


二、分析问题

经过调试,发现是程序出现段错误,被操作系统异常终止。这个错误是程序中经常出现的一个错误,程序访问了不该访问的地址。
那么,接下来,看qt的官方文档:
在这里插入图片描述
setMedia 函数会立即返回,不会等待媒体加载完毕。崩溃的原因应该就是有时加载快,完成了播放正常,有时加载慢未完成,播放就崩溃。


三、解决问题

3.1 针对上述普遍的做法的解决方案

保证QMediaPlaylist对象中添加了多于1个的音频对象
更改后的代码如下:

QMediaPlaylist *playlist = new QMediaPlaylist();
playlist->addMedia(QUrl("qrc:/res/bg-Music.mp3"));
playlist->addMedia(QUrl("qrc:/res/bg-Music.mp3")); // 新增加的
playlist->setPlaybackMode(QMediaPlaylist::Loop);
playerlist->setCurrentIndex(0);
QMediaPlayer *music = new QMediaPlayer();
music->setPlaylist(playlist);
music->play();

3.2针对于不使用QMediaPlaylist,而只是用QMediaPlayer对象实现循环播放的解决方案

要在你写的类中增加一个槽函数去监听QMediaPlayer::mediaStatusChanged信号


四、具体代码

需要说明的是,我将两种解决方案都写在了同一份代码中,并采用的是方案一,代码中我将方案二注释掉了,读者可以根据需要自行选择。

bgmusic.h

#ifndef BGMUSIC_H
#define BGMUSIC_H#include <QThread>
#include <QMediaPlayer>
#include <QMediaPlaylist>class bgmusic : public QThread
{Q_OBJECTvoid run() override;
public:bgmusic();private:QMediaPlayer* player;QMediaPlaylist* playerList;void initStatus(QMediaPlayer::MediaStatus status); // 槽函数 监听QMediaPlayer::mediaStatusChanged信号
};#endif // BGMUSIC_H

bgmusic.cpp

#include "bgmusic.h"bgmusic::bgmusic()
{playerList = new QMediaPlaylist();player = new QMediaPlayer();playerList->addMedia(QUrl("qrc:/res/LevelWinSound.wav"));playerList->addMedia(QUrl("qrc:/res/TapButtonSound.wav")); // 方法一、保证有两个音频(可以相同)被添加playerList->setPlaybackMode(QMediaPlaylist::Loop);playerList->setCurrentIndex(0);player->setPlaylist(playerList);player->setVolume(100);// connect(player, &QMediaPlayer::mediaStatusChanged,this,&bgmusic::initStatus);// 方法二 槽函数 监听QMediaPlayer::mediaStatusChanged信号   进行连接
}void bgmusic::run() {player->play();
}void bgmusic::initStatus(QMediaPlayer::MediaStatus status){if(status == QMediaPlayer::EndOfMedia){// player->setPosition(0);// player->play();}
}

这篇关于Qt循环播放音乐后程序异常崩溃 (SIGSEGV错误)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/695919

相关文章

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

Java中的for循环高级用法

《Java中的for循环高级用法》本文系统解析Java中传统、增强型for循环、StreamAPI及并行流的实现原理与性能差异,并通过大量代码示例展示实际开发中的最佳实践,感兴趣的朋友一起看看吧... 目录前言一、基础篇:传统for循环1.1 标准语法结构1.2 典型应用场景二、进阶篇:增强型for循环2.

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是