• QMudiaPlayer(状态)


    在音乐播放中介绍了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暂停状态

     输出各种状态:

    1. QMediaPlayer *player=new QMediaPlayer(this);
    2. //状态的显示
    3. connect(player,&QMediaPlayer::stateChanged,[=]()
    4. {
    5. switch(player->state())
    6. {
    7. case QMediaPlayer::StoppedState:
    8. ui->label->setText("停止状态");
    9. break;
    10. case QMediaPlayer::PlayingState:
    11. ui->label->setText("播放状态");
    12. break;
    13. case QMediaPlayer::PausedState:
    14. ui->label->setText("暂停状态");
    15. break;
    16. default:
    17. break;
    18. }
    19. });
    20. //媒体设备状态
    21. connect(player,&QMediaPlayer::mediaStatusChanged,[=]()
    22. {
    23. switch(player->mediaStatus())
    24. {
    25. case QMediaPlayer::UnknownMediaStatus:
    26. ui->label_2->setText("媒体未知状况");
    27. break;
    28. case QMediaPlayer::NoMedia:
    29. ui->label_2->setText("没有媒体文件");
    30. break;
    31. case QMediaPlayer::BufferedMedia:
    32. ui->label_2->setText("缓冲媒体文件完成");
    33. break;
    34. case QMediaPlayer::BufferingMedia:
    35. ui->label_2->setText("正在缓冲媒体文件");
    36. break;
    37. case QMediaPlayer::LoadingMedia:
    38. ui->label_2->setText("正在加载媒体");
    39. break;
    40. case QMediaPlayer::StalledMedia:
    41. ui->label_2->setText("播放停滞");
    42. break;
    43. case QMediaPlayer::EndOfMedia:
    44. ui->label_2->setText("播放结束");
    45. break;
    46. default:
    47. break;
    48. }
    49. });
    50. //错误
    51. //需要转换为函数指针
    52. void(QMediaPlayer::*p1)(QMediaPlayer::Error)=&QMediaPlayer::error;
    53. connect(player,p1,[=]()
    54. {
    55. switch(player->error())
    56. {
    57. case QMediaPlayer::NoError:
    58. ui->label_3->setText("没有错误");
    59. break;
    60. case QMediaPlayer::ResourceError:
    61. ui->label_3->setText("媒体资源无法解析");
    62. break;
    63. case QMediaPlayer::FormatError:
    64. ui->label_3->setText("不支持该媒体格式");
    65. break;
    66. case QMediaPlayer::NetworkError:
    67. ui->label_3->setText("网络问题");
    68. break;
    69. case QMediaPlayer::AccessDeniedError:
    70. ui->label_3->setText("没有播放权限");
    71. break;
    72. case QMediaPlayer::ServiceMissingError:
    73. ui->label_3->setText("没有有效的服务");
    74. break;
    75. default:
    76. break;
    77. }
    78. });

    获取媒体元数据:

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

    1. player=new QMediaPlayer(this);
    2. player->setMedia(QUrl::fromLocalFile("F:/music/That Girl - Olly Murs.mp3"));
    3. player->play();
    4. connect(player,&QMediaPlayer::metaDataAvailableChanged,[=]()
    5. {
    6. QString title=player->metaData("Title").toString().toUtf8().data();//获取标题
    7. QString author=player->metaData("Author").toString().toUtf8().data();//获取作者
    8. qDebug()<<title;
    9. qDebug()<<author;
    10. });

     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文件中添加以下头文件:

    1. #include
    2. #include
    3. #include
    4. #include

    再添加以下函数和成员:

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

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

    1. player=new QMediaPlayer(this);
    2. list=new QMediaPlaylist(this);
    3. qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));//设置随机种子
    4. QStringList stringlist;//创建一个容器
    5. stringlist<<"F:/music/24 magic.mp3"<<"F:/music/Baby - Justin Bieber.mp3"<<"F:/music/bad guy - Billie Eilish.mp3";//导入音乐地址
    6. //在ListWidget中导入列表
    7. ui->listWidget->addItems(stringlist);
    8. for(auto i:stringlist)
    9. {
    10. list->addMedia(QUrl(i));//导入到播放列表
    11. }
    12. list->setCurrentIndex(0);//设置初始位置为0
    13. ui->listWidget->setCurrentRow(0);//设置初始位置为0
    14. player->setPlaylist(list);//添加播放列表
    15. ui->label->setText(player->currentMedia().canonicalUrl().toString());//设置路径
    16. //滑块功能的实现
    17. ui->horizontalSlider->setMinimum(0);//设置滑块最小值
    18. connect(player,&QMediaPlayer::durationChanged,[=]()
    19. {
    20. ui->horizontalSlider->setMaximum(player->duration());//设置滑块的最大值
    21. });
    22. connect(player,&QMediaPlayer::positionChanged,[=]()
    23. {
    24. int p=player->position();
    25. ui->horizontalSlider->setValue(p);
    26. });
    27. //在这里未实现移动滑块,改变音乐位置。添加该功能时,音乐会短暂暂停,所以未给出相应的代码
    28. //开始按钮的实现
    29. connect(ui->pushButton,&QPushButton::clicked,player,&QMediaPlayer::play);
    30. //暂停按钮的实现
    31. connect(ui->pushButton_2,&QPushButton::clicked,player,&QMediaPlayer::pause);
    32. //停止按钮的实现
    33. connect(ui->pushButton_3,&QPushButton::clicked,player,&QMediaPlayer::stop);
    34. //点击左边列表换歌的实现
    35. connect(ui->listWidget,&QListWidget::currentRowChanged,this,&Widget::changerIndex);
    36. //随机播放的实现
    37. connect(ui->pushButton_4,&QPushButton::clicked,[=]()mutable
    38. {
    39. int x=qrand()%(list->mediaCount());//随机数
    40. qDebug()<<x;
    41. list->setCurrentIndex(x);
    42. changerIndex_list(x);
    43. });
    44. //下一首歌的实现
    45. connect(ui->pushButton_5,&QPushButton::clicked,[=]()mutable
    46. {
    47. int x=list->nextIndex();//获取下一首歌的索引
    48. if(x<0||x>=list->mediaCount())//当索引不合规时,不做操作
    49. {
    50. return;
    51. }
    52. list->setCurrentIndex(x);
    53. changerIndex_list(x);
    54. });

    两个函数的实现:

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

    运行结果:

  • 相关阅读:
    【重要】Heygen订阅指南和用法详解!让照片学说话?一张照片变演讲?Heygen订阅值得吗?
    nginx502常见502错误问题解决办法
    力扣946:验证栈序列
    某黑产组织最新攻击样本利用BYVOD技术的详细分析
    Hover:借贷新势力崛起,在经验与创新中找寻平衡
    华火电燃灶:重拾烹饪艺术的黄金法则,打造家庭美食的温馨记忆
    2022最新xcode打包IPA(完整详细图文)​
    12 - DEM故障处理分析
    【Linux升级之路】0_Linux入门 | 环境搭建 | 使用常识 | 用户管理
    Android四大组件之Service(二)
  • 原文地址:https://blog.csdn.net/qq_45303986/article/details/128063346