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等类型。因为太多,
不便全部列出。完整列表:
以上是有关以及以下将会介绍到的案例的基本知识点。下⾯是实现简易播放的实现。
#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();
}
dear santavoid audioplayer::togglePlayback()百度mp3歌曲
{
if (diaStatus() == 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->String(tr("mm:ss")));
}
void audioplayer::setPosition(int position)
{
if (qAbs(mediaPlayer.position() - position) > 99)
mediaPlayer.setPosition(position);
}
void audioplayer::updateInfo()
{
QStringList info;
QString author = aData("Author").toString();
if (!author.isEmpty())
info += author;
QString title = aData("Title").toString();
if (!title.isEmpty())
info += title;
if (!info.isEmpty())
infoLabel->setText(info.join(tr(" - ")));
}
以上是所有代码的实现⽅式和具体讲解,需要完整的代码的,可以去进⾏下载。实现效果如图: