FFmpeg时间戳详解

ffmpeg 之 时间戳 看到好多人对时间戳这个概念不明白啊;简单写一下我的理解 第一,时间戳是什么 时间戳就是一个能够表示一个事物发生时间的东西,她有个单位,比如秒,毫秒等 第二,timebase是个什么 timebase是个有点抽象的东西, 在这里不说抽象的概念,你就把它当成时间的单位; 例如25帧的视频,如果不存在timebase这个东西, 我们打时间戳应该是这样的,0-40-80-120- 阅读详情

下面这篇文章将ffmpeg中的各种时间讲的很到位,值得一看

FFmpeg时间戳详解

ffmpeg中的时间 DTS、PTS、AV_TIME_BASE、AV_TIME_BASE_Q等介绍 

         原文:ffmpeg中的时间 - 裴银祥的博客园 - 博客园   作者:裴银祥

         I,P,B帧和PTS,DTS的关系

目录 [hide]

视频的显示和存放原理

对于一个电影,帧是这样来显示的:I B B P。现在我们需要在显示B帧之前知道P帧中的信息。因此,帧可能会按照这样的方式来存储:IPBB。这就是为什么我们会有一个解码时间戳和一个显示时间戳的原因。解码时间戳告诉我们什么时候需要解码,显示时间戳告诉我们什么时候需要显示。所以,在这种情况下,我们的流可以是这样的:

PTS: 1 4 2 3 
DTS: 1 2 3 4 
Stream: I P B B

通常PTS和DTS只有在流中有B帧的时候会不同。

DTS和PTS

音频和视频流都有一些关于以多快速度和什么时间来播放它们的信息在里面。音频流有采样,视频流有每秒的帧率。然而,如果我们只是简单的通过数帧和乘以帧率的方式来同步视频,那么就很有可能会失去同步。于是作为一种补充,在流中的包有种叫做DTS(解码时间戳)和PTS(显示时间戳)的机制。为了这两个参数,你需要了解电影存放的方式。像MPEG等格式,使用被叫做B帧(B表示双向bidrectional)的方式。另外两种帧被叫做I帧和P帧(I表示关键帧,P表示预测帧)。I帧包含了某个特定的完整图像。P帧依赖于前面的I帧和P帧并且使用比较或者差分的方式来编码。B帧与P帧有点类似,但是它是依赖于前面和后面的帧的信息的。这也就解释了为什么我们可能在调用avcodec_decode_video以后会得不到一帧图像。

ffmpeg中的时间单位

AV_TIME_BASE

ffmpeg中的内部计时单位(时间基),ffmepg中的所有时间都是于它为一个单位,比如AVStream中的duration即以为着这个流的长度为duration个AV_TIME_BASE。AV_TIME_BASE定义为:

#define AV_TIME_BASE 1000000

AV_TIME_BASE_Q

ffmpeg内部时间基的分数表示,实际上它是AV_TIME_BASE的倒数。从它的定义能很清楚的看到这点:

#define AV_TIME_BASE_Q (AVRational){1, AV_TIME_BASE}

 

AVRatioal的定义如下:

typedef struct AVRational
{ 
int num; //numerator 
int den; //denominator 
} AVRational;

ffmpeg提供了一个把AVRatioal结构转换成double的函数:

static inline double av_q2d(AVRational a){ return a.num / (double) a.den; }

现在可以根据pts来计算一桢在整个视频中的时间位置:

timestamp(秒) = pts * av_q2d(st->time_base)
 

计算视频长度的方法:

time(秒) = st->duration * av_q2d(st->time_base)
 

这里的st是一个AVStream对象指针。

时间基转换公式

  • timestamp(ffmpeg内部时间戳) = AV_TIME_BASE * time(秒)
  • time(秒) = AV_TIME_BASE_Q * timestamp(ffmpeg内部时间戳)

所以当需要把视频跳转到N秒的时候可以使用下面的方法:

int64_t timestamp = N * AV_TIME_BASE; 
av_seek_frame(fmtctx, index_of_video, timestamp, AVSEEK_FLAG_BACKWARD);

ffmpeg同样为我们提供了不同时间基之间的转换函数:

int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)

这个函数的作用是计算a * bq / cq,来把时间戳从一个时基调整到另外一个时基。在进行时基转换的时候,我们应该首选这个函数,因为它可以避免溢出的情况发生

PTS:Presentation Time Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来 

DTS:Decode Time Stamp。DTS主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码

也就是pts反映帧什么时候开始显示,dts反映数据流什么时候开始解码

怎么理解这里的“什么时候”呢?如果有某一帧,假设它是第10秒开始显示。那么它的pts是多少呢。是10?还是10s?还是两者都不是。

为了回答这个问题,先引入FFmpeg中时间基的概念,也就是time_base。它也是用来度量时间的。 

如果把1秒分为25等份,你可以理解就是一把尺,那么每一格表示的就是1/25秒。此时的time_base={1,25} 

如果你是把1秒分成90000份,每一个刻度就是1/90000秒,此时的time_base={1,90000}。 

所谓时间基表示的就是每个刻度是多少秒 

pts的值就是占多少个时间刻度(占多少个格子)。它的单位不是秒,而是时间刻度。只有pts加上time_base两者同时在一起,才能表达出时间是多少。 

好比我只告诉你,某物体的长度占某一把尺上的20个刻度。但是我不告诉你,这把尺总共是多少厘米的,你就没办法计算每个刻度是多少厘米,你也就无法知道物体的长度。 

pts=20个刻度 

time_base={1,10} 每一个刻度是1/10厘米 

所以物体的长度=pts*time_base=20*1/10 厘米

在ffmpeg中。av_q2d(time_base)=每个刻度是多少秒 

此时你应该不难理解 pts*av_q2d(time_base)才是帧的显示时间戳。

下面理解时间基的转换,为什么要有时间基转换。 

首先,不同的封装格式,timebase是不一样的。另外,整个转码过程,不同的数据状态对应的时间基也不一致。拿mpegts封装格式25fps来说(只说视频,音频大致一样,但也略有不同)。非压缩时候的数据(即YUV或者其它),在ffmpeg中对应的结构体为AVFrame,它的时间基为AVCodecContext 的time_base ,AVRational{1,25}。 

压缩后的数据(对应的结构体为AVPacket)对应的时间基为AVStream的time_base,AVRational{1,90000}。 

因为数据状态不同,时间基不一样,所以我们必须转换,在1/25时间刻度下占10格,在1/90000下是占多少格。这就是pts的转换。

根据pts来计算一桢在整个视频中的时间位置: 

timestamp(秒) = pts * av_q2d(st->time_base)

duration和pts单位一样,duration表示当前帧的持续时间占多少格。或者理解是两帧的间隔时间是占多少格。一定要理解单位。 

pts:格子数 

av_q2d(st->time_base): 秒/格

计算视频长度: 

time(秒) = st->duration * av_q2d(st->time_base)

ffmpeg内部的时间与标准的时间转换方法: 

ffmpeg内部的时间戳 = AV_TIME_BASE * time(秒) 

AV_TIME_BASE_Q=1/AV_TIME_BASE

av_rescale_q(int64_t a, AVRational bq, AVRational cq)函数 

这个函数的作用是计算a*bq / cq来把时间戳从一个时间基调整到另外一个时间基。在进行时间基转换的时候,应该首先这个函数,因为它可以避免溢出的情况发生。 

函数表示在bq下的占a个格子,在cq下是多少。

关于音频pts的计算: 

音频sample_rate:samples per second,即采样率,表示每秒采集多少采样点。 

比如44100HZ,就是一秒采集44100个sample. 

即每个sample的时间是1/44100秒

一个音频帧的AVFrame有nb_samples个sample,所以一个AVFrame耗时是nb_samples*(1/44100)秒 

即标准时间下duration_s=nb_samples*(1/44100)秒, 

转换成AVStream时间基下 

duration=duration_s / av_q2d(st->time_base) 

基于st->time_base的num值一般等于采样率,所以duration=nb_samples. 

pts=n*duration=n*nb_samples

补充: 

next_pts-current_pts=current_duration,根据数学等差公式an=a1+(n-1)*d可得pts=n*d

ffmpeg时间戳 1 时间基与时间戳的概念 在FFmpeg中,时间基(time_base)是时间戳(timestamp)的单位,时间戳值乘以时间基,可以得到实际的时刻值(以秒等为单位)。例如,如果一个视频帧的dts是40,pts是160,其time_base是1/1000秒,那么可以计算出此视频帧的解码时刻是40毫秒(40/1000),显示时刻是160毫秒(160/1000)。FFmpeg中时间戳(pts/dts... 阅读详情

相关推荐

FFmpeg之时间戳详解

这个要链接我之前的文章:ffmpeg的pts之解析_leek5533的博客-优快云博客 结合FFmpeg时间戳详解 - 叶余 - 博客园 梳理一下时间戳, 首先要有一定的I B P帧概念,和timebase 及timescale的认识, 3. FFmpeg 中的时间基与时间戳 3.1 时间基与时间戳的概念 在 FFmpeg 中,时间基(time_base)是时间戳(timestamp)的单位,时间戳值乘以时间基,可以得到实际的时刻值(以秒等为单位)。例如,如果一个视频帧的 dts 是 40,p

leek5533的博客 2272

理解ffmpeg中的pts,dts,time_base

首先介绍下概念: PTS:Presentation Time Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来 DTS:Decode Time Stamp。DTS主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码 也就是pts反映帧什么时候开始显示,dts反映数据流什么时候开始解码 怎么理解这里的“什么时候”呢?如果有某一帧,假设它是第10秒开始显示。那么它的pts是多少呢。是10?还是10s?还是两者都不是。 为了回答这个问题,先引入FFmpeg中时间基的概念,也就是time_

qinjie的博客 5343

FFMPEG 时间戳PTS校正

FFMPEG 时间戳PTS校正 前言 FFMPEG时间戳校正是通过DTS来进行的,在compute_pkt_fields中实现。 代码 /** * Return the frame duration in seconds. Return 0 if not available. */ void ff_compute_frame_duration(AVFormatContext *s, int *pnum, int *pden, AVStream *st, ...

intel1985的专栏 2651

FFMPEG之时间戳计算

FFMPEG之时间戳计算 因为公司项目需求,需要将HEVC 视频裸码流 和 G711A 音频裸码流 封装到MP4容器中,但是FFMPEG 并不支持将G711A 格式音频 封装到MP4中,需要将G711A 格式音频转换成AAC格式的音频,再封装到MP4容器中,或者修改FFMPEG 的源码(不是本文重点) 。在封装过程中音频数据 和视频数据都需要打上解码时间戳,显示时间戳,一帧的时长,这就需要计算每帧的时间戳。 FFMPEG 中 视频时间戳的计算 在FFMPEG中可以区分 视频流 和 音频流。同

驱梦人的博客 1732

【ffmpeg】时间基与时间戳

在 FFmpeg 中,时间基(time_base)是时间戳(timestamp)的单位,时间戳值乘以时间基,可以得到实际的时刻值(以秒等为单位)。例如,如果一个视频帧的 dts 是 40,pts 是 160,其 time_base 是 1/1000 秒,那么可以计算出此视频帧的解码时刻是 40 毫秒(40/1000),显示时刻是 160 毫秒(160/1000)

依依妖妖的林少的博客 876

稀疏阵列选型指南:互质阵、嵌套阵、MRA,谁才是你项目里的‘性价比之王’?

本文深入探讨了稀疏阵列技术中的互质阵、嵌套阵和MRA三大架构的工程化选型策略,重点分析了它们在DOA估计、自由度、旁瓣抑制和计算复杂度等核心指标上的表现。通过实际案例和配置示例,为智能天线、声学定位和毫米波雷达等应用场景提供技术选型指南,帮助研发团队在硬件成本与性能之间找到最佳平衡点。

weixin_42525005的博客 488

ffmpeg为视频添加时间戳 - 手动编译ffmpeg

FFMPEG给视频加时间戳水印 项目中需要给视频添加时间戳,理所当然最好用的办法是ffmpeg。在找到正确的做法前,还被网上的答案timecode给水了一下(水的不轻,在这里转了2天),大概是这样写的: ffmpeg -i wildlife.wmv -vf "drawtext=fontfile=arial.ttf: text='fuck': timecode='09\:57\:00\:00':...

weixin_34088598的博客 1892

若依框架整合Flowable:从零构建企业级流程中心

本文详细介绍了如何将若依框架与Flowable工作流引擎整合,构建企业级流程中心。通过环境配置、依赖添加、数据库设置等核心步骤,实现流程定义管理、任务处理服务等关键功能,并结合实际案例展示请假审批流程的实现与动态表单集成。文章还提供了性能优化和生产建议,帮助开发者高效构建稳定可靠的工作流系统。

weixin_28365523的博客 227

ffmpeg rtp时间戳

ffmpeg rtp时间戳ffmpeg c 一、介绍 在ffmpeg中,每帧都会存在一个pts用来表示该帧图像在视频流中的位置。而在多路流(比如视频、音频)时,往往需要进行多媒体的同步,使得画面和声音同步,这时便需要使用两者的pts来做同步。那么pts是如何计算得到的呢,如何使用它做同步呢? 1.1 时间基转换 ffmpeg中时间存在一个基,可以理解成单位,比如把1s分成...

weixin_30819163的博客 860

等保: Postgresql配置ssl链接

等保: postgresql配置ssl链接完整方案和避坑指南

weixin_43557605的博客 4381

企业碳排放计算方法与实践:从年度总量到月度分配的完整流程

本文系统介绍了企业碳排放计算的全流程方法,包括数据预处理、能源活动与产品生产碳排放计算、年度汇总及月度分配优化。通过ARIMA模型预测补充缺失数据,采用二次规划算法实现基于用电量模式的月度碳排放分配,确保计算结果的准确性与合理性。该方法为企业碳排放管理提供了科学工具,有助于精准监控排放、制定减排策略并满足合规要求。实施中需注重数据质量控制和排放因子选择,并根据企业特点调整参数。该流程适用于制造业企业,为实现碳中和目标提供可靠的数据基础和管理支持。

applehunqiu的博客 1572

【FFMPEG】ffmpeg 时间戳问题汇总

ffmpeg时间戳问题汇总 http://www.cnblogs.com/loveclover/archive/2011/03/23/1993065.html 问题是这样的 用一个 VLC(流媒体客户端) 去请求流媒体服务器上的数据, 但是获得的数据播放速度明显快于1倍速,大概是 ...

weixin_30548917的博客 506

Fluent VOF造波从入门到放弃?手把手教你用k-w SST模型搞定波浪模拟

本文详细介绍了使用Fluent VOF和k-w SST模型进行波浪模拟的实战技巧,从参数设置到结果优化,帮助用户避开常见误区。通过工业项目验证的配置方案,提升波浪模拟的准确性和计算效率,特别适合处理多相流和复杂湍流场景。

weixin_27102543的博客 422

ffmpeg time_base、FFmpeg时间戳整理、 ffmpeg 时间戳问题汇总

转自:http://www.cnitblog.com/luofuchong/archive/2014/11/28/89869.html https://www.suninf.net/2018/02/ffmpeg-timestamps.html https://www.cnblogs.com/loveclover/archive/2011/03/23/1993065.html ffmpe...

along 5523

PIMPL 模式 以及Q_DECLARE_PUBLIC 与 Q_DECLARE_PRIVATE

在 C++ 中,PIMPL 模式通常通过将类的私有数据和实现放在一个单独的类中,然后在类的公共接口中使用指向该私有实现类的指针来实现。宏可以帮助在 Qt 的 PIMPL 模式中实现类的私有实现和公共接口的分离,提高代码的封装性和可维护性。宏的结合使用,我们可以实现类的私有性和封装,避免暴露私有实现的细节,同时提高类的可维护性和灵活性。:这一行声明了一个友元类,使得类的公共接口可以访问私有实现类的私有成员。:这一行声明了一个友元类,使得类的私有实现可以访问类的私有成员。是两个宏,用于实现 PIMPL 模式。

追赶时代的博客 840

2025年GESP12月认证C++一级真题解析

摘要 本文包含13道C++编程选择题,每题2分,涉及语法、运算符、循环、条件判断等知识点。题目考察了变量命名规则、运算符优先级、赋值语句、循环控制、格式化输出等内容。部分题目解析与标答存在差异,例如第4题逗号表达式输出应为5但标答为4,第6题赋值运算结果应为4 4但标答为3 4等。这些题目适合用于检验基础编程能力,但需注意部分标答可能存在争议,建议结合具体编译环境验证。最后一题考察"漂亮数"判断,要求填写数字某位能被3整除的条件表达式。

lan_in的博客 741

ffmpeg打时间戳

网上看到一篇关于ffmpeg音频和视频打时间戳的文章,写的不错。 http://blog.chinaunix.net/uid-26000296-id-3483782.html

Lucifer的博客 1847

具身智能:原理、算法与系统 第1章 具身智能的本质与范畴

从学术定义的角度,具身智能可被界定为"与物理环境进行有目的的能量与信息交换"的智能形式。这一定义揭示了具身智能的两个本质维度:信息处理维度与能量交互维度。与传统人工智能系统仅在信息空间操作不同,具身智能系统必须同时处理信息流与能量流,在物理约束下实现感知、认知与行动的统一。具身智能体具有三个核心构成要素:物理身体(Physical Body)、感知系统(Sensory System)与效应器(Effectors)。这三者共同构成了感知与行动的基础,使智能体能够通过物理交互而非纯粹符号操作来理解世界。

VectorShift的博客 270

FFmpeg —— FFmpeg时间戳详解

1. I帧/P帧/B帧 I帧:I帧(Intra-coded picture, 帧内编码帧,常称为关键帧)包含一幅完整的图像信息,属于帧内编码图像,不含运动矢量,在解码时不需要参考其他帧图像。因此在I帧图像处可以切换频道,而不会导致图像丢失或无法解码。I帧图像用于阻止误差的累积和扩散。在闭合式GOP中,每个GOP的第一个帧一定是I帧,且当前GOP的数据不会参考前后GOP的数据。 P帧:P帧(Pr...

天空的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

对ffmpeg的时间戳的理解笔记

之前也有了解过ffmpeg中时间戳的相关知识点,但也仅限了解,没有更深入的理解,更没有作相关的笔记整理。近期由于工作中需要用到ffmpeg的时间戳,所以再一次去学习ffmpeg中的时间戳的知识点,并作了相关笔记,整理如下:/* *Date:2017-07-28 *Author:TopsLuo *Function:掌握ffmpeg中时间戳的知识点。并根据实际的时间来生成ffmpeg内部不同时间基的时间

TopsLuo的专栏 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: SwrContext重采样结构体使用说明
下一篇: 视音频同步方法
荆楚闲人
博客等级 码龄20年 3万+粉丝 473原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值