ffmpeg+qt视频进度条控制——点击跳转和拖动跳转(代码片段)

logani logani     2023-03-30     434

关键词:

首先进度条采用Qslider,设置进度条主要有两点,一是当前视频总时长,二是当前播放时长,需要通过FFmpeg转码成mp4文件才能获取相应的时长数据;

往期回顾:

【Qt+FFmpeg】视频转码详细流程_logani的博客-CSDN博客_qt+ffmpeg视频流

【Qt+FFmpeg】编码视频详细流程_logani的博客-CSDN博客_qt 视频编码

【Qt+FFmpeg】解码播放本地视频(一)_logani的博客-CSDN博客_ffmpeg 打开本地视频

 1.获取视频总时长

视频时长就封装在 AVFormatContext *formatContext 编解码上下文环境结构体的 duration 结构体成员中 ;AVFormatContext 中提取的 duration获取总视频总时长,单位是微秒;

2.获取当前时长:

AVFrame 结构体中封装的 best_effort_timestamp 元素值,就是当前视频帧的相对播放时间,其单位是AVRational,需要转换成秒,可以用视频流中提供的时间基

3.进行拖动跳转

在知道如何做之前,我们要先了解Qslider的几个信号,我们拖动时就需要用到点击、滑动和释放信号:

1.移动滑动条时发出的信号

void sliderMove(int value);
2.点击滑动条时所发出的信号

void sliderPressed();
 3.释放时所发出的信号

void sliderReleased();

拖动跳转主要用到滑动信号和释放信号; 

调用av_seek_frame函数查找进度条点击或拖动位置的帧数并跳转到该帧开始播放 ;

由于上述的播放时间已转成了秒为单位,所以这边将传入的秒转为微秒 

av_seek_frame ( ) 函数原型 : 查找第 stream_index 个媒体流的 timestamp 微秒附近的关键帧 , 并跳转到该帧开始播放 ;
① AVFormatContext **ps 参数 : 封装了文件格式相关信息的结构体 , 如视频宽高 , 音频采样率等信息 ; 该参数是 二级指针 , 意味着在方法中会修改该指针的指向 , 该参数的实际作用是当做返回值用的 ;

② int stream_index 参数 : 音视频流索引 , 如果设置 -1 , 说明是所有的媒体流同时跳转 ;

③ int64_t timestamp 参数 : 要跳转的目的时间戳 , 之后要在该时间附近查找关键帧 ;

④ int flags 参数 : 设置跳转模式 ;

⑤ int 返回值 : 返回值大于等于 0 , 代表打开成功 , 否则失败 ;

 为了在用户拖动过程中不修改slider的值,这边采用定时器在拖动时暂停修改进度条,释放进度条时再开启定时器;

/*****************************************************************
* 函数名称::sliderMoveSlot()
* 功能描述:拖动进度条,停止定时器
* 参数说明: 无
* 返回值:   无
******************************************************************/
void playbackVideowin::sliderMoveSlot()

    //暂时停止计时器,在用户拖动过程中不修改slider的值
    timer->stop();

/*****************************************************************
* 函数名称::sliderReleaseSlot()
* 功能描述:释放进度条,重启定时器,修改视频当前位置
* 参数说明: 无
* 返回值:   无
******************************************************************/
void playbackVideowin::sliderReleaseSlot()

    timer->start(40);
    int currentValue=playProgressBar->value();
    pDeCoding->changeCurrentValue(currentValue);

4.进行点击跳转,重写一个进度条类

因为系统自带的进度条点击时只能移动一小段,不能实现点哪就移动到哪,所以我们要自己重写一个进度条类

void newqslider::mousePressEvent(QMouseEvent *ev)

    //先调用父类的鼠标点击处理事件,这样可以不影响拖动的情况
    QSlider::mousePressEvent(ev);
    //获取鼠标的位置,这里并不能直接从ev中取值(因为如果是拖动的话,鼠标开始点击的位置没有意义了)
    double pos = ev->pos().x() / (double)width();
    setValue(pos * (maximum() - minimum()) + minimum());
    //发送自定义的鼠标单击信号
    emit costomSliderClicked();

 进度条点击槽函数

/*****************************************************************
* 函数名称::sliderClickedSlot()
* 功能描述:点击进度条
* 参数说明: 无
* 返回值:   无
******************************************************************/
void playbackVideowin::sliderClickedSlot()

    int currentValue=playProgressBar->value();
    pDeCoding->changeCurrentValue(currentValue);

信号槽连接

本文借鉴了

【Android FFMPEG 开发】FFMPEG 视频播放进度控制 ( 显示播放进度 | 拖动进度条播放 )_韩曙亮的博客-CSDN博客_安卓开发 ffmpeg如何获取视频当前播放进度

感谢观看!!!!

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

opencv+qt实现简易视频播放器——支持进度条拖动(代码片段)

OpenCV实现视频播放器,其思路大致就是在线程中使用OpenCV中的VideoCapture循环读取本地视频的每一帧Mat,然后发送到界面转换成QImage进行显示,而进度条拖动则用到了VideoCapture中的set函数,进度条则是使用Qslider࿱... 查看详情

html5video标签怎样禁止拖动或者点击进度条

...现不能拖动,但是可以模拟下,你可以使用让鼠标点击到视频所在的video或者div的时候无效化,原理就是鼠标选不到进度条,自然不能拖动了。如果你是要可以控制播放和暂停的话就实现js控制,反正是跳过video自带的控制器自己... 查看详情

ios开发之在线视频播放,进度精准拖动

参考技术A本文讲解的是iOS视频播放,支持本地,在线播放.进度拖动,精准跳转,获取视频的长度等问题demo记得点亮star.3QiOS视频播放主要使用的类AVPlayerItem,AVPlayerLayer,AVPlayerAVPlayerItem:提供视频信息,利用视频的url创建一个对象.利用kvo... 查看详情

alpha版本测试报告

...Y音量控制点击或拖动音量条控制音量大小调整音量大小N进度控制点击或拖动进度条控制音乐进度调整当前播放进度N时长当前播放时长显示当前播放时长Y播放结束音乐播放结束显示时长为00:00Y(2)测试记录本次采用黑盒手工测... 查看详情

androidapp开发音量调节中实现拖动条和滑动条和音频管理器audiomanager讲解及实战(超详细附源码和演示视频)(代码片段)

...f0c;还可以由用户拖动操作改变进度值,在播放音频和视频时,用户通过拖动条控制播放器快进或快退到指定位置,然后从新位置开始播放,除此之外,拖动条还可以调节音量大小,屏幕亮度,字体大小... 查看详情

像寻求拖动视频进度条这样的视频控件在 HTML 中不起作用?

】像寻求拖动视频进度条这样的视频控件在HTML中不起作用?【英文标题】:VideocontrolslikeseekdraggingvideoprogressbarisnotworkinginHTML?【发布时间】:2021-08-0400:12:11【问题描述】:像寻找10秒视频进度条拖动这样的视频控件在HTML中不起作... 查看详情

如何在vue项目中给路由跳转加上进度条(代码片段)

...当点击页面中的链接进行路由跳转时,页面顶部会有一个进度条,用来标示页面跳转的进度(如下图所示)。虽然实际用处不大,但是对用户来说,有个进度条会大大减轻用户的等待压力,提升用户体验。本篇文章就来教你如何... 查看详情

通过加速或跳过网页视频解决进度条无法拖动问题

加速网页视频与跳过网页视频1、加速网页视频(1)F12打开开发者工具,然后Ctrl+Shift+C检查video元素检查video元素(2)控制台输入脚本functionaccelerate()letvideo=document.querySelector(‘video’);functionplay()video.pla... 查看详情

javascript实现video视频进度条拖动无效

在某些时候项目中会用到video,想让用户看完视频而不是一下拖到底结束,这种时候就要实现进度条拖动失效,用户拖动时会记录拖动上一秒的currentTime,在拖动结束后返回上一秒的位置,以此实现拖动失效效... 查看详情

HTML5 视频播放器进度条准确提示

】HTML5视频播放器进度条准确提示【英文标题】:HTML5VideoPlayerProgressBarAccurateTooltip【发布时间】:2021-05-2622:14:38【问题描述】:大多数视频播放器允许您单击进度条跳转到视频中的特定点,方法是使用鼠标在进度条上的位置来粗... 查看详情

seekbar(拖动条)

...信大家对他并不陌生,最常见的地方就是音乐播放器或者视频播放器了,音量控制或者播放进度控制,都用到了这个SeekBar,我们先来看看SeekBar的类结构,来到官方文档:SeekBar嘿嘿,这玩意是ProgressBar的子类耶,也就是ProgressBar... 查看详情

js控制进度条到达100%跳转界面一

进度条一般在手机上用到的比较广泛,刚好最近的项目也是一直在做手机站,这个特效是手机端的一个界面,现在我把改成pc端了,进度条的快慢速度和样式可自行调节,改动也是很方便的,不多说,看代码:<!DOCTYPEhtml><h... 查看详情

在线视频的进度条被锁定,缓冲都好了。就是不允许拖动。有啥方法可以破解

我需要在线看完这一集才能看下一集,所以把视频下载下来到本地看的方法不是我需要的,不在线看完我就完成不了任务,但是视频的进度条又禁止拖动!。参考技术A除了你是电脑高手,或者破解服务器,其他没有办法, 查看详情

腾讯视频进度条显示一半

参考技术A调整进度的步骤:打开“腾讯视频”APP,进入视频首页,选择自己需要放映的视频。2.进入选择的视频之后,点击选择右上角的“TV”选项。3.选择需要与手机连接的同一网络下的电视,点击投放至电视。4.此时手机视频... 查看详情

视频控制的简易进度条

视频控制的简易进度条样式:作用:控制视频的播放点,实时显示视频播放位置 html:<divclass="coll"><spanname="progress"><b></b><b></b><b></b></span></div>css:.coll{position:abs 查看详情

关于前端video标签视频无法拖动进度条快进问题(django)(代码片段)

因为后端返回的是视频的文件流,并不是视频文件地址。后端返回流的时候要为header设置一些参数,否则部分浏览器会出现问题(如GoogleChrome...)。django中常用返回文件流写法:classVideoAPIView(APIView):"""视频视图-... 查看详情

关于前端video标签视频无法拖动进度条快进问题(django)(代码片段)

因为后端返回的是视频的文件流,并不是视频文件地址。后端返回流的时候要为header设置一些参数,否则部分浏览器会出现问题(如GoogleChrome...)。django中常用返回文件流写法:classVideoAPIView(APIView):"""视频视图-... 查看详情

进度条与拖动条的使用学习(代码片段)

...度的持续时间android:secondaryProgress:二级进度条,类似于视频播放的一条是当前播放进度,一条是缓冲进度,前者通过progress属性进行设置!对应的再Java中我们可调用下述方法:getMax():返回这个进度条的范围的上限getProgress():... 查看详情