目录
一、FFmpeg解码流程图
二、播放、暂停、重播、倍速功能实现
1.创建播放、重播和倍速按钮
2.设置布局、样式、没有播放完毕前隐藏重播按钮
3.绑定信号槽
4.实现槽函数
(1)暂停和播放
(2)播放完毕
(3) 重新播放
(4)倍速
上一期我们解码本地视频并在窗口上进行播放,这期来谈谈如何实现播放、暂停、重播和倍速
如果还没看过上期,请移步【Qt+FFmpeg】解码播放本地视频_logani的博客-CSDN博客
播放和暂停共用一个按钮
pauseBto =new QPushButton("",this);
replayBto=new QPushButton("",this);
twoSpeedBto=new QPushButton("",this);
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();//隐藏重播按钮
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()));//倍速
定义一个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;
}
}
解码线程中解码完毕后发送信号
播放完毕显示重播按钮,结束线程,同时播放结束后把按钮改成暂停状态
void playVideoWidget::playOverSlots()//播放完毕槽函数
{
replayBto->show();//显示重播按钮
toH264->stop();//暂停
pauseBto->setStyleSheet("QPushButton{border-image: url(icon/播放.png);}");//修改图片为播放
}
重新进行读取视频,点击重播按钮后改成播放状态,并隐藏重播按钮
void playVideoWidget::replaySlots()//重播
{
toH264->m_stop = false;
toH264->openVideoFile(filename);//重头开始
toH264->start();//线程开始
pauseBto->setStyleSheet("QPushButton{border-image: url(icon/暂停.png);}");//修改图片为暂停
mtemp=false;
replayBto->hide();//隐藏重播按钮
}
倍速调整的是解码线程的延时操作,原本是40ms发送一张图片,二倍速就是20ms发送一张图片
其他倍速可以自行设置
初始化一倍速timeSpeed=40;
bool timeSpeedJud判断一倍速还是二倍速
void playVideoWidget::SpeedSlots()//倍速
{
if(timeSpeedJud==false) //一倍速状态
{
qDebug()<<"开启二倍速";
toH264->setTimeSpeed(20);//二倍速,20ms一帧,1s50帧
twoSpeedBto->setStyleSheet("QPushButton{border-image: url(icon/一倍速.png);}");
timeSpeedJud=true;
}
else
{
qDebug()<<"开启一倍速";
toH264->setTimeSpeed(40);//一倍速,40ms一帧,1s25帧
twoSpeedBto->setStyleSheet("QPushButton{border-image: url(icon/二倍速.png);}");
timeSpeedJud=false;
}
}
实现效果:
感谢观看!!!!
以上就是全部内容,如果对您有帮助,欢迎点赞评论,或者发现有哪里写错的,欢迎指正!