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

本文介绍使用Qt结合FFmpeg实现视频播放器的控制功能,包括播放、暂停、重播及倍速播放等。通过创建按钮并绑定信号槽实现交互,调整解码线程延时达到不同播放速度。

目录

一、FFmpeg解码流程图

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

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

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

3.绑定信号槽

4.实现槽函数

(1)暂停和播放

(2)播放完毕

(3) 重新播放

 (4)倍速

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

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

一、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;
    }
}

实现效果:

 

 

感谢观看!!!!

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

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

logani

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值