Qt使用QMediaplayer实现视频播放和简易音乐播放

QMediaplayer可以用于解析音频文件和视频文件,继承自QMediaObject,设计到的对象为QMediaContent。QMediaObject可以提供关于媒体内容的接入,通过URL进行初始化,同时也可以提供可以播放的媒体文件的列表,与QMediaplayer对象息息相关。使用QMediaplayer,除了需要添加必要的头文件之外,还需要在.pro(Qt的工程配置文件)添加QT += multimedia。下面解析有关QMediaplayer的相关知识。
QMediaplayer中枚举了有关于在读取和播放文件是可能出现的状态,首先是错误信息。
enum QMediaPlayer::Error
在这里插入图片描述以及media player的状态(state)信息:
enum QMediaPlayer::State
在这里插入图片描述以及与state信息息息相关的status信息:
enum QMediaPlayer::MediaStatus
在这里插入图片描述相关信号和函数
当然了,在获取到媒体内容,需要进行播放或者进行播放时,获取状态信息的改变是必不可少的。这些包含了是否正在播放,是否暂定播放,是否已经播放完毕等。
因此需要及时的了解这些信息,因此会比较注意一些几组信号:

  • void positionChanged(qint64 position)
  • voidstateChanged(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(" - ")));
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值