当前位置:   article > 正文

QT软件开发:基于QTAV开发跨平台音视频播放器_播放器编写软件

播放器编写软件

一、环境介绍

操作系统: win10 64位

**QT版本: ** QT5.12.6

**编译器: ** MinGW 32

QtAV版本: QtAV-1.12.0

FFMPEG版本: ffmpeg 3.1 使用的是QtAV提供的包,直接使用

完整源码下载: https://download.csdn.net/download/xiaolong1126626497/19759245

二、编译QTAV模块

参考链接: https://blog.csdn.net/xiaolong1126626497/article/details/112209279

三、开发的视频播放器效果

完整播放器下载地址: https://download.csdn.net/download/xiaolong1126626497/15560367

 

四、功能介绍

1. 支持命令行传入视频播放

2. 支持图像旋转播放

3. 支持查看媒体信息

4. 支持选择GPU加速解码

5. 支持快进、快退

6. 支持预览画面(鼠标放在进度条上查看画面缩略图)

7. 支持单帧播放,就是一帧一帧的点击切换画面

8. 支持画面拍照、截图

9. 支持复位到视频首页

10. 支持音量调整

11. 支持拖拽文件到窗口播放

12. 默认打开视频不会自动播放。 自动显示在第一帧,视频放完停留在最后一帧。

13. 支持视频列表

五、示例代码

5.1 整体工程

 本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

5.2 widget.cpp代码

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. Widget::Widget(QString filename,QWidget *parent)
  4. : QWidget(parent)
  5. , ui(new Ui::Widget)
  6. {
  7. ui->setupUi(this);
  8. //设置窗口的标题名称
  9. this->setWindowTitle("视频播放器-DS小龙哥");
  10. //加载样式表
  11. SetStyle(":/resource/VideoPlayer.qss");
  12. //读取配置文件
  13. ReadConfig();
  14. //QTAV初始化
  15. QtAV_InitConfig();
  16. //UI界面相关初始化
  17. UI_InitConfig();
  18. setAcceptDrops(true);
  19. //如果构造函数传入的视频文件就直接加载
  20. if(!filename.isEmpty())
  21. {
  22. load_video_file(0,filename);
  23. }
  24. }
  25. Widget::~Widget()
  26. {
  27. delete ui;
  28. }
  29. /*
  30. 工程: ECRS_VideoPlayer
  31. 日期: 2021-02-23
  32. 作者: DS小龙哥
  33. 环境: win10 QT5.12.6 MinGW32
  34. 功能: 加载样式表
  35. */
  36. void Widget::SetStyle(const QString &qssFile)
  37. {
  38. QFile file(qssFile);
  39. if (file.open(QFile::ReadOnly))
  40. {
  41. QByteArray qss=file.readAll();
  42. qApp->setStyleSheet(qss);
  43. file.close();
  44. }
  45. }
  46. /*
  47. 工程: ECRS_VideoPlayer
  48. 日期: 2021-02-23
  49. 作者: DS小龙哥
  50. 环境: win10 QT5.12.6 MinGW32
  51. 功能: UI界面初始化
  52. */
  53. void Widget::UI_InitConfig()
  54. {
  55. //音量滑块范围设置
  56. ui->horizontalSlider_AudioValue->setMaximum(10);
  57. ui->horizontalSlider_AudioValue->setMinimum(0);
  58. //播放速度设置
  59. ui->MediaSpeedBtn->setCheckable(true);
  60. m_TimeSpeedGrp = new QActionGroup(this);
  61. QStringList strSpeedItems;
  62. strSpeedItems << tr("0.03X") << tr("0.05X") << tr("0.1X") << tr("0.5X") << tr("1.0X") << tr("2.0X") << tr("4.0X") << tr("8.0X");
  63. double speeds[] = { 0.03, 0.05, 0.1, 0.5, 1.0, 2.0, 4.0, 8.0 };
  64. for (int i = 0; i < strSpeedItems.size(); i++)
  65. {
  66. QAction *pSpeedItem = m_SpeedMenu.addAction(strSpeedItems.at(i));
  67. pSpeedItem->setData(QVariant::fromValue(speeds[i]));
  68. pSpeedItem->setCheckable(true);
  69. m_TimeSpeedGrp->addAction(pSpeedItem);
  70. if (i == 4)
  71. {
  72. pSpeedItem->setChecked(true);
  73. }
  74. }
  75. connect(m_TimeSpeedGrp, SIGNAL(triggered(QAction *)), this, SLOT(slot_onSetTimeSpeed(QAction *)));
  76. //图像的旋转方向
  77. m_RotateGrp = new QActionGroup(this);
  78. QStringList strDegrees;
  79. strDegrees << tr("0~") << tr("90~") << tr("180~") << tr("270~");
  80. int Degrees[] = {0, 90, 180, 270 };
  81. for (int i = 0; i < strDegrees.size(); i++)
  82. {
  83. QAction *pItem = m_RotateMenu.addAction(strDegrees.at(i));
  84. pItem->setData(QVariant::fromValue(Degrees[i]));
  85. pItem->setCheckable(true);
  86. m_RotateGrp->addAction(pItem);
  87. }
  88. connect(m_RotateGrp, SIGNAL(triggered(QAction *)), this, SLOT(slot_onMediaRotate(QAction *)));
  89. //截图保存
  90. ui->MediaSnapshotBtn->setCheckable(true);
  91. m_SnapshotGrp = new QActionGroup(this);
  92. QAction *pClipboard = m_SnapshotMenu.addAction(tr("保存到剪切板"));
  93. QAction *pFileDirectory = m_SnapshotMenu.addAction(tr("保存到文件"));
  94. pClipboard->setData(MENU_COPY_CLIPBOARD); //保存到剪切板
  95. pFileDirectory->setData(MENU_SAVE_FILE_SYSTEM); //保存到文件
  96. m_SnapshotGrp->addAction(pClipboard); //添加到分组
  97. m_SnapshotGrp->addAction(pFileDirectory); //添加到分组
  98. connect(m_SnapshotGrp, SIGNAL(triggered(QAction *)), this, SLOT(slot_onMediaSnapshot(QAction *)));
  99. //安装事件监听器 事件筛选器是接收发送到此对象的所有事件的对象
  100. ui->horizontalSlider_PlayPosition->installEventFilter(this);
  101. ui->widget_videoDisplay->installEventFilter(this);
  102. //状态信息初始化
  103. MediaInfo.state=MEDIA_NOLOAD;
  104. //工具提示信息
  105. ui->toolButton_init_load->setToolTip(tr("加载视频,也可以直接将视频文件拖拽到窗口"));
  106. ui->toolButton_load->setToolTip(tr("加载视频,也可以直接将视频文件拖拽到窗口"));
  107. ui->toolButton_media_info->setToolTip(tr("媒体信息"));
  108. ui->MediaPrevBtn->setToolTip(tr("快退"));
  109. ui->MediaPlayBtn->setToolTip(tr("快进"));
  110. ui->MediaPauseBtn->setToolTip(tr("暂停/继续"));
  111. ui->MediaSpeedBtn->setToolTip(tr("倍速选择"));
  112. ui->MediaResetBtn->setToolTip(tr("复位"));
  113. ui->MediaSnapshotBtn->setToolTip(tr("截图"));
  114. ui->MediaRotateBtn->setToolTip(tr("画面旋转"));
  115. ui->ReverseFrameBtn->setToolTip(tr("左一帧"));
  116. ui->ForwardFrameBtn->setToolTip(tr("右一帧"));
  117. ui->VolumeBtn->setToolTip(tr("静音切换"));
  118. ui->checkBox_gpu_set->setToolTip(tr("GPU硬件解码支持(需要重启软件才能生效)"));
  119. //播放进度条滑块初始化
  120. connect(ui->horizontalSlider_PlayPosition, SIGNAL(onLeave()), SLOT(onTimeSliderLeave()));
  121. connect(ui->horizontalSlider_PlayPosition, SIGNAL(onHover(int,int)), SLOT(onTimeSliderHover(int,int)));
  122. connect(ui->horizontalSlider_PlayPosition, SIGNAL(sliderMoved(int)), SLOT(seek(int)));
  123. connect(ui->horizontalSlider_PlayPosition, SIGNAL(sliderPressed()), SLOT(seek()));
  124. this->setMouseTracking(true);
  125. connect(this, SIGNAL(s_pause_state(bool,qint64)),ui->widget_videoDisplay,SLOT(slot_pause_state(bool,qint64)));
  126. connect(this, SIGNAL(s_PlayPosTime(qint64)),ui->widget_videoDisplay,SLOT(slot_PlayPosTime(qint64)));
  127. }
  128. /*
  129. 工程: ECRS_VideoPlayer
  130. 日期: 2021-02-23
  131. 作者: DS小龙哥
  132. 环境: win10 QT5.12.6 MinGW32
  133. 功能: QTAV初始化配置
  134. */
  135. void Widget::QtAV_InitConfig()
  136. {
  137. Widgets::registerRenderers();
  138. m_player = new AVPlayer(this);
  139. m_vo=new my_qtav_videoOut;
  140. m_player->setRenderer(m_vo);
  141. //设置间隔时间(ms单位)
  142. m_player->setNotifyInterval(100);
  143. //设置视频在最后一帧停止
  144. m_player->setMediaEndAction(MediaEndAction_Pause);
  145. //播放的进度改变信号
  146. connect(m_player, SIGNAL(positionChanged(qint64)),this, SLOT(updateSliderPosition(qint64)));
  147. //关联播放器的视频帧显示
  148. connect(m_vo, SIGNAL(SendOneFrame(QImage)),ui->widget_videoDisplay,SLOT(slotGetOneFrame(QImage)));
  149. //设置跳转帧类型
  150. m_player->setSeekType(AccurateSeek);
  151. //得到音频输出接口
  152. m_audio=m_player->audio();
  153. //音量设置
  154. m_audio->setVolume(0.5); //0.0 (silence) to 1.0
  155. ui->horizontalSlider_AudioValue->setValue(5);
  156. //显示进度条上的小窗口
  157. m_preview = new VideoPreviewWidget();
  158. //显示媒体信息的对话框
  159. mpStatisticsView=nullptr;
  160. //播放器信号关联
  161. connect(m_player, SIGNAL(started()), this, SLOT(onStartPlay()));
  162. connect(m_player, SIGNAL(stopped()), this, SLOT(onStopPlay()));
  163. connect(m_player, SIGNAL(paused(bool)), this, SLOT(onPaused(bool)));
  164. //判断是否需要设置硬件解码. 设置解码器的顺序
  165. if(ui->checkBox_gpu_set->isChecked())
  166. {
  167. m_player->setVideoDecoderPriority(QStringList() << "CUDA" << "D3D11" << "DXVA" << "FFmpeg");
  168. }
  169. qDebug()<<m_player->videoDecoderPriority();
  170. }
  171. /*
  172. 工程: ECRS_VideoPlayer
  173. 日期: 2021-02-23
  174. 作者: DS小龙哥
  175. 环境: win10 QT5.12.6 MinGW32
  176. 功能: 更新播放进度
  177. */
  178. void Widget::updateSliderPosition(qint64 value)
  179. {
  180. //QMouseEvent event(QEvent::MouseButtonPress, pos, 0, 0, 0);
  181. //QApplication::sendEvent(hWindow, &amp;event);
  182. // int m_unit = m_player->notifyInterval(); //获取更新间隔时间
  183. // qDebug()<<"视频持续时间:"<<int(m_player->duration()/m_unit);
  184. // qDebug()<<"当前进度:"<<int(value/m_unit);
  185. //设置进度条的时间
  186. ui->horizontalSlider_PlayPosition->setValue(int(value));
  187. //通知播放器显示窗体
  188. emit s_PlayPosTime(value);
  189. //设置右上角的时间
  190. //ui->label_Total_Time->setText(QString("%1").arg(int(m_player->duration()/m_unit)));
  191. //ui->label_current_Time->setText(QString("%1").arg(int(value/m_unit)));
  192. ui->label_current_Time->setText(QTime(0, 0, 0).addMSecs(int(value)).toString(QString::fromLatin1("HH:mm:ss")));
  193. ui->label_Total_Time->setText(QTime(0, 0, 0).addMSecs(int(m_player->mediaStopPosition())).toString(QString::fromLatin1("HH:mm:ss")));
  194. }
  195. /*
  196. 工程: ECRS_VideoPlayer
  197. 日期: 2021-02-23
  198. 作者: DS小龙哥
  199. 环境: win10 QT5.12.6 MinGW32
  200. 功能: 加载视频文件 flag=0 重新加载文件 flag=1 重新开始播放
  201. QString file_path 这参数可以传入文件名称,因为窗口支持拖放文件进来
  202. 返回值: true 成功 false 失败
  203. */
  204. bool Widget::load_video_file(bool flag,QString file_path)
  205. {
  206. if(flag==false)
  207. {
  208. QString filename=file_path;
  209. if(filename.isEmpty())
  210. {
  211. filename=QFileDialog::getOpenFileName(this,"选择播放的视频","D:/",tr("*.mp4 *.wmv *.*"));
  212. }
  213. strncpy(video_name,filename.toUtf8().data(),sizeof(video_name));
  214. ui->toolButton_init_load->setVisible(false);
  215. }
  216. //判断文件是否存在
  217. if(QFileInfo::exists(video_name)==false)
  218. {
  219. return false;
  220. }
  221. else
  222. {
  223. MediaInfo.state=MEDIA_LOAD;
  224. MediaInfo.mediaName=video_name;
  225. }
  226. //每次加载新文件设置播放进度条为0
  227. ui->horizontalSlider_PlayPosition->setValue(0);
  228. qDebug()<<"停止原视频";
  229. //停止播放
  230. m_player->stop();
  231. //播放视频
  232. m_player->play(video_name);
  233. qDebug()<<"当期播放视频:"<<video_name;
  234. //设置当前播放的视频名称
  235. QFileInfo info(video_name);
  236. ui->label_FileName->setText(QString("%1").arg(info.fileName()));
  237. return true;
  238. }
  239. /*
  240. 工程: ECRS_VideoPlayer
  241. 日期: 2021-02-23
  242. 作者: DS小龙哥
  243. 环境: win10 QT5.12.6 MinGW32
  244. 功能: 加载视频文件
  245. */
  246. void Widget::on_toolButton_load_clicked()
  247. {
  248. qDebug()<<"加载视频文件状态:"<<load_video_file(0,"");
  249. }
  250. void Widget::on_toolButton_init_load_clicked()
  251. {
  252. load_video_file(0,"");
  253. }
  254. /*
  255. 工程: ECRS_VideoPlayer
  256. 日期: 2021-02-23
  257. 作者: DS小龙哥
  258. 环境: win10 QT5.12.6 MinGW32
  259. 功能: 暂停播放
  260. */
  261. void Widget::on_MediaPauseBtn_clicked()
  262. {
  263. if (!m_player->isPlaying())
  264. {
  265. //通知播放器
  266. s_pause_state(true,ui->horizontalSlider_PlayPosition->value());
  267. m_player->play();
  268. return;
  269. }
  270. m_player->pause(!m_player->isPaused());
  271. }
  272. /*
  273. 工程: ECRS_VideoPlayer
  274. 日期: 2021-02-23
  275. 作者: DS小龙哥
  276. 环境: win10 QT5.12.6 MinGW32
  277. 功能: 重新开始播放
  278. */
  279. void Widget::on_MediaResetBtn_clicked()
  280. {
  281. //加重新开始播放
  282. load_video_file(true,"");
  283. }
  284. /*
  285. 工程: ECRS_VideoPlayer
  286. 日期: 2021-02-23
  287. 作者: DS小龙哥
  288. 环境: win10 QT5.12.6 MinGW32
  289. 功能: 快退播放
  290. */
  291. void Widget::on_MediaPrevBtn_clicked()
  292. {
  293. // //得到播放进度的当前位置
  294. // int value=ui->horizontalSlider_PlayPosition->value();
  295. // int m_unit = m_player->notifyInterval(); //获取更新间隔时间
  296. // //设置每次点击快退的距离
  297. // m_player->seek(qint64(value*m_unit)-10*m_unit);
  298. m_player->seekBackward();
  299. }
  300. /*
  301. 工程: ECRS_VideoPlayer
  302. 日期: 2021-02-23
  303. 作者: DS小龙哥
  304. 环境: win10 QT5.12.6 MinGW32
  305. 功能: 快进播放
  306. */
  307. void Widget::on_MediaPlayBtn_clicked()
  308. {
  309. // //得到播放进度的当前位置
  310. // int value=ui->horizontalSlider_PlayPosition->value();
  311. // int m_unit = m_player->notifyInterval(); //获取更新间隔时间
  312. // //设置每次点击快进的距离
  313. // m_player->seek(qint64(value*m_unit)+10*m_unit);
  314. m_player->seekForward();
  315. }
  316. /*
  317. 工程: ECRS_VideoPlayer
  318. 日期: 2021-02-23
  319. 作者: DS小龙哥
  320. 环境: win10 QT5.12.6 MinGW32
  321. 功能: 向左一帧
  322. */
  323. void Widget::on_ReverseFrameBtn_clicked()
  324. {
  325. //得到播放进度的当前位置
  326. int value=ui->horizontalSlider_PlayPosition->value();
  327. int m_unit = m_player->notifyInterval(); //获取更新间隔时间
  328. //设置每次点击快退的距离
  329. m_player->seek(qint64(value-m_unit));
  330. }
  331. /*
  332. 工程: ECRS_VideoPlayer
  333. 日期: 2021-02-23
  334. 作者: DS小龙哥
  335. 环境: win10 QT5.12.6 MinGW32
  336. 功能: 向右一帧
  337. */
  338. void Widget::on_ForwardFrameBtn_clicked()
  339. {
  340. //得到播放进度的当前位置
  341. int value=ui->horizontalSlider_PlayPosition->value();
  342. int m_unit = m_player->notifyInterval(); //获取更新间隔时间
  343. m_player->seek(qint64(value+m_unit));
  344. }
  345. /*
  346. 工程: ECRS_VideoPlayer
  347. 日期: 2021-02-23
  348. 作者: DS小龙哥
  349. 环境: win10 QT5.12.6 MinGW32
  350. 功能: 音量设置
  351. */
  352. void Widget::on_VolumeBtn_clicked()
  353. {
  354. //得到音频输出接口
  355. AudioOutput *ao=m_player->audio();
  356. bool checked=ui->VolumeBtn->isChecked();
  357. if(checked)
  358. {
  359. //静音
  360. //音量设置
  361. ao->setVolume(0.0); //0.0 (silence) to 1.
  362. }
  363. else
  364. {
  365. //设置正常音量
  366. qreal volume_val=ui->horizontalSlider_AudioValue->value();
  367. //音量设置
  368. ao->setVolume(volume_val/10.0); //0.0 (silence) to 1.
  369. }
  370. }
  371. /*
  372. 工程: ECRS_VideoPlayer
  373. 日期: 2021-02-23
  374. 作者: DS小龙哥
  375. 环境: win10 QT5.12.6 MinGW32
  376. 功能: 音量设置
  377. */
  378. void Widget::on_horizontalSlider_AudioValue_valueChanged(int value)
  379. {
  380. //得到音频输出接口
  381. AudioOutput *ao=m_player->audio();
  382. //音量设置
  383. ao->setVolume(value/10.0); //0.0 (silence) to 1.
  384. }
  385. /*
  386. 工程: ECRS_VideoPlayer
  387. 日期: 2021-02-23
  388. 作者: DS小龙哥
  389. 环境: win10 QT5.12.6 MinGW32
  390. 功能: 播放速度设置菜单选择
  391. */
  392. void Widget::slot_onSetTimeSpeed(QAction *action)
  393. {
  394. action->setChecked(true);
  395. ui->MediaSpeedBtn->setToolTip(action->text());
  396. ui->MediaSpeedBtn->setText(action->text());
  397. //设置速度 正常速度是1.0
  398. m_player->setSpeed(qreal(action->data().toFloat()));
  399. }
  400. /*
  401. 工程: ECRS_VideoPlayer
  402. 日期: 2021-02-23
  403. 作者: DS小龙哥
  404. 环境: win10 QT5.12.6 MinGW32
  405. 功能: 点击了速度设置按钮
  406. */
  407. void Widget::on_MediaSpeedBtn_clicked()
  408. {
  409. QPoint ptWgt = ui->MediaSpeedBtn->mapToGlobal(QPoint(0, 0));
  410. ptWgt -= QPoint(10, 180);
  411. QAction *pSelect = m_SpeedMenu.exec(ptWgt);
  412. if (pSelect == nullptr)
  413. return;
  414. }
  415. /*
  416. 工程: ECRS_VideoPlayer
  417. 日期: 2021-02-23
  418. 作者: DS小龙哥
  419. 环境: win10 QT5.12.6 MinGW32
  420. 功能: 点击了旋转选择菜单
  421. */
  422. void Widget::slot_onMediaRotate(QAction *action)
  423. {
  424. action->setChecked(true);
  425. ui->MediaRotateBtn->setToolTip(action->text());
  426. ui->widget_videoDisplay->Set_Rotate(action->data().toInt());
  427. }
  428. /*
  429. 工程: ECRS_VideoPlayer
  430. 日期: 2021-02-23
  431. 作者: DS小龙哥
  432. 环境: win10 QT5.12.6 MinGW32
  433. 功能: 点击了画面旋转菜单
  434. */
  435. void Widget::on_MediaRotateBtn_clicked()
  436. {
  437. QPoint ptWgt = ui->MediaRotateBtn->mapToGlobal(QPoint(0, 0));
  438. ptWgt -= QPoint(10, 94);
  439. QAction *pSelect = m_RotateMenu.exec(ptWgt);
  440. if (pSelect == nullptr)
  441. return;
  442. }
  443. /*
  444. 工程: ECRS_VideoPlayer
  445. 日期: 2021-02-24
  446. 作者: DS小龙哥
  447. 环境: win10 QT5.12.6 MinGW32
  448. 功能: 点击了截图菜单
  449. */
  450. void Widget::slot_onMediaSnapshot(QAction *action)
  451. {
  452. if (action == nullptr)
  453. return;
  454. //得到按下的序号
  455. MENU_ITEM item = MENU_ITEM(action->data().toInt());
  456. QImage Pic=ui->widget_videoDisplay->GetImage();
  457. if (Pic.isNull() || Pic.height() <= 0)return;
  458. //保存到剪切板
  459. if (item == MENU_COPY_CLIPBOARD)
  460. {
  461. QApplication::clipboard()->setImage(Pic);
  462. }
  463. //保存到文件
  464. else if (item == MENU_SAVE_FILE_SYSTEM)
  465. {
  466. QString strFile = QDateTime::currentDateTime().toString("yyyyMMddHHmmss") + ".png";
  467. QString strFileName = QFileDialog::getSaveFileName(nullptr, "保存图片", strFile, "PNG(*.png);;BMP(*.bmp);;JPEG(*.jpg *.jpeg)");
  468. if (!strFileName.isEmpty())
  469. {
  470. strFileName = QDir::toNativeSeparators(strFileName);
  471. QFileInfo fInfo(strFileName);
  472. Pic.save(strFileName, fInfo.completeSuffix().toStdString().c_str(), 80);
  473. }
  474. }
  475. }
  476. /*
  477. 工程: ECRS_VideoPlayer
  478. 日期: 2021-02-24
  479. 作者: DS小龙哥
  480. 环境: win10 QT5.12.6 MinGW32
  481. 功能: 点击了截图按钮
  482. */
  483. void Widget::on_MediaSnapshotBtn_clicked()
  484. {
  485. QPoint ptWgt = ui->MediaSnapshotBtn->mapToGlobal(QPoint(0, 0));
  486. ptWgt -= QPoint(10, 48);
  487. QAction *pSelect = m_SnapshotMenu.exec(ptWgt);
  488. if (pSelect == nullptr)
  489. return;
  490. }
  491. /*
  492. 工程: ECRS_VideoPlayer
  493. 日期: 2021-02-24
  494. 作者: DS小龙哥
  495. 环境: win10 QT5.12.6 MinGW32
  496. 功能: 拦截事件
  497. */
  498. bool Widget::eventFilter(QObject *obj, QEvent *event)
  499. {
  500. // //判断是否是视频播放进度条产生了事件,解决QSlider点击不能到鼠标指定位置的问题
  501. // if(obj==ui->horizontalSlider_PlayPosition)
  502. // {
  503. // //暂停状态才可以点击进度条进行跳转
  504. // if(m_player->isPaused())
  505. // {
  506. // if (event->type()==QEvent::MouseButtonPress) //判断类型
  507. // {
  508. // //视频加载成功才能进行下面的操作
  509. // if(MediaInfo.state==MEDIA_LOAD)
  510. // {
  511. // QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
  512. // if (mouseEvent->button() == Qt::LeftButton) //判断左键
  513. // {
  514. // int value = QStyle::sliderValueFromPosition(ui->horizontalSlider_PlayPosition->minimum(), ui->horizontalSlider_PlayPosition->maximum(), mouseEvent->pos().x(), ui->horizontalSlider_PlayPosition->width());
  515. // ui->horizontalSlider_PlayPosition->setValue(value);
  516. // //跳转帧
  517. // int m_unit = m_player->notifyInterval(); //获取更新间隔时间
  518. // m_player->seek(qint64(value*m_unit));
  519. // }
  520. // }
  521. // }
  522. // }
  523. // }
  524. //判断是否在视频窗口范围内按下的鼠标
  525. if(obj==ui->widget_videoDisplay)
  526. {
  527. //视频加载成功才能进行下面的操作
  528. if(MediaInfo.state==MEDIA_LOAD)
  529. {
  530. //判断是否是鼠标事件
  531. if (event->type()==QEvent::MouseButtonPress)
  532. {
  533. QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
  534. //如果按下的是左键
  535. if(mouseEvent->button() == Qt::LeftButton)
  536. {
  537. //如果是暂停状态
  538. if(m_player->isPaused())
  539. {
  540. //继续播放
  541. m_player->pause(false);
  542. //通知播放器
  543. s_pause_state(true,ui->horizontalSlider_PlayPosition->value());
  544. }
  545. else
  546. {
  547. //暂停播放
  548. m_player->pause(true);
  549. }
  550. }
  551. }
  552. }
  553. }
  554. return QObject::eventFilter(obj,event);
  555. }
  556. void Widget::on_toolButton_set_clicked()
  557. {
  558. }
  559. /*
  560. 工程: ECRS_VideoPlayer
  561. 日期: 2021-02-24
  562. 作者: DS小龙哥
  563. 环境: win10 QT5.12.6 MinGW32
  564. 功能: 查看媒体信息
  565. */
  566. void Widget::on_toolButton_media_info_clicked()
  567. {
  568. if(mpStatisticsView==nullptr)
  569. mpStatisticsView = new StatisticsView(this);
  570. if (m_player)
  571. mpStatisticsView->setStatistics(m_player->statistics());
  572. //设置对话框的大小与父窗口一样大
  573. mpStatisticsView->setGeometry(this->geometry());
  574. mpStatisticsView->show();
  575. }
  576. void Widget::onTimeSliderHover(int pos, int value)
  577. {
  578. QPoint gpos = mapToGlobal(ui->horizontalSlider_PlayPosition->pos() + QPoint(pos, 0));
  579. QToolTip::showText(gpos, QTime(0, 0, 0).addMSecs(value).toString(QString::fromLatin1("HH:mm:ss")));
  580. if(ui->widget_videoDisplay->GetImage().height()<=0)
  581. return;
  582. m_preview->setFile(m_player->file());
  583. m_preview->setTimestamp(value);
  584. m_preview->preview();
  585. const int w =ui->widget_videoDisplay->width()/5;
  586. const int h = ui->widget_videoDisplay->height()/5;
  587. m_preview->setWindowFlags(m_preview->windowFlags() |Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
  588. m_preview->resize(w, h);
  589. m_preview->move(gpos - QPoint(w/2, h));
  590. m_preview->show();
  591. }
  592. void Widget::onTimeSliderLeave()
  593. {
  594. if (m_preview && m_preview->isVisible())
  595. m_preview->hide();
  596. }
  597. void Widget::seek(int value)
  598. {
  599. if(ui->widget_videoDisplay->GetImage().height()<=0)
  600. return;
  601. m_player->setSeekType(AccurateSeek);
  602. m_player->seek((qint64)value);
  603. m_preview->setTimestamp(value);
  604. m_preview->preview();
  605. m_preview->setWindowFlags(m_preview->windowFlags() |Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
  606. m_preview->resize(ui->widget_videoDisplay->width()/5,ui->widget_videoDisplay->height()/5);
  607. m_preview->show();
  608. }
  609. void Widget::seek()
  610. {
  611. seek(ui->horizontalSlider_PlayPosition->value());
  612. }
  613. void Widget::onPaused(bool p)
  614. {
  615. if (p) {
  616. ui->MediaPauseBtn->setChecked(true);
  617. qDebug("start pausing...");
  618. } else {
  619. ui->MediaPauseBtn->setChecked(false);
  620. qDebug("stop pausing...");
  621. }
  622. }
  623. void Widget::onStartPlay()
  624. {
  625. if (!m_player)
  626. return;
  627. ui->horizontalSlider_PlayPosition->setMinimum(int(m_player->mediaStartPosition()));
  628. ui->horizontalSlider_PlayPosition->setMaximum(int(m_player->mediaStopPosition()));
  629. //视频第一次加载只显示第一帧画面
  630. //暂停播放
  631. m_player->pause(true);
  632. //偏移到第一帧
  633. int m_unit = m_player->notifyInterval(); //获取更新间隔时间
  634. m_player->seek(qint64(m_unit));
  635. qDebug()<<"开始播放";
  636. }
  637. void Widget::onStopPlay()
  638. {
  639. if (m_preview)
  640. m_preview->setFile(QString());
  641. }
  642. void Widget::dragEnterEvent(QDragEnterEvent *e)
  643. {
  644. if (e->mimeData()->hasUrls())
  645. {
  646. e->acceptProposedAction();
  647. }
  648. }
  649. void Widget::dropEvent(QDropEvent *e)
  650. {
  651. foreach (const QUrl &url, e->mimeData()->urls())
  652. {
  653. QString fileName = url.toLocalFile();
  654. qDebug() << "拖入的文件名称:" << fileName;
  655. //加载视频文件
  656. load_video_file(false,fileName);
  657. }
  658. }
  659. /*
  660. 工程: ECRS_VideoPlayer
  661. 日期: 2021-02-24
  662. 作者: DS小龙哥
  663. 环境: win10 QT5.12.6 MinGW32
  664. 功能: 保存配置
  665. */
  666. void Widget::SaveConfig()
  667. {
  668. //从UI界面获取用户的个性化配置参数
  669. bool val=ui->checkBox_gpu_set->isChecked();
  670. /*保存数据到文件,方便下次加载*/
  671. QString text;
  672. text=QCoreApplication::applicationDirPath()+"/"+ConfigFile;
  673. QFile filesrc(text);
  674. filesrc.open(QIODevice::WriteOnly);
  675. QDataStream out(&filesrc);
  676. out << val; //序列化
  677. filesrc.flush();
  678. filesrc.close();
  679. }
  680. /*
  681. 工程: ECRS_VideoPlayer
  682. 日期: 2021-02-24
  683. 作者: DS小龙哥
  684. 环境: win10 QT5.12.6 MinGW32
  685. 功能: 读取配置
  686. */
  687. void Widget::ReadConfig()
  688. {
  689. //读取配置文件
  690. QString text;
  691. text=QCoreApplication::applicationDirPath()+"/"+ConfigFile;
  692. bool val;
  693. //判断文件是否存在
  694. if(QFile::exists(text))
  695. {
  696. QFile filenew(text);
  697. filenew.open(QIODevice::ReadOnly);
  698. QDataStream in(&filenew); // 从文件读取序列化数据
  699. in >> val; //提取写入的数据
  700. filenew.close();
  701. //设置界面值
  702. ui->checkBox_gpu_set->setChecked(val);
  703. }
  704. }
  705. /*
  706. 工程: ECRS_VideoPlayer
  707. 日期: 2021-02-24
  708. 作者: DS小龙哥
  709. 环境: win10 QT5.12.6 MinGW32
  710. 功能: GPU支持选择
  711. */
  712. void Widget::on_checkBox_gpu_set_clicked(bool checked)
  713. {
  714. SaveConfig();
  715. }

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓


作者:DS小龙哥
链接:https://juejin.cn/post/6985337265384456205

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/575288
推荐阅读
相关标签
  

闽ICP备14008679号