gitee源码

文章目录

  • 需求分析
  • 环境
  • 代码
    • 1. 接口实现
    • 2. 接口子类实现
    • 3. IOC容器实现
    • 4. 界面设计
    • 5. 界面功能实现
  • 结果展示
  • 总结

需求分析

1. 使用IOC容器
2. 使用接口编程
3. 能播放,暂停,倍数等基本功能

环境

1. qt6.4.2
2. windows
3. C++
使用qt6.4.2是因为qt6.3.1没有QMediaPlayer模块

代码

1. 接口实现

class video_Api : public QObject
{Q_OBJECT
public:virtual void play() = 0;                                    //开始播放virtual void pause() = 0;                                   //暂停virtual void stop() = 0;                                    //停止virtual void play_path(QString path) = 0;                   //设置播放路径virtual void set_video_output(QGraphicsVideoItem* item) = 0;//设置视频输出virtual void set_voice_output() = 0;                        //设置声音输出virtual int return_video_duration() = 0;                    //返回视频长度virtual void set_video_rate(float value) = 0;               //设置播放速率virtual int return_play_stat() = 0;                         //返回视频状态virtual QString return_play_source() = 0;                   //返回当前播放视频
public slots:virtual void set_play_position(int value) = 0;              //设置播放位置virtual void set_play_voice(int value) = 0;                 //设置声音大小
public:enum player_stat{StoppedState,PlayingState,PausedState};
signals:void position_change(qint64 value);                         //更新播放进度protected:explicit video_Api(QObject *parent = nullptr);
};

2. 接口子类实现

class default_Video_Api : public video_Api
{Q_OBJECT
public:static default_Video_Api*getInstance(){if(instance == nullptr){instance = new default_Video_Api();}return instance;}public:void play();                                    //播放void pause();                                   //暂停void stop();                                    //停止void play_path(QString path);                   //设置播放路径void set_video_output(QGraphicsVideoItem* item);//设置视频输出void set_voice_output();                        //设置声音输出int return_video_duration();                    //返回视频长度void set_video_rate(float value);               //设置播放速率int return_play_stat();                         //返回视频状态QString return_play_source();                   //返回当前播放视频
public slots:void set_play_position(int value);              //设置播放位置void set_play_voice(int value);                 //设置声音大小
protected:default_Video_Api();
protected slots:void position_changed(qint64 value);private:QMediaPlayer *player;   //播放器QAudioOutput *voice;    //声音器static default_Video_Api *instance;
};
default_Video_Api* default_Video_Api::instance = nullptr;void default_Video_Api::play()
{player->play();
}void default_Video_Api::pause()
{player->pause();
}void default_Video_Api::stop()
{player->stop();
}void default_Video_Api::play_path(QString path)
{player->setSource(QUrl::fromLocalFile(path));
}void default_Video_Api::set_video_output(QGraphicsVideoItem *item)
{player->setVideoOutput(item);
}void default_Video_Api::set_voice_output()
{player->setAudioOutput(voice);
}int default_Video_Api::return_video_duration()
{return player->duration();
}void default_Video_Api::set_video_rate(float value)
{player->setPlaybackRate(value);
}int default_Video_Api::return_play_stat()
{return player->playbackState();
}QString default_Video_Api::return_play_source()
{return player->source().toString();
}void default_Video_Api::set_play_position(int value)
{player->setPosition(value);
}void default_Video_Api::set_play_voice(int value)
{float avalue = value*0.01;voice->setVolume(avalue);
}default_Video_Api::default_Video_Api()
{player = new QMediaPlayer;voice = new QAudioOutput;connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(position_changed(qint64)));}void default_Video_Api::position_changed(qint64 value)
{emit position_change(value);
}

3. IOC容器实现

//IOC容器
template <class T>
class IOCcontainer
{public:IOCcontainer(){};~IOCcontainer(){};//注册需要创建对象的getInstance,通过唯一的标识符,以便于以后查找template <class driver>void registerType(QString str_key){std::function < T* ()> function = []{return driver::getInstance();};registerType(str_key, function);}//根据唯一的标识去查找getInstance函数T* resolve(QString str_key){//没有这个构造函数if (m_createMap.find(str_key) == m_createMap.end()){return nullptr;}//有这个getInstancestd::function<T*()> function = m_createMap[str_key];return function();}//访问对象T* resilveshare(QString str_key){T* ptr = resolve(str_key);return ptr;}private:void registerType(QString str_key, std::function<T* ()> creator){//如果存在的话if (m_createMap.find(str_key) != m_createMap.end()){throw std::invalid_argument("已经存在这个key了");}m_createMap.emplace(str_key, creator);}private:map<QString, std::function<T* ()>> m_createMap;};

4. 界面设计

5. 界面功能实现

  1. 初始化
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//初始化内核core = QString("default");//注册api对象m_video_Api_IOC.registerType<default_Video_Api>("default");//初始化智能指针(使用默认内核)m_video_Api = m_video_Api_IOC.resilveshare("default");//视频设置scene = new QGraphicsScene(this);videoItem = new QGraphicsVideoItem;videoItem->setFlags(QGraphicsVideoItem::ItemIsFocusable);ui->graphicsView->setScene(scene);m_video_Api->set_video_output(videoItem);scene->addItem(videoItem);duration = 0;QString process_time = QString("%1s/%2s").arg(QString::number(0)).arg(QString::number(duration/1000));//声音设置m_video_Api->set_voice_output();m_video_Api->set_play_voice(100);ui->horizontalSlider_voice->setMaximum(100);ui->horizontalSlider_voice->setValue(100);ui->label_voice_value->setText("100");//倍数设置rate = 1.0;ui->pushButton_rate->setText("1.0");m_video_Api->set_video_rate(rate);//槽连接connect(m_video_Api,SIGNAL(position_change(qint64)),this,SLOT(onPositionChanged(qint64)));
}
  1. 播放
void MainWindow::on_pushButton_play_clicked()
{m_video_Api->play();//获取播放总时长-------------------------------------duration = m_video_Api->return_video_duration();ui->horizontalSlider_process->setMaximum(duration);QString process_time = QString("%1s/%2s").arg(QString::number(0)).arg(QString::number(duration/1000));ui->label_process->setText(process_time);//适应大小------------------------------------------videoItem->setSize(ui->graphicsView->size());
}
  1. 暂停
void MainWindow::on_pushButton_pause_clicked()
{m_video_Api->pause();
}
  1. 停止
void MainWindow::on_pushButton_stop_clicked()
{m_video_Api->stop();
}
  1. 倍数
void MainWindow::on_pushButton_rate_clicked()
{if(rate == 1.0){rate = 2.0;ui->pushButton_rate->setText("2.0");m_video_Api->set_video_rate(rate);}else if(rate == 2.0){rate = 0.5;ui->pushButton_rate->setText("0.5");m_video_Api->set_video_rate(rate);}else if(rate == 0.5){rate = 1.0;ui->pushButton_rate->setText("1.0");m_video_Api->set_video_rate(rate);}//m_video_Api->set_video_rate(rate);
}
  1. 上一个
void MainWindow::on_pushButton_last_clicked()
{//获取当前播放视频信息int row = ui->listWidget->currentRow();//列表上一个if(row == 0){return;}QListWidgetItem* item = ui->listWidget->item(row-1);QString key = item->text();QString value_path;for(auto i = fileMap.begin();i!=fileMap.end();i++){if(i.key() == key){value_path = i.value();break;}}ui->listWidget->setCurrentRow(row-1);//设置视频源m_video_Api->play_path(value_path);//播放//on_pushButton_play_clicked();
}
  1. 下一个
void MainWindow::on_pushButton_next_clicked()
{//获取当前播放视频信息int row = ui->listWidget->currentRow();//列表下一个if(!ui->listWidget->item(row+1)){return;}QListWidgetItem* item = ui->listWidget->item(row+1);QString key = item->text();QString value_path;for(auto i = fileMap.begin();i!=fileMap.end();i++){if(i.key() == key){value_path = i.value();break;}}ui->listWidget->setCurrentRow(row+1);//设置视频源m_video_Api->play_path(value_path);//播放//on_pushButton_play_clicked();
}
  1. 添加播放文件

void MainWindow::on_pushButton_select_path_clicked()
{QString currentpath = QDir::homePath();                                     //获取系统当前目录QString digTitle = "请选择视频文件";                                          //打开文件对话框的标题QString strfilter = QString("All Files(*.*)");                              //文件过滤QString allfiles = QFileDialog::getOpenFileName(this,digTitle,currentpath); //打开文件if(allfiles.isEmpty()){QMessageBox::information(this,"提示","打开错误,路径为:"+ allfiles);return;}QFileInfo fileInfos(allfiles);fileMap.insert(fileInfos.fileName(),allfiles);//qDebug()<<fileMap.keys();//qDebug()<<fileMap.values();ui->listWidget->addItem(fileInfos.fileName());
}
  1. 删除播放文件
void MainWindow::on_pushButton_delete_path_clicked()
{int row = ui->listWidget->currentRow();QListWidgetItem* delete_path = ui->listWidget->takeItem(row);QString value;QString key = delete_path->text();for(auto i = fileMap.begin();i != fileMap.end();i++){if(i.key() == key){value = i.value();fileMap.remove(key);break;}}// qDebug()<<value;// qDebug()<<m_video_Api->return_play_source();//如果删除的视频正在播放if("file:///"+value == m_video_Api->return_play_source()){m_video_Api->stop();m_video_Api->play_path(nullptr);}QMessageBox::information(this,"提示","成功删除:"+delete_path->text());//qDebug()<<fileMap.keys();//qDebug()<<fileMap.values();//delete delete_path;
}
  1. 进度条

void MainWindow::onPositionChanged(qint64 position)
{ui->horizontalSlider_process->setValue(position);QString process_time = QString("%1s/%2s").arg(QString::number(position/1000)).arg(QString::number(duration/1000));ui->label_process->setText(process_time);
}void MainWindow::on_horizontalSlider_process_sliderPressed()
{m_video_Api->pause();
}void MainWindow::on_horizontalSlider_process_sliderReleased()
{m_video_Api->play();
}void MainWindow::on_horizontalSlider_process_sliderMoved(int position)
{//如果是暂停状态-----------------------------if(m_video_Api->return_play_stat() == 2){m_video_Api->set_play_position(position);}QString process_time = QString("%1s/%2s").arg(QString::number(position/1000)).arg(QString::number(m_video_Api->return_video_duration()/1000));ui->label_process->setText(process_time);
}
  1. 音量条

void MainWindow::on_horizontalSlider_voice_sliderMoved(int position)
{m_video_Api->set_play_voice(position);ui->label_voice_value->setText(QString::number(position));
}

结果展示

总结

1. 主要是结合了IOC容器和单例的学习
2. 对设计模式(创建型)有了更加深入的了解
3. 对未来ffmmpeg模块,我只需要将其抽象成接口,然后就跟core为ffmmpeg,在初始化一遍就完成了ffmmpeg模块功能加载,这无一不体现设计模式的可扩展性。

qt实现一个MP4视频播放器相关推荐

  1. flv f4v mp4 视频播放器代码

    flv f4v mp4 视频播放器代码 ckplayer是一款在网页上播放视频的免费的播放器,功能强大,体积小巧,跨平台,使用起来随心所欲. 播放器主要以adobe的flash(所使用的版本是CS5) ...

  2. NDK学习笔记(十二) 原生图形api,使用AVILib创建一个AVI视频播放器

    文章目录 1.练练手,使用AVILib创建一个AVI视频播放器 (1)首先下载transcode,并配置avilib. (2)创建AbstractPlayerActivity并实现native方法 ( ...

  3. 在Qt中如何用纯代码写一个本地视频播放器

    一.首先用纯代码写本地视频播放器需要用到以下类 #include <QWidget> #include <QHBoxLayout> //水平布局 #include <QV ...

  4. QT + OpenGL + FFmpeg写的一个全景视频播放器

    临时被分配了一个任务 写一个C++版本的全景视频播放器 网上搜了搜  基于前辈的基础上 写的差不多了 测试视频源是用ffmpeg拉RTSP的流 最终是要嵌入到别的一个视频播放器模块 所以解码这块我不用 ...

  5. Python+QT+Selenium制作在线视频播放器

    最近突然想做一个视频播放器,可以在线看视频,关键还没用广告,不用会员,下面给大家介绍一下怎么制作 工具: Python Qt phantomjs 先给大家展示一下效果 下面上代码 导入库: from ...

  6. 【OpenCV+Qt】实现简易视频播放器——支持进度条拖动

    OpenCV实现视频播放器,其思路大致就是在线程中使用OpenCV中的VideoCapture循环读取本地视频的每一帧Mat,然后发送到界面转换成QImage进行显示,而进度条拖动则用到了VideoC ...

  7. C6—Qt+mplayer+win10实现视频播放器

    Qt实现视频播放器 目标 Qt的界面中加入mplayer播放器的进程,实现常规播放器的功能.具体功能有:打开文件播放(支持常见的avi.mp4.rmvb格式):播放暂停,播放继续:切换上一个\下一个视 ...

  8. qt实现简单的视频播放器

    1.界面展示 2.功能简介 视频播放器的功能主要有打开文件添加视频.暂停/播放,上一个/下一页,改变音量.进度条等 3.实现思路 1.打开视频(QFielDialog) 一下选择多个视频,用QFile ...

  9. 如何使用Python创建一个自定义视频播放器

    目录 1.安装vlc的64位版本. 2.安装python的vlc模块. 3.编写如下代码,包含了播放,暂停,停止.音量控制功能. 4.来看一看运行结果. 5.如果遇到播放不了的问题,解决方式如下: 这 ...

最新文章

  1. CodeForces - 1363E Tree Shuffling(树上贪心)
  2. 地理信息系统概论_地理信息系统概论黄杏元第3版配套练习题库——才聪学习网...
  3. [html] 如何放大点击的区域?
  4. 查询附近的人——GEO
  5. php发卡8.0源码_素材资源解析平台PHP源码 V8.0运营版+会员功能+代理功能+卡密充值...
  6. Python的numpy基本用法
  7. oracle client安装与配置
  8. .NET Core 中 IOptions 有什么用
  9. android 入门-git之上传本地代码到github
  10. ※ 冯·诺依曼体系结构——模拟 TOY 计算机(MOOC版)
  11. 【OR】YALMIP 几何规划
  12. 谷歌chrome浏览器突然不记录登录状态,怎么办
  13. 怎么学python入门?python新手学习路线
  14. 安装服务器操作系统的iso文件,iso文件怎么安装,详细教您iso系统镜像文件怎么安装...
  15. 上海迪士尼乐园推出全新夜间演出“奇梦之光幻影秀”
  16. 广东省计算机中级职称评定,如何评选广东省中级职称(真实版图文详解),拿走不谢...
  17. ActFramework 轻量级java web框架 (1、快速入门)
  18. 长安大学计算机学什么,长安大学:计算机科学与技术等专业按照一级学科招生...
  19. fcpx如何用光流法_fcpx如何用光流法_熟悉这些fcpx剪辑技巧 快速提高你的剪辑效率...
  20. 发动机曲轴加工工艺与专用机床夹具设计(论文+CAD图纸+工序卡+过程卡+开题报告+任务书+翻译……)

热门文章

  1. 基于51单片机 电子琴程序
  2. axios请求封装(带拦截器)
  3. QT编写实现图片的幻灯片播放、自适应显示、缩放(以鼠标位置为中心进行缩放)、拖动、重置、显示鼠标位置像素坐标及RGB值、播放GIF动画、截图保存、批量保存、拖入文件夹遍历所有文件
  4. 从运维到运营——IT管理的“进化论”
  5. 2022抢先版数字藏品NFT平台|竞拍转拍藏品拍卖分级交易中心支持小程序APPH5三端
  6. 泰语字库,泰文字库,泰文组合算法,泰语组合算法
  7. python期中考试及答案_PYTHON期中考试试卷
  8. Android 主题资源
  9. 在线计算机安装系统,电脑系统在线一键安装软件
  10. TokenGazer CEO 范宏达:DeFi和支付领域值得关注