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

相关文章

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

将Java程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4