在linux下QT设计实现视频播放器

通过QT对mplayer的应用,实现视频播放器的功能,包括开始播放、暂停播放、继续播放、终止播放、播放上一个、播放下一个、添加指定目录下的视频、删除指定视频、清空列表。应用到multimedia、multimediawidgets库和QStringList、QFileDialog等类。

界面效果如下:
在这里插入图片描述


videoplayer.h

#ifndef VIDEOPLAYER_H
#define VIDEOPLAYER_H

#include <QMainWindow>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QListWidgetItem>
#include <QVideoWidget>
#include "myvideowidget.h"

QT_BEGIN_NAMESPACE
namespace Ui {
    
     class VideoPlayer; }
QT_END_NAMESPACE

class VideoPlayer : public QMainWindow
{
    
    
    Q_OBJECT

public:
    VideoPlayer(QWidget *parent = nullptr);
    ~VideoPlayer();
    //重写事件过滤器函数
    virtual bool eventFilter(QObject *watched,QEvent *event);
    void add_Layout(QWidget *w);

private slots:
    void on_listWidget_itemDoubleClicked(QListWidgetItem *item);

    void on_pushButton_start_clicked();

    void on_pushButton_stop_cont_clicked();

    void on_pushButton_stop_clicked();

    void on_pushButton_fullscreen_clicked();

    void on_pushButton_prev_clicked();

    void on_pushButton_next_clicked();

    void on_pushButton_add_video_clicked();

    void on_pushButton_del_video_clicked();

    void on_pushButton_clear_video_clicked();

    void on_horizontalSlider_sliderMoved(int position);

    void on_verticalSlider_sliderMoved(int position);

    //周期改变函数
    void set_sider(qint64 duration);
    //进度改变
    void set_value(qint64 position);

private:
    Ui::VideoPlayer *ui;
    QMediaPlayer *player;
    //QVideoWidget *videow;
    MyVideoWidget *videow;
    QMediaPlaylist *playlist;
    QString video_duration;
};
#endif // VIDEOPLAYER_H



videoplayer.cpp

#include "videoplayer.h"
#include "ui_videoplayer.h"
#include <QFileDialog>
#include <QTime>
#include <QDebug>
#include <QKeyEvent>

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

    player = new QMediaPlayer(this);
    videow = new MyVideoWidget(this);
    playlist = new QMediaPlaylist(this);

    //为videow安装过滤器 ----- 主窗口
    //videow->installEventFilter(this);

    //将QVideoWidget加入布局管理器
    ui->horizontalLayout->addWidget(videow);
    //设置QMediaPlayer的videooutput
    player->setVideoOutput(videow);

    //设置播放模式
    playlist->setPlaybackMode(QMediaPlaylist::Loop);
    //设置播放器的播放列表
    player->setPlaylist(playlist);

    //连接信号和槽
    QObject::connect(player,SIGNAL(durationChanged(qint64)),this,SLOT(set_sider(qint64)));
    QObject::connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(set_value(qint64)));

    //禁止暂停按钮
    ui->pushButton_stop_cont->setEnabled(false);
}

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

bool VideoPlayer::eventFilter(QObject *watched,QEvent *event)
{
    
    
    //按键事件
    if(event->type()==QEvent::KeyPress){
    
    
        QKeyEvent *keyevent = dynamic_cast<QKeyEvent *>(event);
        //按了Esc,退出全屏
        if(keyevent->key()==Qt::Key_Escape){
    
    
            //恢复播放窗口为子窗口
            videow->setWindowFlag(Qt::SubWindow);
            //退出全屏
            videow->showNormal();

            //重设父窗口
            videow->setParent(this);
            //重新加入布局管理器
            ui->horizontalLayout->addWidget(videow);
        }
    }

    //调用基类的过滤器处理函数
    return QMainWindow::eventFilter(watched,event);
}

void VideoPlayer::add_Layout(QWidget *w)
{
    
    
    ui->horizontalLayout->addWidget(w);
}

void VideoPlayer::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
{
    
    
    int row = ui->listWidget->currentRow();
    playlist->setCurrentIndex(row);

    //设置音量
    player->setVolume(ui->verticalSlider->value());
    player->play();

    ui->pushButton_stop_cont->setEnabled(true);
}

//开始播放
void VideoPlayer::on_pushButton_start_clicked()
{
    
    
    //当选中新的视频文件或者不是暂停状态===>重新播放
    if(ui->listWidget->currentRow()!=playlist->currentIndex()||
            player->state()!=QMediaPlayer::PausedState){
    
    
        //指定当前播放文件
        int row = ui->listWidget->currentRow();
        playlist->setCurrentIndex(row);
        //设置音量
        player->setVolume(ui->verticalSlider->value());
    }

    player->play();

    ui->pushButton_stop_cont->setEnabled(true);
}

//停止
void VideoPlayer::on_pushButton_stop_cont_clicked()
{
    
    
    player->pause();

    ui->pushButton_stop_cont->setEnabled(false);
}

//暂停
void VideoPlayer::on_pushButton_stop_clicked()
{
    
    
    player->stop();

    ui->pushButton_stop_cont->setEnabled(false);
}

//全屏
void VideoPlayer::on_pushButton_fullscreen_clicked()
{
    
    
    //把子窗口提升为顶层窗口
    videow->setWindowFlag(Qt::Window);
    //全屏
    videow->showFullScreen();
}

void VideoPlayer::on_pushButton_prev_clicked()
{
    
    
    int row = ui->listWidget->currentRow();
    if(row==0)
        row = ui->listWidget->count();
    row--;

    ui->listWidget->setCurrentRow(row);
    on_listWidget_itemDoubleClicked(ui->listWidget->currentItem());
}

void VideoPlayer::on_pushButton_next_clicked()
{
    
    
    int row = ui->listWidget->currentRow();
    if(row==ui->listWidget->count()-1)
        row = 0;
    else
        row++;

    ui->listWidget->setCurrentRow(row);
    on_listWidget_itemDoubleClicked(ui->listWidget->currentItem());
}

void VideoPlayer::on_pushButton_add_video_clicked()
{
    
    
    QStringList video_files = QFileDialog::getOpenFileNames(this,"选择视频文件","./video","*.mp3 *.mp4 *.avi");

    //去重
    for(int i=0;i<ui->listWidget->count();i++){
    
    
        for(int j=0;j<video_files.count();j++){
    
    
            if(ui->listWidget->item(i)->text()==video_files.at(j)){
    
    
                video_files.removeAt(j);
                break;
            }
        }
    }

    //如果无添加文件,直接返回
    if(video_files.isEmpty())
        return;

    //添加到listWidget和playlist

    for(int i=0;i<video_files.count();i++){
    
    
        QString file = video_files.at(i);
        //把文件加入播放列表
        playlist->addMedia(QUrl::fromLocalFile(file));
    }

    ui->listWidget->addItems(video_files);
    //定位
    ui->listWidget->setCurrentRow(0);
}

void VideoPlayer::on_pushButton_del_video_clicked()
{
    
    
    int row = ui->listWidget->currentRow();
    //取出一项
    QListWidgetItem *item = ui->listWidget->takeItem(row);

    if(item){
    
    
        delete item;
    }

    //如果删除了正在播放的视频,禁止暂停
    if(row==playlist->currentIndex())
        ui->pushButton_stop_cont->setEnabled(false);

    //从播放列表删除
    playlist->removeMedia(row);
}

void VideoPlayer::on_pushButton_clear_video_clicked()
{
    
    
    ui->listWidget->clear();
    //清空播放列表
    playlist->clear();

    ui->pushButton_stop_cont->setEnabled(false);
}

void VideoPlayer::on_horizontalSlider_sliderMoved(int position)
{
    
    
    player->setPosition(position);
}

void VideoPlayer::on_verticalSlider_sliderMoved(int position)
{
    
    
    player->setVolume(position);
    //更新显示
    ui->label_volume->setText(QString("音量:%1").arg(position));
}

//周期改变函数
void VideoPlayer::set_sider(qint64 duration)
{
    
    
    qDebug()<<duration;

    if(duration!=0)
    {
    
    
        //设置进度条最大值
        ui->horizontalSlider->setRange(0,duration);

        QTime t = QTime(duration/1000/60/60,duration/1000/60%60,duration/1000%60);
        //显示周期
        video_duration = t.toString("hh:mm:ss");
        ui->label_duration_position->setText(QString("00:00:00/%1").arg(video_duration));

        //显示歌曲切换
        ui->listWidget->setCurrentRow(playlist->currentIndex());
    }
}

//进度改变
void VideoPlayer::set_value(qint64 position)
{
    
    
    //更新进度条的值
    ui->horizontalSlider->setValue(position);

    QTime t = QTime(position/1000/60/60,position/1000/60%60,position/1000%60);
    //显示进度
    ui->label_duration_position->setText(QString("%1/%2").
        arg(t.toString("hh:mm:ss")).arg(video_duration));
}



myvideowidget.h

#ifndef MYVIDEOWIDGET_H
#define MYVIDEOWIDGET_H

#include <QVideoWidget>

class MyVideoWidget : public QVideoWidget
{
    
    
    Q_OBJECT
public:
    MyVideoWidget(QWidget *parent=0);
    //重写按键事件处理函数
    virtual void keyPressEvent(QKeyEvent *event);

private:
    QWidget *p;
};

#endif // MYVIDEOWIDGET_H



myvideowidget.cpp

#include "myvideowidget.h"
#include <QKeyEvent>
#include "videoplayer.h"

MyVideoWidget::MyVideoWidget(QWidget *parent):QVideoWidget(parent)
{
    
    
    //记录父对象
    p = parent;
}

void MyVideoWidget::keyPressEvent(QKeyEvent *event)
{
    
    
    if(event->key()==Qt::Key_Escape){
    
    
        //恢复播放窗口为子窗口
        this->setWindowFlag(Qt::SubWindow);
        //退出全屏
        this->showNormal();

        //重设父窗口
        this->setParent(p);
        //重新加入布局管理器
        VideoPlayer *vp = dynamic_cast<VideoPlayer *>(p);
        vp->add_Layout(this);
    }

    return QVideoWidget::keyPressEvent(event);
}



main.cpp

#include "videoplayer.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    
    
    QApplication a(argc, argv);
    VideoPlayer w;
    w.show();
    return a.exec();
}

完整工程代码:https://download.csdn.net/download/weixin_43793181/13500250

猜你喜欢

转载自blog.csdn.net/weixin_43793181/article/details/110824565