【FFmpeg+Qt】视频进度条控制——点击跳转和拖动跳转

news2024/11/27 22:12:47

首先进度条采用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如何获取视频当前播放进度

感谢观看!!!!

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/101437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从用户测试中学到的知识

从客户那里获得良好的反馈是个挑战。用户测试有的时候看起来是一个艰巨而且昂贵的任务。但是用户测试可以带来良好的经验,从而帮助设计更好的产品。 那么,从哪里开始呢?我测试了几种方法,有些失败,有些成功。下面我将讲述我所学到…

基于JAVA的教学进度在线管理系统/教学大纲在线管理系统源代码+数据库,含详细项目需求分析、概要设计、详细设计及项目总结文档

项目启动步骤 使用 SQL_Scripts/tms.sql 中的 sql 语句创建数据库与数据库表(数据库建立中,暂无) 修改 src/a_little_config.txt 文件,填入正确的数据库连接用户名、密码 将项目导入 IntelliJ IDEA 或 eclipse。 打开 cn.findix.tms.bin 包下的 WWW 文…

C#使用随机数模拟器来模拟世界杯排名(三)

接上篇 C#使用随机数模拟器来模拟世界杯排名(二)_斯内科的博客-CSDN博客 上一篇我们使用随机数匹配比赛的世界杯国家, 这一篇我们使用随机数以及胜率模拟器 决赛出 世界杯冠军、亚军。 我们在主界面 新增按钮【开始比赛 直到 决出冠军】和【刷新重新随机分配】 …

Python语言程序设计实验报告

第二章:Python变量与数据类型 一、实验目的: 1.了解Python变量的概念与相关含义; 2.学习Python中的数据类型; 二、实验环境: 1.笔记本电脑 2.PyCharm Community Edition 2022.2.3工具 三、实验内容: 1.将字…

ZABBIX6.0LTS安装笔记

一、准备好干净的操作系统 推荐使用:Rocky Linux 8.6 二、安装ZABBIX 官网:https://www.zabbix.com/cn/download 【1】选择您Zabbix服务器的平台 【2】 安装Zabbix包 下载安装包源 # rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabb…

Spring的动态AOP源码解析

一… 引入 1.1 概念 1.2 注解方式使用AOP @Aspect public class LogAspects {/*** 1. 本类引用,只需要写方法名* 2. 其他类引用,需要写路径*/@Pointcut("execution(public int com.floweryu.aop.MathCalculator.*(..))")public void pointCut

Linux--进程间通信

目录1. 进程间通信目的2. 管道2.1 管道特性(匿名管道)2.1.1 单向通信2.1.2 面向字节流2.2 管道的大小2.3 命名管道3. system V进程间通信3.1 shmget函数3.1.1 key VS shmid3.2 shmctl函数3.3 shmat函数 VS shmdt函数:3.4 测试4. 感性认识4.1 …

R语言中的多类别问题的绩效衡量:F1-score 和广义AUC

最近我们被客户要求撰写关于分类的研究报告,包括一些图形和统计输出。对于分类问题,通常根据与分类器关联的混淆矩阵来定义分类器性能。根据混淆矩阵 ,可以计算灵敏度(召回率),特异性和精度。 对于二进制…

基于javaweb物业管理系统的设计与实现/小区物业管理系统

摘 要 随着世界经济快速的发展,全国各地的城市规模不断扩大,住进城市的人口日益增多,房地产行业在现代社会的发展中有着重要的作用,有越来越多的人居住在小区里。 因此,一套高效并且无差错的物业管理系统软件在现代社会…

基于Android的校园一卡通App平台

演示视频信息: A6604基于Android的校园一卡通一、研究背景、目的及意义 (一)研究背景 二十一世纪是信息化的时代,信息化建设成为我们的首要任务。当前我国大力发展信息产业,在全国范围内各行各业开始实施信息化…

为什么要上机械制造业ERP系统?对企业有什么帮助?

在日益竞争激烈的市场背景下,机械制造企业提供的产品需要具有更短的交货期、更高的质量、更好的服务。而机械行业由于其工艺复杂的生产特点,工艺及在制品管理困难,单纯的靠手工记账处理,已经难以满足现代企业科学管理的需要。只有…

艾美捷IFN-gamma体内抗体参数及应用

艾美捷IFN-gamma体内抗体背景: 干扰素γ(IFN-γ)或II型干扰素是一种二聚可溶性细胞因子,是II型干扰素的唯1成员。它是一种细胞因子,对抵抗病毒和细胞内细菌感染的先天性和适应性免疫以及肿瘤控制至关重要。IFNG主要由…

TensorFlow平台应用

目录 一:TensorFlow简介 二:TensorFlow工作形式 三:图/Session 四:安装tensorflow 五:张量 六:变量/常量 七:创建数据流图、会话 八:张量经典创建方法 九:变量赋…

[Java EE初阶]Thread 类的基本用法

本就无大事,庸人觅闲愁. 文章目录1. 线程创建2. 线程中断2.1 通知终止后立即终止2.2 通知终止,通知之后线程继续执行2.3 通知终止后,添加操作后终止3. 线程等待4. 线程休眠5. 获取线程实例1. 线程创建 创建线程有五个方法 详情见我的另一个文章 https://editor.csdn.net/md/?…

【K8S系列】第十二讲:Service进阶

目录 ​编辑 序言 1.Service介绍 1.1 什么是Service 1.2 Service 类型 1.2.1 NodePort 1.2.2 LoadBalancer 1.2.3 ExternalName 1.2.4 ClusterIP 2.yaml名词解释 3.投票 序言 当发现自己的才华撑不起野心时,就安静下来学习吧 三言两语,不如细…

Unity 灯光

初始化时,系统默认会给一个灯光,类型为定向光。 定向光意为,从无穷远处照射过来的平行光,因此每个图形的阴影的方向一致 灯光的系统参数 阴影类型:①无阴影 ②硬阴影 ③软阴影 (注意)阴影类型最…

力扣(LeetCode)164. 最大间距(C++)

桶排序(划分区间) 一次遍历找到区间内最大值 MaxMaxMax ,最小值 MinMinMin 。区间 (Min,Max](Min,Max](Min,Max] 左开右闭,划分为 n−1n-1n−1 个长度为 lenlenlen 的区间 ,划分的区间左开右闭,所以每个子区间有 len−1len-1len−…

SpringCloud学习笔记

SpringCloud学习笔记成熟分布式微服务架构包含技术模块SpringCloud与SpringBoot版本选择SpringCloud各技术模块的技术选择SpringCloud实现订单-支付微服务创建父工程(管理子工程即各个微服务)父工程的build.gradle配置父工程的settings.gradle配置创建支付子工程(payment_nativ…

物联网开发笔记(64)- 使用Micropython开发ESP32开发板之控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程:控件显示

一、目的 这一节我们学习如何使用我们的ESP32开发板来控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程:控件显示。 二、环境 ESP32 ILI9341 3.2寸TFT-LCD触摸屏 Thonny IDE 几根杜邦线 接线方法:见前面文章。 三、滑杆代码 import lvgl as lv i…

北京理工大学汇编语言复习重点

汇编是半开卷,可以带纸质资料。理论上,学好了以后,带本书进去就ok了,但是这次是线上,我还没书,就对着考试重点整理一点资料用于打印吧。 因为是线上,所以第4章基本不考框架了,浮点操…