pts,dts,time_base的理解

本文解析了PTS(显示时间戳)和DTS(解码时间戳)在视频编码中的概念,探讨了时间基的作用、转换技巧,以及如何通过时间基计算帧位置和音频帧计数。特别强调了FFmpeg中时间戳的处理方法和跨时间基转换的必要性。
摘要由CSDN通过智能技术生成

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*av_q2d(time_base)才是帧的显示时间戳。

二、时间基的转换

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

首先,不同的封装格式的timebase是不一样的。另外,整个转码过程中,不同数据状态对应的时间基也是不一致的。拿MPEG-TS封装格式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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值