【Qt+FFmpeg】解码播放本地视频(二)

您所在的位置:网站首页 ffmpeg暂停恢复 【Qt+FFmpeg】解码播放本地视频(二)

【Qt+FFmpeg】解码播放本地视频(二)

2023-08-13 21:51| 来源: 网络整理| 查看: 265

目录

一、FFmpeg解码流程图

二、播放、暂停、重播、倍速功能实现

1.创建播放、重播和倍速按钮

2.设置布局、样式、没有播放完毕前隐藏重播按钮 

3.绑定信号槽

4.实现槽函数

(1)暂停和播放

(2)播放完毕

(3) 重新播放

 (4)倍速

上一期我们解码本地视频并在窗口上进行播放,这期来谈谈如何实现播放、暂停、重播和倍速

如果还没看过上期,请移步【Qt+FFmpeg】解码播放本地视频_logani的博客-CSDN博客

一、FFmpeg解码流程图

二、播放、暂停、重播、倍速功能实现 1.创建播放、重播和倍速按钮

播放和暂停共用一个按钮

pauseBto =new QPushButton("",this); replayBto=new QPushButton("",this); twoSpeedBto=new QPushButton("",this); 2.设置布局、样式、没有播放完毕前隐藏重播按钮  pauseBto->setMinimumSize(35,35);//设置最小值、跳转按钮大小 replayBto->setMinimumSize(35,35); twoSpeedBto->setMinimumSize(35,35); QHBoxLayout *layout2 = new QHBoxLayout;//水平布局 layout2->addWidget(pauseBto,0,Qt::AlignLeft|Qt::AlignBottom);//靠下和左 layout2->addWidget(replayBto,0,Qt::AlignLeft|Qt::AlignBottom); layout2->addStretch();//添加伸缩 layout2->addWidget(twoSpeedBto,0,Qt::AlignRight|Qt::AlignBottom);//靠下和右 layout2->addSpacing(10);//设置离右边框的距离 this->setLayout(layout2); layout2->setMargin(2);//设置外边距 pauseBto->setStyleSheet("QPushButton{border-image: url(icon/暂停.png);}"); replayBto->setStyleSheet("QPushButton{border-image: url(icon/重播.png);}"); twoSpeedBto->setStyleSheet("QPushButton{border-image: url(icon/二倍速.png);}"); replayBto->hide();//隐藏重播按钮 3.绑定信号槽 connect(pauseBto,SIGNAL(clicked(bool)),this,SLOT(pauseAndPlaySlots()));//暂停和播放信号槽 connect(toH264,SIGNAL(sigPlayOver()),this,SLOT(playOverSlots()));//接收视频播放完毕信号槽 connect(replayBto,SIGNAL(clicked(bool)),this,SLOT(replaySlots()));//重新播放信号槽 connect(twoSpeedBto,SIGNAL(clicked(bool)),this,SLOT(SpeedSlots()));//倍速 4.实现槽函数 (1)暂停和播放

定义一个bool类型的标识位标识是播放还是暂停状态,点击完按钮修改对应图标

void playVideoWidget::pauseAndPlaySlots()//暂停和继续 { if(mtemp==false)//播放状态 { toH264->stop();//暂停 pauseBto->setStyleSheet("QPushButton{border-image: url(icon/播放.png);}");//修改图片为播放 mtemp=true; } else { toH264->m_stop=false;//取消暂停 toH264->start();//线程继续 pauseBto->setStyleSheet("QPushButton{border-image: url(icon/暂停.png);}");//修改图片为暂停 mtemp=false; } } (2)播放完毕

解码线程中解码完毕后发送信号

播放完毕显示重播按钮,结束线程,同时播放结束后把按钮改成暂停状态

void playVideoWidget::playOverSlots()//播放完毕槽函数 { replayBto->show();//显示重播按钮 toH264->stop();//暂停 pauseBto->setStyleSheet("QPushButton{border-image: url(icon/播放.png);}");//修改图片为播放 } (3) 重新播放

重新进行读取视频,点击重播按钮后改成播放状态,并隐藏重播按钮

void playVideoWidget::replaySlots()//重播 { toH264->m_stop = false; toH264->openVideoFile(filename);//重头开始 toH264->start();//线程开始 pauseBto->setStyleSheet("QPushButton{border-image: url(icon/暂停.png);}");//修改图片为暂停 mtemp=false; replayBto->hide();//隐藏重播按钮 }  (4)倍速

倍速调整的是解码线程的延时操作,原本是40ms发送一张图片,二倍速就是20ms发送一张图片

 其他倍速可以自行设置

 

初始化一倍速timeSpeed=40;

bool timeSpeedJud判断一倍速还是二倍速 

void playVideoWidget::SpeedSlots()//倍速 { if(timeSpeedJud==false) //一倍速状态 { qDebug()setStyleSheet("QPushButton{border-image: url(icon/一倍速.png);}"); timeSpeedJud=true; } else { qDebug()setStyleSheet("QPushButton{border-image: url(icon/二倍速.png);}"); timeSpeedJud=false; } }

实现效果:

 

 

感谢观看!!!!

以上就是全部内容,如果对您有帮助,欢迎点赞评论,或者发现有哪里写错的,欢迎指正!

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3