Qt媒体播放器实现

发布于:2024-10-17 ⋅ 阅读:(10) ⋅ 点赞:(0)

本文介绍Qt媒体播放器实现。

Qt应用程序有时会涉及到视频文件的播放,Qt提供了QVideoWidget类实现视频和音频的播放,本文基于QVideoWidget类实现一个简单的媒体播放器。

1.自定义类(基于QVideoWidget类)

由于Qt并未提供专门的控件实现视频的显示,这里需要基于QVideoWidget类自定义一个类,再将拖放的QWidget类提升为自定义的类。这里将其命名为“VideoWidget”类。在使用QVideoWidget类时需在“.pro”文件中添加“multimedia”,“multimediawidgets”,参考代码如下:

QT       += core gui \
            multimedia \
            multimediawidgets

1)头文件

参考头文件如下:

#ifndef VIDEOWIDGET_H
#define VIDEOWIDGET_H

#include <QWidget>
#include <QVideoWidget>
#include <QMediaPlayer>


class VideoWidget : public QVideoWidget
{
    Q_OBJECT
public:
    explicit VideoWidget(QWidget *parent = nullptr);

    ~VideoWidget() override;

public:
    void setMediaPlayer(QMediaPlayer *player);

protected:
    void mousePressEvent(QMouseEvent *event) override;
    void keyPressEvent(QKeyEvent *event) override;

signals:

private:
    QMediaPlayer *mediaPlayer;

public slots:
};

#endif // VIDEOWIDGET_H

2)源文件

参考源文件如下:

#include "videowidget.h"
#include <QEvent>
#include <QKeyEvent>
#include <QMouseEvent>


VideoWidget::VideoWidget(QWidget *parent) : QVideoWidget(parent)
{

}

VideoWidget::~VideoWidget()
{

}

void VideoWidget::setMediaPlayer(QMediaPlayer *player)
{
    mediaPlayer = player;
}

void VideoWidget::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        if (mediaPlayer->state() == QMediaPlayer::PlayingState) {
            mediaPlayer->pause();
        } else {
            mediaPlayer->play();
        }
    }

    QVideoWidget::mousePressEvent(event);
}

void VideoWidget::keyPressEvent(QKeyEvent *event)
{
    if ((event->key() == Qt::Key_Escape) && isFullScreen()) {
        setFullScreen(false);
        event->accept();
    }

    QVideoWidget::keyPressEvent(event);
}

2.界面设计

界面设计如下图:

其中,

视频显示控件“videoWidget”是拖放了一个QWidget控件,然后将此控件提升为前面自定义的类“VideoWidget”。

3.功能实现

1)头文件

参考头文件如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMediaPlayer>
#include <QTimer>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget() override;

public slots:
    void play(void);
    void stop(void);

private:
    Ui::Widget *ui;

private:
     QMediaPlayer *mediaPlayer;
     int m_duration;

private slots:
    void mediaStateChanged(QMediaPlayer::State state);
    void positionChanged(qint64 position);
    void durationChanged(qint64 duration);
    void setPosition(int position);
    void setFullScreen(void);
    void setVolume(int volume);
};
#endif // WIDGET_H

2)源文件

参考源文件如下:

#include "widget.h"
#include "ui_widget.h"
#include <QStyle>
#include <QMouseEvent>
#include <QTime>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    m_duration = 0;

    mediaPlayer = new QMediaPlayer(this, QMediaPlayer::VideoSurface);

    ui->btnPlay->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));

    connect(ui->btnPlay, &QAbstractButton::clicked, this, &Widget::play);
    connect(ui->btnFullScreen, &QAbstractButton::clicked, this, &Widget::setFullScreen);
    connect(ui->sldPosition, &QAbstractSlider::sliderMoved, this, &Widget::setPosition);
    connect(ui->sldVolume, &QAbstractSlider::valueChanged, this, &Widget::setVolume);

    mediaPlayer->setVideoOutput(ui->videoWidget);
    ui->videoWidget->setMediaPlayer(mediaPlayer);
    connect(mediaPlayer, &QMediaPlayer::stateChanged, this, &Widget::mediaStateChanged);
    connect(mediaPlayer, &QMediaPlayer::positionChanged, this, &Widget::positionChanged);
    connect(mediaPlayer, &QMediaPlayer::durationChanged, this, &Widget::durationChanged);

    QString curPath = QCoreApplication::applicationDirPath();
    mediaPlayer->setMedia(QUrl::fromLocalFile(curPath + "/" + "test.mp4"));

    ui->sldVolume->setValue(50);

    mediaPlayer->setPlaybackRate(1.0);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::play()
{
    switch (mediaPlayer->state()) {
        case (QMediaPlayer::PlayingState): {
            mediaPlayer->pause();
            break;
        }
        default: {
            mediaPlayer->play();
            break;
        }
    }
}

void Widget::stop()
{
    mediaPlayer->stop();
}

void Widget::mediaStateChanged(QMediaPlayer::State state)
{
    switch(state) {
        case (QMediaPlayer::PlayingState): {
            ui->btnPlay->setIcon(style()->standardIcon(QStyle::SP_MediaPause));
            break;
        }
        case (QMediaPlayer::StoppedState): {
            ui->sldPosition->setValue(0);
            ui->btnPlay->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
            break;
        }
        default: {
            ui->btnPlay->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
            break;
        }
    }
}

void Widget::positionChanged(qint64 position)
{
    int temp = 0;

    temp = static_cast<int>(position);
    ui->sldPosition->setValue(temp);

    QString strTime;
    QTime currentTime((temp / 1000 / 3600) % 60, (temp / 1000 / 60) % 60,
                       temp / 1000 % 60, temp % 1000);
    QTime totalTime((m_duration / 1000 / 3600) % 60, (m_duration / 1000 / 60) % 60,
                     m_duration / 1000 % 60, m_duration % 1000);
    QString format = "mm:ss";
    if (m_duration / 1000 > 3600) {
        format = "hh:mm:ss";
    }
    strTime = currentTime.toString(format) + " / " + totalTime.toString(format);
    ui->lbTime->setText(strTime);
}

void Widget::durationChanged(qint64 duration)
{
    m_duration = static_cast<int>(duration);
    ui->sldPosition->setRange(0, m_duration);
}

void Widget::setPosition(int position)
{
    mediaPlayer->setPosition(position);
}

void Widget::setFullScreen()
{
    ui->videoWidget->setFullScreen(true);
}

void Widget::setVolume(int volume)
{
    mediaPlayer->setVolume(volume);
}

其中,

构造函数中媒体播放器绑定了输出控件,输出控件指定了媒体播放器,其他的功能块比较简单,这里不再赘述。

4.效果

运行效果如下:

总结,本文介绍了Qt媒体播放器实现。