【Qt+FFmpeg】解码播放本地视频(二)——实现播放、暂停、重播、倍速功能

目录

一、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()<<"开启二倍速";
        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;
    }
}

实现效果:

感谢观看!!!!

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

猜你喜欢

转载自blog.csdn.net/logani/article/details/127263814