QMediaplayer详解以及简易音乐播放实现

QMediaplayer可以用于解析音频文件和视频文件,继承自QMediaObject,设计到的对象为QMediaContent。QMediaObject可以提供关于媒体内容的接入,通过URL进行初始化,同时也可以提供可以播放的媒体文件的列表,与QMediaplayer对象息息相关。使用QMediaplayer,除了需要添加必要的头文件之外,还需要在.pro(Qt的工程配置文件)添加QT
+= multimedia
。下面解析有关QMediaplayer的相关知识。

  • Type Information

QMediaplayer中枚举了有关于在读取和播放文件是可能出现的状态,首先是错误信息

enum QMediaPlayer::Error

以及media player的状态(state)信息

enum QMediaPlayer::State

以及与state信息息息相关的status信息:

enum QMediaPlayer::MediaStatus

  • 相关信号和函数

当然了,在获取到媒体内容,需要进行播放或者进行播放时,获取状态信息的改变是必不可少的。这些包含了是否正在播放,是否暂定播放,是否已经播放完毕等。

因此需要及时的了解这些信息,因此会比较注意一些几组信号:

  • void
    positionChanged(qint64 position)
  •  void
    stateChanged(QMediaPlayer::State state)
  • void
    durationChanged(qint64 duration)
  • void
    metaDataAvailableChanged(bool available)

positionChanged信号监视着属性postiion,可读可写属性。可以通过改变position的位置,从而实现快进和后退的功能。durationChanged信号是记录持续时间

duration的变换,为可读属性。metaDavaAvailableChaned()信号。当QMediaplayer读入到媒体文件式,就会触犯这个信号。我们就可以以此信号,读入媒体文件的

相关信息。读入相关信息可以QVariant QMediaObject::metaData(const QString & key) const来实现。其中key的类型有:Author,Title等类型。因为太多,

不便全部列出。完整列表:QMediaMetaData Namespace

以上是有关以及以下将会介绍到的案例的基本知识点。下面是实现简易播放的实现。

#ifndef AUDIOPLAYER_H
#define AUDIOPLAYER_H

#include <QWidget>
#include <QMediaPlayer>
QT_FORWARD_DECLARE_CLASS(QLabel)
QT_FORWARD_DECLARE_CLASS(QSlider)
QT_FORWARD_DECLARE_CLASS(QToolButton)
class denoiser;

class audioplayer : public QWidget
{
    Q_OBJECT
public:
    explicit audioplayer(QWidget *parent = 0);

signals:

public slots:
    void openFile();
    void playFile(const QString& filePath);
    void togglePlayback();
    void seekForward();
    void seekBackward();

private slots:
    void updateState(QMediaPlayer::State state);
    void updatePosition(qint64 position);
    void updateDuration(qint64 duration);
    void setPosition(int position);
    void updateInfo();

private:
    void createWidgets();

    QMediaPlayer mediaPlayer;
    QToolButton *playButton;
    QToolButton *forwardToolButton;
    QToolButton  *backwardToolButton;
    QToolButton *openfileButton;

    QSlider *positionSlider;
    QLabel *positionLabel;
    QLabel *infoLabel;

    denoiser *denoiserWidget;
};

#endif // AUDIOPLAYER_H

对头文件函数中函数功能的Descrption:

1-1、 功能按钮的函数的描述:

    void openFile();
    void playFile(const QString& filePath);
    void togglePlayback();
    void seekForward();
    void seekBackward();

第一个是实现文件打开,获取音频文件路径的功能。

第二个是通过获取的路径,播放文件的功能

第三个是实现暂停播放和继续播放的功能。

第四个是实现前进和后退的功能。

1-2、功能按钮的具体实现方式:

void audioplayer::openFile()
{
    const QStringList musicPaths = QStandardPaths::standardLocations(QStandardPaths::MusicLocation);
    const QString filePath =
        QFileDialog::getOpenFileName(this, tr("Open File"),
                                     musicPaths.isEmpty() ? QDir::homePath() : musicPaths.first(),
                                     tr("MP3 files (*.mp3);;All files (*.*)"));
    if (!filePath.isEmpty())
        playFile(filePath);
}

void audioplayer::playFile(const QString &filePath)
{
    playButton->setEnabled(true);
    infoLabel->setText(QFileInfo(filePath).fileName());

    mediaPlayer.setMedia(QUrl::fromLocalFile(filePath));
    mediaPlayer.play();
}

void audioplayer::togglePlayback()
{
    if (mediaPlayer.mediaStatus() == QMediaPlayer::NoMedia)
        openFile();
    else if (mediaPlayer.state() == QMediaPlayer::PlayingState)
        mediaPlayer.pause();
    else
        mediaPlayer.play();
}

void audioplayer::seekForward()
{
     positionSlider->triggerAction(QSlider::SliderPageStepAdd);
}

void audioplayer::seekBackward()
{
    positionSlider->triggerAction(QSlider::SliderPageStepSub);
}

2-1、文件播放时信息的更新和获取

信息的获取和更新肯定是以事件驱动的方式进行的,那么在qt中,实现方式肯定就是信号与槽啦,因此定义了以下几组获取和更新信息的槽:

    void updateState(QMediaPlayer::State state);
    void updatePosition(qint64 position);
    void updateDuration(qint64 duration);
    void setPosition(int position);
    void updateInfo();

1、updateState是通过对媒体播放状态,即PlayingState以及PauseState和StopState对playButton设置不同的显示状态,即暂停图标和播放图标。

2、updatePosition是通过监视对媒体播放进度的监视,从而控制滑动条的显示状态和位置。

3、updataDuration是用来设置滑动条的范围的

4、setPosition是通过滑块拉动实现对音频文件播放进度的控制

5、upDateInfo是显示对媒体文件信息的获取和现实。

2-2 信息获取和更新的实现

void audioplayer::updateState(QMediaPlayer::State state)
{
    if (state == QMediaPlayer::PlayingState) {
        playButton->setToolTip(tr("Pause"));
        playButton->setIcon(QIcon(":/images/pause.png"));
    } else {
        playButton->setToolTip(tr("Play"));
        playButton->setIcon(QIcon(":/images/play.png"));
    }
}

void audioplayer::updateDuration(qint64 duration)
{
    positionSlider->setRange(0,duration);
    positionSlider->setEnabled(duration>0);
    positionSlider->setPageStep(duration/10);
}

void audioplayer::updatePosition(qint64 position)
{
    positionSlider->setValue(position);
    QTime duration(0, position / 60000, qRound((position % 60000) / 1000.0));
    positionLabel->setText(duration.toString(tr("mm:ss")));
}

void audioplayer::setPosition(int position)
{
    if (qAbs(mediaPlayer.position() - position) > 99)
        mediaPlayer.setPosition(position);
}
void audioplayer::updateInfo()
{
    QStringList info;
    QString author = mediaPlayer.metaData("Author").toString();
    if (!author.isEmpty())
        info += author;
    QString title = mediaPlayer.metaData("Title").toString();
    if (!title.isEmpty())
        info += title;
    if (!info.isEmpty())
        infoLabel->setText(info.join(tr(" - ")));
}

以上是所有代码的实现方式和具体讲解,需要完整的代码的,可以去点击打开链接进行下载。实现效果如图:

时间: 2024-12-31 03:00:53

QMediaplayer详解以及简易音乐播放实现的相关文章

简易音乐播放器制作

制作简易音乐播放器: 1.功能:音乐列表,播放,暂停,上一曲,下一曲,进度条(显示进度时间,控制进度),随机播放,单曲循环,顺序播放,歌词显示等 2.使用框架:AVFoundation 3.知识点:AVPlayer 使用,pch 文件使用,封装思想,MVC模式,storyBoard的使用,消息发送机制,观察者,block回调,nstimer,nsrunloop,空间约束,第三方使用等 详细过程: 一.布局 :使用 storyBoard 布局 1.歌曲列表界面:使用 TableViewContro

Android学习之旅--简易音乐播放器实现之前期准备

学习Android有两个月了,感觉现在进入一个瓶颈--基础知识了解,但是不能灵活运用.我想这是所有新手学习android时都会遇到的 问题,所以打算做一个简易音乐播放器的小项目,这也是特别适合新手的练习项目.虽然小,但是也能考察不少东西.前几天看到一句话-----编 程不仅是一种知识,更是一种技能.既然是技能,那就需要不断练习才能熟练掌握. 项目目标前期实现本地音乐的播放,后期会往网络音乐方面发展,如果进行顺利的话,我会将源码放在github上,欢迎各位大神指导^- ^.我会坚持每天一更,记录每

基于BrocastReceiver的简易音乐播放

虽然说这些话不应该讲,但是我只是小小的发一下牢骚,权当发泄吧:自己已经有点适应这样的编码的日子了,甚至非常想要花上一段时间痛快的写一个应用,但是日常的学习的生活还是比较忙率的,而且 最近也听一些讲座,有了很深的启发,归结一点,我觉得比我们年长的程序员对于我们这样的初步的学者还是应该有宽容之心的,但是看到状况还是心中有些难平啊,但是某些评论并不能成为我的阻碍,我还是简单的想要保持一颗简单想要对未知的编码的世界一探究竟的心. 好了言归正传,最近我一直在想着把我的音乐播放器更进一步,所以就我最近的小小

iso 开发学习--简易音乐播放器(基于iPhone4s屏幕尺寸)

三个按钮  一个进度条 贴图(软件中部分图片,来自网络,如果侵犯了您的权益,请联系我,会立刻撤下) 核心代码 // // ViewController.m // 08-10-MusicPlayer // // Created by Ibokan on 15/8/10. // Copyright (c) 2015年 Crazy凡. All rights reserved. // #import "ViewController.h" #import <AVFoundation/AVF

Android 简易音乐播放器

效果图: 1.获取本地音乐 2.播放音乐 MediaPlayer 音乐播放类 MediaPlayer其实是一个封装的很好的音频.视频流媒体操作类,如果查看其源码,会发现其内部是调用的native方法,所以它其实是有C++实现的. 既然是一个流媒体操作类,那么必然涉及到,播放.暂停.停止等操作,实际上MediaPlayer也为我们提供了相应的方法来直接操作流媒体. void statr():开始或恢复播放. void stop():停止播放. void pause():暂停播放. 通过上面三个方法

腾讯X5内核使用详解(X5内核播放器使用如何去除控制栏全屏播放)以及一些注意事项

例子下载地址 https://www.lanzous.com/i2zsv5g      GIT就不用了麻烦的不行 本人安卓刚学 就上X5内核弄了老长时间由于对maven 和idea不熟悉刚开始导包都是问题(就业人员勿参考,因为此文没有水平) 先上图 解决了侧边填充不满问题(明白什么意思把?播放器侧边和安卓侧边有距离贼难看) 参考了http://www.cocoachina.com/cms/wap.php?action=article&id=25099 这个腾讯的相当于其他开源的播放器或者说浏览器

【转】log4j详解及简易搭建

原文链接:http://www.cnblogs.com/mailingfeng/archive/2011/07/28/2119937.html log4j是一个非常强大的log记录软件. 首先当然是得到log4j的jar档,推荐使用1.2.X版,下载地址: http://logging.apache.org/log4j/1.2/download.html 下面先来看Log4J的类图 Logger - 日志写出器,供程序员输出日志信息 Appender - 日志目的地,把格式化好的日志信息输出到指

10个免费开源的JS音乐播放器插件

音乐播放器在网页设计中有时候会用到,比如一些时尚类.音乐或影视类等项目,但这些 网页播放器 插件比较少见,所以这里为大家整理一个集合,也许会有用到的时候. 下面整理的播放器有些是支持自适应的,如果需要用到微信或手机上,可根据自己需要求,选择对应的网页播放器.  ● Codrops Audio Codrops Audio 界面使用纯CSS编写,支持响应式,可以方便在桌面.平板以及手机设备上使用.界面因为是CSS编写,所以如果懂CSS样式,可以自己设计一个新的样式来修改. 演示&下载 ● Dark

video详解 HTML5中的视频:

一.video 视频的方法.属性.事件详解 方法:play() 播放  pause() 暂停 属性:currentTime播放到当前的时间   duration视频的总时长 事件:ended 播放完的事件,需要进行的操作 二.video的浏览器的兼容性:(让所有浏览器都兼容) 1.添加js(下载地址:http://www.zhangxinxu.com/study/js/html5media.min.js ) <script src="http://html5media.googlecode