ffmpeg 解码文件时的时间戳问题

实时流和普通文件

1 实时流
实时流编码时,我们一般不进行b帧编码,但是文件存储时为了减小大小,会增加b帧,实时流只带了I,P帧,那就会好很多
2 普通文件
很多文件带了b帧,所以要使用解码时间去同步,如果使用pts,很多人一定会被其时间搞混。

我们可以正确使用AVFrame 的pts 和pkt-dts 去保存正常的时间,如果不给其正确赋值,那么值就如下所示,是novalue。
在这里插入图片描述
那么获取pts和dts 去赋值给avframe就行了,注意时间基。如果不进行时间延时,那么文件会被cpu 快速读完,这就看cpu有多强了,当然,为了仅仅是测试,当然可以直接使用帧率,间隔时间延时就行,如果做播放器就不能这样了,我们要严格掐时间,按照秒表去对。

int main()
{c_test test;std::thread t([&test]() {// 在这里编写你的匿名函数的代码std::cout << "Hello from the new thread!" << std::endl;test.func_init("G:/record/A1_.mp4");test.Start();});while (1){AVFrame* f = test.GetData();if (f != NULL){int h = f->height;int w = f->width;cv::Mat mat(h, w, CV_8UC3,f->data[0]);cv::Mat matBGR;cv::cvtColor(mat, matBGR,cv::COLOR_RGB2BGR/* cv::COLOR_BGR2YUV_I420*/);cv::imshow("show", matBGR);std::cout << "the pts is :" << f->pts<<std::endl;av_freep(&f->data[0]);av_frame_free(&f);}if (cv::waitKey(30) == 'q')break;}test.Stop();std::cout << "end of this thread" << std::endl;//test.func_seek(10);t.join();
}

以上代码的RGB到BGR的转化其实没有必要使用, 实际播放的时候,我们直接渲染RGB24,RGBA,甚至YUV,NV12 都可以,这里为了方便,把这个转化成了BGR24,不过是想让opencv 直接渲染,由于opencv 中 bgr的rgb的颜色交换,播放时看起来不舒服,所以转化一下更符合实际,不转化也没什么。如果不想转化,甚至直接使用nv12,yuv420,rgb24,为了方便演示可以使用sdl去播放,如果对opengl熟悉,自己就写一段代码去播放。文章可以到我其他的文章里面找,我应该都写过。

正确的播放延时

获取时间基

	AVRational time_base = input_ctx->streams[video_stream]->time_base;AVRational time_base_q = { 1,AV_TIME_BASE }; // AV_TIME_BASE_Q;

要正确播放,一定要使用dts,也就是解码时间,而非pts,对于带b帧的视频来说一定是如此。

if (v_isrealtime == false && video_stream == packet.stream_index)
{//这里需要更加精确的计算if (v_starttime == -1)v_starttime = av_gettime();//av_usleep(30 * 1000);int64_t pts_time = av_rescale_q(packet.dts, time_base, time_base_q);if (v_startptstime == -1)v_startptstime = pts_time;int64_t N = av_gettime() - v_starttime;int64_t S = pts_time - v_startptstime;if (S > N){av_usleep(S-N);std::cout << "sleep:" << S - N << std::endl;}
}

播放测试的时候可以使用pc上有秒表卡住时间,没有就使用手机也可以,两个相差一直是同样的描述,持续时间长一点

在这里插入图片描述

正确的同步

同步时一定要使用系统时间和播放时间相对应,如果文件有跳帧拖拉进度条和快放的需求,更加要注意,其实以上代码已经包含了跳帧和快放的基本需求,研究一下就知道了。

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

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

相关文章

SpringMVC之视图和RESTful

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

Linux 线程安全 (2)

文章目录 线程同步概念条件变量使用生产消费模型信号量的使用读写锁的使用 Linux 线程安全 &#xff08;1&#xff09; 线程同步概念 竞态条件&#xff1a;因为时序问题&#xff0c;而导致程序异常. 饥饿问题&#xff1a;只使用互相锁保证线程安全时&#xff0c;锁资源总被某…

篇章二 | Python 入门指南:深入理解基础数据类型

Python 是一门强大而易学的编程语言&#xff0c;而深刻理解其基础数据类型是掌握 Python 编程的重要一步。本入门指南将详细介绍 Python 中的基础数据类型&#xff0c;包括整数、浮点数、字符串、布尔值、列表、元组、字典和集合等&#xff0c;同时提供注意事项和与 C 语言的区…

【浏览器】Web存储梳理和总结

目录 1. 前言 2. cookie 3. sessionStorage和localStorage 4. indexedDB 4.1 IDBFactory原型对象的方法&#xff08;indexedDB是IDBFactory的实例化对象&#xff09; 4.2 操作请求IDBOpenDBRequest和IDBRequest&#xff08;IDBRequest继承于EventTarget&#xff09; 4.3 …

浅谈【GPU和CPU】

GPU和显卡的区别 GPU&#xff08;Graphics Processing Unit&#xff0c;图形处理器&#xff09;通常指的就是显卡。显卡是一种安装在计算机中的扩展卡&#xff0c;主要用于图形和图像处理任务。 GPU作为显卡的核心组件&#xff0c;负责处理图形渲染、图像处理、视频解码和其他…

每天坐在电脑前10小时的投资者的现货黄金投资秘密

很多人在现货黄金市场中苦作舟&#xff0c;希望通过交易、实践来找出市场中的奥秘。笔者最近看了一个每天坐在电脑面前十个小时以上做分析和投资的投资者的经验介绍&#xff0c;他道出了一些投资的秘密&#xff0c;笔者认为&#xff0c;这是适合现货黄金投资者借鉴和学习的&…

派生类的构造与析构函数(C++)

3.3 派生类的构造与析构函数3.3.1 构造3.3.2 析构 3.3 派生类的构造与析构函数 3.3.1 构造 如果子类构造函数没有显式指明基类部分&#xff08;基类子对象&#xff09;的初始化方式&#xff0c;那么编译器将会自动调用基类的无参构造函数来初始化基类子对象。 如果希望以有参…

java SSM课程平台系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM课程平台系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S…

【方法】Word文档如何设置密码?

Word文档可以设置密码保护&#xff0c;如果想要保护文档不被随意打开&#xff0c;可以设置“打开密码”&#xff1b;如果想保护文档不被随意编辑&#xff0c;可以设置“限制密码”&#xff1b;如果当心自己不小心修改了文档&#xff0c;可以设置“只读模式”密码&#xff0c;使…

一篇文章带你入门PHP魔术方法

PHP魔术方法 PHP 中的"魔术方法"是一组特殊的方法&#xff0c;它们在特定情况下自动被调用。这些方法的名称都是以两个下划线&#xff08;__&#xff09;开头。魔术方法提供了一种方式来执行各种高级编程技巧&#xff0c;使得对象的行为可以更加灵活和强大。以下是一…

DSG YashanDB数据交互解决方案:更稳、更快、更安全

近期&#xff0c;深圳计算科学研究院&#xff08;简称“深算院”&#xff09;携手迪思杰&#xff08;北京&#xff09;数据管理技术有限公司&#xff08;简称“DSG”&#xff09;重磅推出基于崖山数据库的数据交互解决方案&#xff0c;具备双向迁移同步、性能稳定、支持复杂对象…

余弦相似度算法

余弦相似度算法 是什么 余弦距离&#xff0c;也称为余弦相似度&#xff0c;是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。 余弦值越接近1&#xff0c;就表明夹角越接近0度&#xff0c;也就是两个向量越相似&#xff0c;这就叫"余弦相似性&q…

表情串转换

前言 NWAFU 2021阶段二 D 一、题目描述 题目描述 在一个字符串中&#xff0c;设置了由‘/’前导字符和某些特定字母构成的转义子字符串&#xff0c;如“/s”、“/f”、“/c”等用于表示特殊表情符号。现要求编写一个函数&#xff0c;将给定字符串中的转义字符串转换为表情字…

AD20PCB笔记(写给第三次重学PCB的自己)

readme&#xff1a;我曾以为自己本科毕业以后&#xff0c;再也不会用到PCB了&#xff0c;因为本科毕设的时候自己设计的PCB开发板出现了严重的设计问题&#xff0c;在实际测试的过程中&#xff0c;电源一上电&#xff0c;板子芯片直接炸飞&#xff0c;当时真的让我很害怕&#…

JavaScript实现视频共享

1.视频共享webrtc-master index.html <!DOCTYPE html> <html> <head><script typetext/javascript srchttps://cdn.scaledrone.com/scaledrone.min.js></script><meta charset"utf-8"><meta name"viewport" cont…

c++学习笔记(10)-可变参数模板

1、概念 可变参数模板&#xff08;Variable Template Parameters&#xff09;是 C11 中引入的一种语法&#xff0c;它允许函数或类模板接受可变数量的参数。这样可以方便地定义操作适用于多个类型和/或值的函数或类模板。 使用可变参数模板时&#xff0c;可以在模板参数列表中…

【MySQL】在数据目录之外创建InnoDB 表(Creating Tables Externally)

文章目录 【MySQL】在数据目录之外创建InnoDB 表&#xff08;Creating Tables Externally&#xff09;创建表时使用DATA DIRECTORY选项&#xff08;单独表空间&#xff09;innodb_file_per_table设置为开启状态&#xff08;默认&#xff09;innodb_file_per_table设置为关闭状态…

linux iptables简介

表与链 iptables是4表五链 4表&#xff1a;filter表&#xff08;过滤表&#xff09; nat表 raw表 mangle表 五链&#xff1a;INPUT OUTPUT FORWARD PREROUTING POSTROUTING &#xff08;所有链的名字要大写&#xff09; pre…之前 post…之后 filter表 iptables默认操作…

机器学习距离度量方法

1. 机器学习中为什么要度量距离&#xff1f; 机器学习算法中&#xff0c;经常需要 判断两个样本之间是否相似 &#xff0c;比如KNN&#xff0c;K-means&#xff0c;推荐算法中的协同过滤等等&#xff0c;常用的套路是 将相似的判断转换成距离的计算 &#xff0c;距离近的样本相…

K-means 聚类算法分析

算法简述 K-means 算法原理 我们假定给定数据样本 X &#xff0c;包含了 n 个对象 &#xff0c;其中每一个对象都具有 m 个维度的属性。而 K-means 算法的目标就是将 n 个对象依据对象间的相似性聚集到指定的 k 个类簇中&#xff0c;每个对象属于且仅属于一个其到类簇中心距离…