QT实现MP4播放器

2024-08-31 21:12
文章标签 实现 qt 播放器 mp4

本文主要是介绍QT实现MP4播放器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、实现功能

 播放本地MP4文件。

1、可以将文件添加到列表中,双击列表中的歌曲进行播放。

2、实现视频的播放与暂停。

3、上一首和下一首的按钮选择功能。

4、视频名称的滚动显示。

5、当前的播放时长和总时长。

6、播放模式的选择:单曲循环、随机播放、顺序播放。

7、使用了水平和垂直布局。

8、视频音量的控制。

9、使用非UI界面实现。

2、项目环境

Qt Creator 5.0.2 

3、widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QDebug>
#include <QListWidget>
#include <QVideoWidget>
#include <QMediaPlayer>
#include <QLabel>
#include <QPushButton>
#include <QComboBox>
#include <QMessageBox>
#include <QHBoxLayout>
#include <QFileDialog>
#include <QTime>
#include <QTimer>
#include <QResizeEvent>
#include <QSizePolicy>
#include <QListWidgetItem>
class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
private slots:void get_duration(qint64 duration);void update_playslidexvalue(qint64 position);void basic();private slots:void on_select_btn_clicked();void on_pre_btn_clicked();void on_next_btn_clicked();void onComboBoxIndexChanged(int index);void on_itemDouble_clicked(QListWidgetItem *item);void on_play_btn_clicked();void on_play_slidex_sliderMoved(int position);
private:QListWidget *list;QVideoWidget *video;QLabel *name_lab;QLabel *time_lab;QSlider *slider1;QSlider *slider2;QPushButton *select_btn;QPushButton *play_btn;QPushButton *pre_btn;QPushButton *next_btn;QComboBox *combox;QHBoxLayout *hbox1;QHBoxLayout *hbox2;QHBoxLayout *hbox3;QVBoxLayout *vbox;QMediaPlayer *player;QTimer *timer;QString song_name;int index;int lon;int hua;int mode;
};
#endif // WIDGET_H

 4、widget.cpp

#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent)
{this->setGeometry(0, 0, 800, 600);/*------------------------------------*/this->list =new QListWidget(this);//设置视频展示列表/*------------------------------------*/this->video =new QVideoWidget(this);//设置视频播放this->video->setWindowTitle("视频播放器");this->video->setStyleSheet("border:2px solid black");/*------------------------------------*/this->name_lab =new QLabel(this);//设置视频名滚动this->name_lab->setGeometry(10,380,200,40);this->name_lab->setText("视频名");/*------------------------------------*/this->time_lab =new QLabel(this);//设置播放时间this->time_lab->setGeometry(500,380,200,40);this->time_lab->setText("     ");/*------------------------------------*/this->slider1 = new QSlider(this);//播放时间的滑块this->slider1->setOrientation(Qt::Horizontal);this->slider1->setGeometry(10,440, 780, 30);/*------------------------------------*/this->select_btn =new QPushButton(this);//添加到列表this->select_btn->setGeometry(10,520,100,40);this->select_btn->setText("添加到列表");/*------------------------------------*/this->play_btn =new QPushButton(this);//  播放/暂停this->play_btn->setGeometry(130,520,100,40);this->play_btn->setText("播放");/*------------------------------------*/this->pre_btn =new QPushButton(this);//this->pre_btn->setGeometry(250,520,100,40);this->pre_btn->setText("上一首");/*------------------------------------*/this->next_btn =new QPushButton(this);//this->next_btn->setGeometry(370,520,100,40);this->next_btn->setText("下一首");/*------------------------------------*/this->combox =new QComboBox(this);//this->combox->setGeometry(500,520,100,50);this->combox->addItem("单曲循环");this->combox->addItem("顺序播放");this->combox->addItem("随机播放");/*------------------------------------*/this->slider2 = new QSlider(this);//播放声音的滑块this->slider2->setOrientation(Qt::Horizontal);this->slider2->setGeometry(620,520, 130, 40);/*------------------------------------*///准备一个水平布局//给水平布局添加组件对象this->hbox1 = new QHBoxLayout;this->hbox1->addWidget(this->list,1);this->hbox1->addStretch();this->hbox1->addWidget(this->video,3);/*------------------------------------*/this->hbox2 = new QHBoxLayout;this->hbox2->addWidget(this->name_lab);this->hbox2->addWidget(this->time_lab);/*------------------------------------*/this->hbox3 = new QHBoxLayout;this->hbox3->addWidget(this->select_btn);this->hbox3->addWidget(this->play_btn);this->hbox3->addWidget(this->pre_btn);this->hbox3->addWidget(this->next_btn);this->hbox3->addWidget(this->combox);this->hbox3->addWidget(this->slider2);/*------------------------------------*///准备一个垂直布局this->vbox = new QVBoxLayout;//给垂直布局添加组件、添加布局this->vbox->addLayout(this->hbox1);this->vbox->addLayout(this->hbox2);this->vbox->addWidget(this->slider1);this->vbox->addLayout(this->hbox3);/*------------------------------------*///给界面设置布局为垂直布局this->setLayout(this->vbox);/*------------------------------------*///实例化播放器对象this->player=new QMediaPlayer(this);/*------------------------------------*/this->timer=new QTimer(this);//实例化定时器对象/*------------------------------------*/this->index=0;//实例化Indexthis->lon=0;//实例化lonthis->hua=0;//实例化huathis->mode=0;//实例化mode  默认为单曲循环this->player->setVolume(0);//声音默认为0/*------------------------------------*///槽函数与信号关联connect(this->select_btn,&QPushButton::clicked,this,&Widget::on_select_btn_clicked);// connect(this->select_btn,&QPushButton::clicked,this,&Widget::on_select_btn_clicked);connect(this->list, &QListWidget::itemDoubleClicked, this,&Widget::on_itemDouble_clicked);connect(this->play_btn,&QPushButton::clicked,this,&Widget::on_play_btn_clicked);connect(this->player,&QMediaPlayer::durationChanged,this,&Widget::get_duration);connect(this->player,&QMediaPlayer::positionChanged,this,&Widget::update_playslidexvalue);//  位置改变connect(this->slider1,&QSlider::sliderMoved,this,&Widget::on_play_slidex_sliderMoved);connect(this->pre_btn,&QPushButton::clicked,this,&Widget::on_pre_btn_clicked);connect(this->next_btn,&QPushButton::clicked,this,&Widget::on_next_btn_clicked);connect(this->combox, SIGNAL(currentIndexChanged(int)), this, SLOT(onComboBoxIndexChanged(int)));connect(this->timer,&QTimer::timeout,this,[=](){//获取当前的播放时长以及歌曲的总时长qint64 pos =this->player->position();qint64 dur =this->player->duration();QString str = QTime(0,0,0,0).addMSecs(pos).toString("mm:ss")+"/"+ QTime(0,0,0,0).addMSecs(dur).toString("mm:ss");//设置给时间标签去显示this->time_lab->setText(str);//歌曲名称的滚动显示this->index++;if(this->index==this->song_name.size()){this->index=0;}QString name=this->song_name.mid(this->index);this->name_lab->setText(name);if(dur==pos){if(this->mode==0){this->player->stop();this->player->play();}else if(this->mode==1){this->player->pause();if(this->hua<this->lon-1){this->hua++;}else{this->hua=0;}basic();}else if(this->mode==2){this->hua=rand()%this->lon;basic();}}});connect(this->slider2, &QSlider::sliderMoved, this->player, [=](qint64 position)
{//改变音量滑块的位置,调节音量的大小this->player->setVolume(position);
});}Widget::~Widget()
{}void Widget::get_duration(qint64 duration)
{ //获取歌曲时长//给滑块设置取值范围this->slider1->setRange(0,duration);
}//根据歌曲的播放位置变化改变滑块的位置
void Widget::update_playslidexvalue(qint64 position)
{// 改变滑块的值this->slider1->setValue(position);}void Widget::basic()
{//给播放器设置媒体资源QListWidgetItem *item = this->list->item(this->hua);QString filePath = item->data(Qt::UserRole).toString();this->player->setMedia(QMediaContent(QUrl(filePath)));//给播放器设置画面输出this->player->setVideoOutput(this->video);//给滑块设置取值范围this->slider1->setValue(0);//获取歌曲名称this->song_name="                          "+QFileInfo(filePath).fileName();this->timer->start(1000);this->player->play();this->play_btn->setText("暂停");
}void Widget::on_select_btn_clicked()
{//选择歌曲资源QStringList filePaths = QFileDialog::getOpenFileNames(this,"选择","./","MP4(*.mp4)");for(int i=0;i<filePaths.size();i++){QString filePath=filePaths.at(i);QString fileName = QFileInfo(filePaths.at(i)).fileName();QListWidgetItem *item = new QListWidgetItem(QIcon("./icon/opn.jfif"), fileName);//将文件的完整路径存储在 QListwidgetItem 的用户数据中item->setData(Qt::UserRole,filePath);item->setData(Qt::UserRole+1,this->lon);this->lon++;this->list->addItem(item);}
}void Widget::on_itemDouble_clicked(QListWidgetItem *item)
{this->player->pause();QString filePath = item->data(Qt::UserRole).toString();this->hua= item->data(Qt::UserRole + 1).toInt();basic();
}void Widget::on_play_btn_clicked()
{if(this->lon!=0){if(this->play_btn->text()=="播放"){//启动定时器this->timer->start(1000);this->player->play();this->play_btn->setText("暂停");}else if(this->play_btn->text()=="暂停"){this->player->pause();this->timer->stop();this->play_btn->setText("播放");}}else{QMessageBox::information(this, "播放", "请先选择视频");}
}void Widget::on_pre_btn_clicked()
{this->player->pause();if(this->hua>0){this->hua--;basic();}else{QMessageBox::information(this, "上一首", "这是第一首了");}
}void Widget::on_next_btn_clicked()
{this->player->pause();if(this->hua<this->lon-1){this->hua++;basic();}else{QMessageBox::information(this, "下一首", "这是最后一首了");}
}void Widget::onComboBoxIndexChanged(int index)
{this->mode=index;switch (index){case 0:qDebug() << "单曲循环模式被选中";break;case 1:qDebug() << "顺序播放模式被选中";break;case 2:qDebug() << "随机播放模式被选中";break;default:break;}
}//根据滑块的位置变化改变歌曲的播放位置
void Widget::on_play_slidex_sliderMoved(int position)
{//改变歌曲的播放位置this->player->setPosition(position);
}

这篇关于QT实现MP4播放器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125010

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、