QMudiaPlayer(状态)

news2025/1/20 6:02:58

在音乐播放中介绍了QMediaPlayer的基本用法,在这里更深度的使用QMediaPlayer。

媒体播放器的当前媒体的状态:

QMediaPalyer::MediaStatus

会发射 mediaStatusChanged()信号

QMediaPlayer::UnknownMediaStatus无法确定介质的状态。
QMediaPlayer::NoMedia目前没有媒体。玩家处于停止状态
QMediaPlayer::LoadingMedia正在加载当前介质。玩家可以处于任何状态。
QMediaPlayer::LoadedMedia当前介质已加载。玩家处于停止状态
QMediaPlayer::StalledMedia由于缓冲不足或其他一些临时中断,当前媒体的播放已停止。玩家处于“播放状态”或暂停状态”。
QMediaPlayer::BufferingMedia播放器正在缓冲数据,但缓冲了足够的数据以供播放,以便在不久的将来继续播放。玩家处于“播放状态”或暂停状态”。
QMediaPlayer::BufferedMedia播放器已完全缓冲当前媒体。玩家处于“播放状态”或暂停”。
QMediaPlayer::EndOfMedia播放已到达当前媒体的末尾。玩家处于停止状态。
QMediaPlayer::InvalidMedia当前媒体无法播放。玩家处于停止状态。

错误状态:

QMediaPlayer::error

会发射error()信号

QMediaPlayer::NoError未发生错误。
QMediaPlayer::ResourceError无法解析媒体资源。
QMediaPlayer::FormatError媒体资源的格式不受(完全)支持。播放可能仍然可以,但没有音频或视频组件。
QMediaPlayer::NetworkError发生网络错误。
QMediaPlayer::AccessDeniedError没有播放媒体资源的适当权限。
QMediaPlayer::ServiceMissingError找不到有效的播放服务,无法继续播放。

媒体播放器的当前状态:

QMediaPlayer::State

会发射 stateChanged()信号

QMediaPalyer::StopedState停止状态
QMediaPalyer::PlayingState播放状态
QMediaPalyer::PauseState暂停状态

 输出各种状态:

QMediaPlayer *player=new QMediaPlayer(this);
    //状态的显示
    connect(player,&QMediaPlayer::stateChanged,[=]()
    {
        switch(player->state())
        {
            case QMediaPlayer::StoppedState:
                ui->label->setText("停止状态");
                break;
            case QMediaPlayer::PlayingState:
                ui->label->setText("播放状态");
                break;
            case QMediaPlayer::PausedState:
                ui->label->setText("暂停状态");
                break;
            default:
            break;
        }
    });
    //媒体设备状态
    connect(player,&QMediaPlayer::mediaStatusChanged,[=]()
    {
        switch(player->mediaStatus())
        {
            case QMediaPlayer::UnknownMediaStatus:
                ui->label_2->setText("媒体未知状况");
                break;
            case QMediaPlayer::NoMedia:
                ui->label_2->setText("没有媒体文件");
                break;
            case QMediaPlayer::BufferedMedia:
                ui->label_2->setText("缓冲媒体文件完成");
                break;
            case QMediaPlayer::BufferingMedia:
                ui->label_2->setText("正在缓冲媒体文件");
                break;
            case QMediaPlayer::LoadingMedia:
                ui->label_2->setText("正在加载媒体");
                break;
            case QMediaPlayer::StalledMedia:
                ui->label_2->setText("播放停滞");
                break;
            case QMediaPlayer::EndOfMedia:
                ui->label_2->setText("播放结束");
            break;
            default:
            break;
        }
    });
    //错误
    //需要转换为函数指针
    void(QMediaPlayer::*p1)(QMediaPlayer::Error)=&QMediaPlayer::error;
    connect(player,p1,[=]()
    {
        switch(player->error())
        {
            case QMediaPlayer::NoError:
                ui->label_3->setText("没有错误");
                break;
            case QMediaPlayer::ResourceError:
                ui->label_3->setText("媒体资源无法解析");
                break;
            case QMediaPlayer::FormatError:
                ui->label_3->setText("不支持该媒体格式");
                break;
            case QMediaPlayer::NetworkError:
                ui->label_3->setText("网络问题");
                break;
            case QMediaPlayer::AccessDeniedError:
                ui->label_3->setText("没有播放权限");
                break;
            case QMediaPlayer::ServiceMissingError:
                ui->label_3->setText("没有有效的服务");
                break;
            default:
            break;
        }
    });

获取媒体元数据:

QMediaPlayer使用metaData()函数获取媒体的元数据

  • 元素据可用时会发射metaDataAvailableChanged()信号
  • 使用时必须用绝对路径,相对路径无效
  • 点击链接可以查看可以获取的属性QMediaMetaData Namespace |Qt多媒体 5.15.11
    player=new QMediaPlayer(this);
    player->setMedia(QUrl::fromLocalFile("F:/music/That Girl - Olly Murs.mp3"));
    player->play();
    connect(player,&QMediaPlayer::metaDataAvailableChanged,[=]()
    {
        QString title=player->metaData("Title").toString().toUtf8().data();//获取标题
        QString author=player->metaData("Author").toString().toUtf8().data();//获取作者
        qDebug()<<title;
        qDebug()<<author;

    });

 QMediaPlayList(播放媒体列表)

  • QMediaPlayList是播放媒体列表,但其实是一个QMediaContent对象列表
  • QMediaPlay可以通过setPlayList()来设置一个播放列表

常用函数:

insertMedia()插入项目
addMedia()添加项目
load()加载网络资源
clear()清空项目
currentIndex()获取当前项目在列表中的索引
currentMedia()获取当前项目的内容
Media()返回索引处的项目
moveMedia()移动
nextMedia()下一个项目
removeMedia()删除项目
save()保存
setPlaybackMode(QMediaPlaylist::PlaybackMode mode)设置播放模式

槽函数: 

shuffle()随机播放
next()下一个
setCurrentIndex()激活播放列表中的位置播放列表中的媒体内容位置

 QMediaPlaylist::PlaybackMode:

QMediaPlaylist::CurrentItemOnce当前项目仅播放一次。
QMediaPlaylist::CurrentItemInLoop循环播放当前项目
QMediaPlaylist::Sequential播放从当前开始,在每个连续的项目之间移动,直到到达最后一个项目,然后停止。当最后一个项目当前正在播放时,下一个项目是空项目。
QMediaPlaylist::Loop在最后一个项目播放完毕后,播放将在第一个项目重新开始
QMediaPlaylist::Random以随机顺序播放项目

 QMediaPlaylist::error

QMediaPlaylist::NoError没有错误
QMediaPlaylist::FormatError格式错误
QMediaPlaylist::FormatNotSupportedError格式不受支持
QMediaPlaylist::NetworkError网络错误
QMediaPlaylist::AccessDeniedError访问被拒绝错误

例子:创建一个可以显示歌曲列表的播放器,可以开始,暂停,停止,随机播放,下一首

在ui界面中添加如下控件:

一个QListWidget

一个Label 边框为Box

五个QPushButton

 在pro文件中添加:

QT       += multimedia

在widget.h文件中添加以下头文件:

#include<QMediaPlayer>
#include<QMediaPlaylist>
#include<QDebug>
#include<QTime>

再添加以下函数和成员:

    QMediaPlayer *player;//
    QMediaPlaylist *list;
    void changerIndex(int x);//列表的项目改变
    void changerIndex_list(int x);//播放列表的项目改变

widgat.cpp文件中的构造函数添加以下内容:

    player=new QMediaPlayer(this);
    list=new QMediaPlaylist(this);
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));//设置随机种子

    QStringList stringlist;//创建一个容器
    stringlist<<"F:/music/24 magic.mp3"<<"F:/music/Baby - Justin Bieber.mp3"<<"F:/music/bad guy - Billie Eilish.mp3";//导入音乐地址

    //在ListWidget中导入列表
    ui->listWidget->addItems(stringlist);
    for(auto i:stringlist)
    {
        list->addMedia(QUrl(i));//导入到播放列表
    }
    list->setCurrentIndex(0);//设置初始位置为0
    ui->listWidget->setCurrentRow(0);//设置初始位置为0
    player->setPlaylist(list);//添加播放列表
    ui->label->setText(player->currentMedia().canonicalUrl().toString());//设置路径

    //滑块功能的实现
    ui->horizontalSlider->setMinimum(0);//设置滑块最小值
    connect(player,&QMediaPlayer::durationChanged,[=]()
    {
        ui->horizontalSlider->setMaximum(player->duration());//设置滑块的最大值
    });
    connect(player,&QMediaPlayer::positionChanged,[=]()
    {
        int p=player->position();
        ui->horizontalSlider->setValue(p);
    });
    //在这里未实现移动滑块,改变音乐位置。添加该功能时,音乐会短暂暂停,所以未给出相应的代码



    //开始按钮的实现
    connect(ui->pushButton,&QPushButton::clicked,player,&QMediaPlayer::play);
    //暂停按钮的实现
    connect(ui->pushButton_2,&QPushButton::clicked,player,&QMediaPlayer::pause);
    //停止按钮的实现
    connect(ui->pushButton_3,&QPushButton::clicked,player,&QMediaPlayer::stop);
    //点击左边列表换歌的实现
    connect(ui->listWidget,&QListWidget::currentRowChanged,this,&Widget::changerIndex);
    //随机播放的实现
    connect(ui->pushButton_4,&QPushButton::clicked,[=]()mutable
    {
        int x=qrand()%(list->mediaCount());//随机数
        qDebug()<<x;
        list->setCurrentIndex(x);
        changerIndex_list(x);
    });
    //下一首歌的实现
    connect(ui->pushButton_5,&QPushButton::clicked,[=]()mutable
    {
        int x=list->nextIndex();//获取下一首歌的索引
        if(x<0||x>=list->mediaCount())//当索引不合规时,不做操作
        {
            return;
        }
        list->setCurrentIndex(x);
        changerIndex_list(x);
    });

两个函数的实现:

void Widget::changerIndex(int x)//列表的项目改变
{
    list->setCurrentIndex(x);
    ui->label->setText(player->currentMedia().canonicalUrl().toString());//获取路径
}
void Widget::changerIndex_list(int x)//播放列表的项目改变
{
    ui->listWidget->setCurrentRow(x);
    ui->label->setText(player->currentMedia().canonicalUrl().toString());//获取路径
}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/41009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库、计算机网络,操作系统刷题笔记3

数据库、计算机网络&#xff0c;操作系统刷题笔记3 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&…

精度和召回率的区别

先弄懂TP、FP、FN、TN T:ture 这件事是做对了 F:false 这件事做错了 N:negtive 负类 P:positive 正类TP:正确的把它判断成正例了 FP&#xff1a;错误的把它判断成正例了 FN&#xff1a;错误的把它判断成负例了 它本身是正例&#xff0c;把它判断成负例&#xff0c;为0个 TN…

[附源码]Python计算机毕业设计电影院订票系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

grafana 画富集多个指标 label 的表格

下午5点&#xff1a;老哥&#xff0c;今天把业务趋势图搞出来吧。 一、怎么画表格 我们的需要是做下面的视图&#xff0c;他是一个表格&#xff0c;而且有着多个数据源 添加图表 填入数据&#xff0c;展示原始图形 转换为 table 只显示最新一条 选择查询条件的 instant…

【前端】CSS

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录前言一、【基本语法规范】二、【CSS引入方式】三、【代码风格】四、【CSS选择器】1. 基础选择器2. 复合选择器五、【CSS常用元素属性】1. 【字体相关属性】2. 【文本属性】3. 【背景属性】4. 【圆角矩形】5. 【调试】…

C++回顾从入门开始

前言 新手搭配视频 回顾复习直接看 有问题请评论提出看到会及时修改 include、iostream、main() #include <iostream> using namespace std; int main() {cout << "Hello World!" << endl;return 0; } 解释 int表示函数的返回值类型&#xff0c…

GAMES202 Real-time Environment Mapping

文章目录前言Lecture5 Real-time Environment Mapping (prefiltering&#xff0c;split sum)补充&#xff1a;反射波瓣&#xff08;Lobe&#xff09;Lecture6 Real-time Environment Mapping (precomputed radiance transfer)Spherical Harmonicsprecomputed radiance transfer…

基于VggNet网络与ResNet神经网络的物体分类识别研究-附Matlab代码

⭕⭕ 目 录 ⭕⭕✳️ 一、引言✳️ 二、VGGNet网络与ResNet网络模型✳️ 2.1 VGG16 网络✳️ 2.2 ResNet-18网络✳️ 三、训练与实验结果✳️ 3.1 CIFA&#xff32;-10 数据集✳️ 3.2 ResNet-18训练与识别结果✳️ 3.3 VGG16 网络训练与识别结果✳️ 四、参考文献✳️ 五、Mat…

使用vue脚手架快速搭建vue 2项目

简单了解vue-cli 官网地址:https://cli.vuejs.org/zh/guide/browser-compatibility.html 前提 1.安装node(js代码的运行环境)、npm&#xff1b; 2.全局安装vue-cli; 命令创建项目 vue create hello-word 等待项目创建成功即可 开发工具打开刚刚创建的项目 项目结构如图…

RS232和RS485

1. 串口存在的问题 电器接口不统一。UART只是对信号的时序和格式进行定义&#xff0c;未定义接口的电气特性 Uart通信一般直接使用从处理器的TTL电平&#xff0c;但不同的处理器使用的电平存在差异&#xff0c;导致不通处理器一般不能使用UART相互连接 UART没有规定连接器件的连…

Css 3 动画

动画&#xff08;animation&#xff09;是css3中具有颠覆性的特征之一&#xff0c;可通过设置多个节点来精确控制一个或一组动画&#xff0c;常用来实现复杂的动画效果。 相比较过渡&#xff0c;动画可以实现更多变化&#xff0c;更多控制&#xff0c;连续自动播放等效果。 动…

【毕业设计-课程设计】-单片机电子密码锁设计

资源链接在文章最后,订阅查看获取全部内容及资料,如需可私信提供硬件。 一、 主要功能: 1.按键设置6位密码,输入密码若密码正确,则锁打开。显示open! 2.密码可以自己修改(6位密码),必须是锁打开时才能改密。为防止误操作,修改密码得输入两次。 3.若密码输入错误次数…

Metabase学习教程:仪表盘-1

BI仪表盘最佳实践 学习如何制作出色的商业智能仪表盘。 在Metabase中&#xff0c;仪表盘可以在网格中组织图表和文本卡片。关于基本知识&#xff0c;请查看我们的文档创建仪表盘。这篇文章介绍了有关什么是优秀的商业智能仪表盘的高级概念&#xff0c;并包括一些关于如何充分…

网络程序设计——重叠I/O模型

目录 1、重叠I/O &#xff08;1&#xff09;概念 &#xff08;2&#xff09;重叠数据结构WSAOVERLAPPED 2、重叠I/O的相关函数 &#xff08;1&#xff09;套接字创建 &#xff08;2&#xff09;发送数据函数 &#xff08;3&#xff09;两种获取传输数据数量的方法 3、…

17.指针的概念及其分类

内存 存储器 存储数据的器件 外部存储器 长期存放数据&#xff0c;掉电不丢失数据。 常见的外存数据&#xff1a;硬盘、ROM、U盘 内部存储器 暂时存储数据&#xff0c;掉电丢失 常见的内存数据&#xff1a;ram、DDR 物理内存 实实在在的存储设备。 虚拟内存 操作系统虚拟…

FFmpeg进阶: 截取视频生成gif动图

文章目录1.封装视频滤镜2.截取视频生成gif3.gif优化4.示例效果现在互联网上很多人都通过表情包来表达自己的情绪&#xff0c;常用的表情包很多都是视频文件的一部分。这里就介绍一下如何通过ffmpeg截取视频生成gif动图。其实原理很简单&#xff0c;首先我们seek到视频对应的位置…

Go sync.WaitGroup的学习

一.前言 二. 夯实基础 2.1 sync.WaitGroup是什么&#xff1f; Go语言中除了可以使用通道&#xff08;channel&#xff09;和互斥锁进行两个并发程序间的同步外&#xff0c;还可以使用等待组进行多个任务的同步&#xff0c;等待组可以保证在并发环境中完成指定数量的任务 在…

Spring Boot 中的Thymeleaf分页和排序示例

在上一篇文章中&#xff0c;我们已经知道如何构建Spring Boot Thymeleaf示例。今天&#xff0c;我将继续使用 Spring Data 和 Bootstrap 进行 Thymeleaf 分页和排序&#xff08;按列标题&#xff09;。 百里香叶分页和排序示例 假设我们在数据库中有这样的教程表&#xff1a;…

深入理解 Android 模块化里的资源冲突

翻译自 Understanding resource conflicts in Android ⚽ 前言 作为 Android 开发者&#xff0c;我们常常需要去管理非常多不同的资源文件&#xff0c;编译时这些资源文件会被统一地收集和整合到同一个包下面。根据官方的《Configure your build》文档介绍的构建过程可以总结这…

RFSoC应用笔记 - RF数据转换器 -22- API使用指南之配置DAC相关工作状态和中断相关函数使用

前言 本文完结后&#xff0c;关于RFSoC的配置的API函数部分就全部介绍完毕&#xff0c;后续有空将更新介绍简单的射频收发回环示例工程&#xff0c;不定时更新&#xff0c;敬请期待。 配置DAC相关工作状态 XRFdc_SetInterpolationFactor 函数原型 u32 XRFdc_SetInterpolat…