基于QT与mplayer的视频播放器

greenlight

发布日期: 2018-11-15 11:06:06 浏览量: 1827
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

一、课题的介绍和课题的任务

1.1 课题的介绍

本次课程设计我选的题目是视频播放器。目前市场上各种应用商店上有各种播放器,而且功能都很强大。一直对里面的具体实现有兴趣,所以这次就尝试着写了个视频播放器。并且加进去了一些很实用的功能,比如截屏和录屏。

1.2 课题的任务

包括视频的播放暂停、音量的加减、播放速度的设置、以及视频文件的添加删除、屏幕的截屏以及录屏。画面不卡顿。播放时进度条能刷新。

二、设计的要求

  • 能进行视频的播放

  • 能暂停正在播放的视频

  • 能播放正在暂停的视频

  • 能调节视频播放的视频

  • 能进行视频播放进度的调节

  • 能停止正在播放的视频

  • 能添加新的视频文件到播放列表

  • 能删除播放列表中选中的视频

  • 能改变视频播放的速度

  • 能对正在播放的视频进行截屏

  • 能录制正在播放的视频

三、系统的分析和系统中类的设计

  • 窗口类QMainWidndow

  • 按钮类QPushButton

  • 标签类QLabel

  • 列表类QList

  • 滑动条类QSilider

  • 显示类QWidge

四、系统的实现及调试

系统模块框架图

程序具体实现

4.1 添加文件进视频播放列表

代码实现

  1. void mplayer_video::on_open_clicked()
  2. {
  3. QStringList filenames =QFileDialog::getOpenFileNames(this,tr("选择文件"),"/",tr("视频文件(*mp3 *mp4 *wma *3gp *wav *avi *flv *rmvb *mkv *ts *wmv)")); // *号和前面的要隔开至少一个空格,不能连起来。
  4. if(filenames.count()!=0)
  5. ui->list->addItems(filenames);
  6. }

4.2 双击列表选项进行播放

代码实现

  1. void mplayer_video::on_list_itemDoubleClicked(QListWidgetItem *item)
  2. {
  3. speed=1;
  4. ui->lupin_lable->setVisible(false);
  5. play(item->text());
  6. }
  7. void mplayer_video::play(QString fileName)
  8. {
  9. QStringList arg1;
  10. process->kill();
  11. process=new QProcess(this);
  12. arg1 << fileName;
  13. arg1 << "-slave";//默认情况下,mplayer接受键盘的命令,而"-slave"使其不再接受键盘事件,而是作为后台程序运行,
  14. //接受以“\n”结束的命令控制,这样我们可以在进程中给他发送命令,而不需要操作键盘了.
  15. arg1 << "-quiet"; //尽可能的不打印播放信息
  16. arg1 << "-zoom"; //视频居中,四周黑条,全屏播放
  17. arg1 << "-wid" << QString::number((unsigned int)(ui->widget->winId()));
  18. // "-wid <窗口标识>" 是指让MPlayer依附于那个窗口,
  19. //ui->widget->winId() 这个指令就是用来获取widget的标识码 ,
  20. //这样视频播放的时候,就在这个部件里播放,相当于给他固定起来。
  21. connect(process,SIGNAL(readyReadStandardOutput()),this,SLOT(dataRecieve()));
  22. process->start(arg,arg1); //开始播放进程
  23. ui->zanting->setText("暂停");
  24. }
  25. void mplayer_video::dataRecieve()
  26. {
  27. process->write("get_time_length\n");
  28. process->write("get_time_pos\n");
  29. process->write("get_percent_pos\n");
  30. while(process->canReadLine())
  31. {
  32. QByteArray b=process->readLine();
  33. if(b.startsWith("ANS_TIME_POSITION"))
  34. {
  35. b.replace(QByteArray("\n"),QByteArray(""));
  36. QString s(b);
  37. currentStr=s.mid(18);
  38. ui->horizontalSlider->setValue(s.mid(18).toFloat()); //更新进度条
  39. }
  40. else if((b.startsWith("ANS_LENGTH")))
  41. {
  42. b.replace(QByteArray("\n"),QByteArray(""));
  43. QString s(b);
  44. totalTime=s.mid(11);
  45. ui->label_time->setText(currentStr+"秒/"+totalTime+"秒 "); //显示时间进度
  46. ui->horizontalSlider->setRange(0,s.mid(11).toFloat());
  47. }
  48. else if((b.startsWith("ANS_PERCENT_POSITION")))
  49. {
  50. b.replace(QByteArray("\n"),QByteArray(""));
  51. QString s(b);
  52. currentPercent=s.mid(21);
  53. ui->percentLabel->setText(currentPercent+"%");
  54. }
  55. }
  56. }

4.3 播放与暂停的实现

代码实现

  1. void mplayer_video::on_zanting_clicked()
  2. {
  3. ui->lupin_lable->setVisible(false);
  4. process->write("pause\n");
  5. //ui->list->currentRow()!=-1 判断是否有选中某条数据
  6. //play(ui->list->item(ui->list->currentRow())->text()); 播放选中的某条数据
  7. if(ui->zanting->text()=="播放")
  8. {
  9. if(ui->list->count()==0)
  10. QMessageBox::warning(this,"提示","播放列表为空",QMessageBox::Yes);
  11. else
  12. {
  13. connect(process,SIGNAL(readyReadStandardOutput()),this,SLOT(dataRecieve()));
  14. process->write("get_time_length\n");
  15. process->write("get_time_pos\n");
  16. process->write("get_percent_pos\n");
  17. ui->zanting->setText("暂停");
  18. }
  19. }
  20. else
  21. {
  22. disconnect(process,SIGNAL(readyReadStandardOutput()),this,SLOT(dataRecieve()));
  23. ui->zanting->setText("播放");
  24. }
  25. }

4.4 快进与回退

代码实现

  1. void mplayer_video::on_back_clicked()
  2. {
  3. process->write("seek -10\n");
  4. }
  5. void mplayer_video::on_quick_clicked()
  6. {
  7. process->write("seek +10\n");
  8. }

4.5 加速与减速

代码实现

  1. void mplayer_video::on_back_clicked()
  2. {
  3. process->write("seek -10\n");
  4. }
  5. void mplayer_video::on_quick_clicked()
  6. {
  7. process->write("seek +10\n");
  8. }

4.6 停止播放

代码实现

  1. void mplayer_video::on_stop_clicked()
  2. {
  3. process->write("quit\n");
  4. ui->horizontalSlider->setSliderPosition(0);
  5. ui->label_time->clear();
  6. ui->percentLabel->clear();
  7. ui->zanting->setText("播放");
  8. }

4.7 从播放列表中删除中选中的视频

代码实现

  1. void mplayer_video::on_del_clicked()
  2. {
  3. if(ui->list->currentRow()==-1)
  4. QMessageBox::warning(this,"提示","未选中项目或列表为空",QMessageBox::Yes);
  5. else
  6. {
  7. ui->list->takeItem(ui->list->currentRow());
  8. process->close();
  9. ui->horizontalSlider->setSliderPosition(0); //更新进度条
  10. ui->label_time->clear();
  11. ui->percentLabel->clear();
  12. }
  13. }

4.8 加速播放与减速播放

代码实现

定义一个全局静态浮点型变量 speed并初始化为1,每次点击加速,speed的值乘以二,每次点击减速,speed的值除以2

  1. void mplayer_video::on_jiansu_clicked()
  2. {
  3. speed=speed/2;
  4. process->write(QString("speed_set "+QString::number(speed)+" 2\n").toUtf8());
  5. }
  6. void mplayer_video::on_jiasu_clicked()
  7. {
  8. speed=speed*2;
  9. process->write(QString("speed_set "+QString::number(speed)+" 2\n").toUtf8());
  10. }

4.9 视频播放进度条的刷新

这是本程序里最复杂的部分之一。

主要实现是用connect函数链接进程与DataRecieve函数

代码实现

  1. void mplayer_video::dataRecieve()
  2. {
  3. process->write("get_time_length\n");
  4. process->write("get_time_pos\n");
  5. process->write("get_percent_pos\n");
  6. while(process->canReadLine())
  7. {
  8. QByteArray b=process->readLine();
  9. if(b.startsWith("ANS_TIME_POSITION"))
  10. {
  11. b.replace(QByteArray("\n"),QByteArray(""));
  12. QString s(b);
  13. currentStr=s.mid(18);
  14. ui->horizontalSlider->setValue(s.mid(18).toFloat()); //更新进度条
  15. }
  16. else if((b.startsWith("ANS_LENGTH")))
  17. {
  18. b.replace(QByteArray("\n"),QByteArray(""));
  19. QString s(b);
  20. totalTime=s.mid(11);
  21. ui->label_time->setText(currentStr+"秒/"+totalTime+"秒 "); //显示时间进度
  22. ui->horizontalSlider->setRange(0,s.mid(11).toFloat());
  23. }
  24. else if((b.startsWith("ANS_PERCENT_POSITION")))
  25. {
  26. b.replace(QByteArray("\n"),QByteArray(""));
  27. QString s(b);
  28. currentPercent=s.mid(21);
  29. ui->percentLabel->setText(currentPercent+"%");
  30. }
  31. }
  32. }

4.10 声音滑动条对声音的调节

代码实现

  1. void mplayer_video::on_voice_slider_sliderMoved(int v)
  2. {
  3. if(ui->zanting->text()=="播放")
  4. {
  5. process->write(QString("volume "+QString::number(v)+" 2\n").toUtf8());
  6. process->write("pause\n");
  7. }
  8. else{
  9. process->write(QString("volume "+QString::number(v)+" 2\n").toUtf8());
  10. }
  11. }

4.11 设置图片按钮

代码实现

  1. QPixmap pixmap;
  2. pixmap.load("G:/mplayer_video/voice.jpg");
  3. ui->voice->setFixedSize(pixmap.width(),pixmap.height());
  4. ui->voice->setIcon(pixmap);
  5. ui->voice->setIconSize(QSize(pixmap.width(),pixmap.height()));
  6. ui->voice->setToolTip("音量");
  7. ui->voice->show();

4.12 屏幕截图

代码实现

  1. void mplayer_video::on_jietu_clicked()
  2. {
  3. cout<<"ok"<<endl;
  4. process->write("pause\n");
  5. if(ui->zanting->text()=="播放")
  6. {
  7. cout<<"1"<<endl;
  8. QPixmap snapImage = QPixmap::grabWindow(QApplication::desktop()->winId());
  9. QString filename;
  10. QString slcStr;
  11. filename = QFileDialog::getSaveFileName(this,tr("保存图片"),"./未命名",tr("PNG(*.png);;JPG(*.jpg);;BMP(*.bmp)"),&slcStr);//弹出保存图片的文件窗口
  12. if(slcStr.left(3)=="JPG")
  13. {
  14. if(filename.right(3)!="jpg")
  15. {
  16. filename+=".jpg";
  17. }
  18. }
  19. if(slcStr.left(3)=="PNG")
  20. {
  21. if(filename.right(3)!="png")
  22. {
  23. filename+=".png";
  24. }
  25. }
  26. if(slcStr.left(3)=="BMP")
  27. {
  28. if(filename.right(3)!="bmp")
  29. {
  30. filename+=".bmp";
  31. }
  32. }
  33. if(filename!=NULL)
  34. {
  35. snapImage.save(filename);
  36. }
  37. }
  38. else
  39. {
  40. cout<<"2"<<endl;
  41. disconnect(process,SIGNAL(readyReadStandardOutput()),this,SLOT(dataRecieve()));
  42. ui->zanting->setText("播放");
  43. QPixmap snapImage = QPixmap::grabWindow(QApplication::desktop()->winId());
  44. QString filename;
  45. QString slcStr;
  46. filename = QFileDialog::getSaveFileName(this,tr("保存图片"),"./未命名",tr("PNG(*.png);;JPG(*.jpg);;BMP(*.bmp)"),&slcStr);//弹出保存图片的文件窗口
  47. if(slcStr.left(3)=="JPG")
  48. {
  49. if(filename.right(3)!="jpg")
  50. {
  51. filename+=".jpg";
  52. }
  53. }
  54. if(slcStr.left(3)=="PNG")
  55. {
  56. if(filename.right(3)!="png")
  57. {
  58. filename+=".png";
  59. }
  60. }
  61. if(slcStr.left(3)=="BMP")
  62. {
  63. if(filename.right(3)!="bmp")
  64. {
  65. filename+=".bmp";
  66. }
  67. }
  68. if(filename!=NULL)
  69. {
  70. snapImage.save(filename);
  71. }
  72. connect(process,SIGNAL(readyReadStandardOutput()),this,SLOT(dataRecieve()));
  73. process->write("get_time_length\n");
  74. process->write("get_time_pos\n");
  75. process->write("get_percent_pos\n");
  76. ui->zanting->setText("暂停");
  77. }
  78. }

4.13 屏幕录制

代码实现

  1. void mplayer_video::on_lupin_clicked()
  2. {
  3. if(ui->lupin->text()=="录屏")
  4. {
  5. photoStart();
  6. timer->start(50);
  7. ui->lupin->setText("停止");
  8. }
  9. else
  10. {
  11. timer->stop();
  12. ui->lupin->setText("录屏");
  13. }
  14. }
  15. void mplayer_video::photoStart()
  16. {
  17. QDir *d = new QDir();
  18. QString dirName("D:\\video");
  19. if(!d->exists(dirName))
  20. {
  21. d->mkdir(dirName);
  22. }
  23. }
  24. void mplayer_video::timerUpdate()
  25. {
  26. QPixmap p;
  27. QString dirNamee("D:\\video\\");
  28. dirNamee=dirNamee+QString::number(number)+".jpg";
  29. p = QPixmap::grabWindow(QApplication::desktop()->winId());
  30. p.save(dirNamee);
  31. number+=1;
  32. }

4.14 屏幕录屏播放

代码实现

  1. void mplayer_video::on_lupinstart_clicked()
  2. {
  3. process->write("quit\n");
  4. QString dirName("D:\\video");
  5. qdir = new QDir(dirName);
  6. qdir->setSorting(QDir::Reversed|QDir::Time);
  7. list = qdir->entryInfoList();
  8. number2=0;
  9. timer2->start(100);
  10. }
  11. void mplayer_video::on_stop_bofang_clicked()
  12. {
  13. timer2->stop();
  14. ui->lupin_lable->setVisible(false);
  15. }

五、系统的使用说明

打开程序,点击添加文件进行视频播放列表视频的添加。双击列表中某条记录进行视频的播放,播放按钮自动转换成暂停按钮。点击播放将会播放视频,点击暂停视频会暂停。除了一些视频播放器的基本功能外,本程序还加入了屏幕截图与屏幕录制的功能。具体操作用按钮可以实现。

上传的附件 cloud_download 基于mplayer开发的视频播放器.7z ( 1.52mb, 139次下载 )
error_outline 下载需要8点积分

keyboard_arrow_left上一篇 : 基于C语言的饭卡程序 基于javascript的银行家算法 : 下一篇keyboard_arrow_right



greenlight
2018-11-15 11:08:49
课设就用 Qt 弄了个界面,调了下 mplayer 来做视频播放器了

发送私信

幸福的绿光在哪里

20
文章数
20
评论数
最近文章
eject