标签:
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
当然了,在获取到媒体内容,需要进行播放或者进行播放时,获取状态信息的改变是必不可少的。这些包含了是否正在播放,是否暂定播放,是否已经播放完毕等。
因此需要及时的了解这些信息,因此会比较注意一些几组信号:
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); }
信息的获取和更新肯定是以事件驱动的方式进行的,那么在qt中,实现方式肯定就是信号与槽啦,因此定义了以下几组获取和更新信息的槽:
void updateState(QMediaPlayer::State state); void updatePosition(qint64 position); void updateDuration(qint64 duration); void setPosition(int position); void updateInfo();
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(" - "))); }
标签:
原文地址:http://blog.csdn.net/mao19931004/article/details/52145578