Qt5.15.2 QMediaPlayer循环播放不存在文件触发栈溢出异常如何解决
问题解答
关于异常捕获
Qt Multimedia模块的公开接口默认不会抛出标准C++异常,你遇到的栈溢出属于Windows 7环境下Qt 5.15.2的底层实现bug:当QMediaPlaylist设置为Loop模式且加载了无效媒体时,底层会反复重试加载无效资源陷入递归调用,最终触发栈溢出,这类底层错误无法通过常规try/catch捕获。
规避方案
方案1:增加前置文件存在性校验
这是成本最低的修复方式,在将媒体加入播放列表前先判断文件是否存在,从根源上避免加载无效资源:
QString mediaPath = "not_exist"; // 前置校验文件存在性 if (!QFile::exists(mediaPath)) { qWarning() << "指定媒体文件不存在,无法加载"; // 按需添加错误提示逻辑 return; } playlist->addMedia(QUrl::fromLocalFile(mediaPath)); playlist->setPlaybackMode(QMediaPlaylist::Loop); QMediaPlayer *music = new QMediaPlayer(); music->setPlaylist(playlist); music->play();
方案2:手动实现循环播放逻辑,绕过QMediaPlaylist的Loop模式
如果不想依赖QMediaPlaylist的循环逻辑,可以监听QMediaPlayer的播放结束信号自己实现循环,同时可以增加运行时的文件校验,避免运行过程中文件被删除触发同样的问题:
QMediaPlayer *music = new QMediaPlayer(); QString mediaPath = "your_audio_path"; if (!QFile::exists(mediaPath)) { qWarning() << "媒体文件不存在"; return; } music->setMedia(QUrl::fromLocalFile(mediaPath)); // 绑定播放状态变更信号,实现循环逻辑 connect(music, &QMediaPlayer::mediaStatusChanged, this, [=](QMediaPlayer::MediaStatus status) { if (status == QMediaPlayer::EndOfMedia) { // 每次循环前二次校验文件存在性 if (QFile::exists(mediaPath)) { music->setPosition(0); music->play(); } else { qWarning() << "媒体文件已被删除,停止循环"; } } }); music->play();
内容的提问来源于stack exchange,提问作者klynxe
相关产品推荐
相关产品推荐

