美文网首页
2020-09-09 ffmpeg pts、dts、time_b

2020-09-09 ffmpeg pts、dts、time_b

作者: Wonton_skin | 来源:发表于2020-09-09 00:41 被阅读0次

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

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

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


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


例如:mpegts封装格式25fps来说(只说视频,音频大致一样,但也略有不同)。
例如:非压缩时候的数据(即YUV或者其它),在ffmpeg中对应的结构体为AVFrame,它的时间基为AVCodecContext 的time_base ,AVRational{1,25}。
例如:压缩后的数据(对应的结构体为AVPacket)对应的时间基为AVStream的time_base,AVRational{1,90000}。

根据pts来计算一桢在整个视频中的时间位置:
timestamp(秒) = pts * av_q2d(st->time_base)

计算视频长度:
duration和pts单位一样,duration表示当前帧的持续时间占多少格,两帧的间隔时间是占多少格(格子数)。
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


参考链接:
https://blog.csdn.net/bixinwei22/article/details/78770090

相关文章

网友评论

      本文标题:2020-09-09 ffmpeg pts、dts、time_b

      本文链接:https://www.haomeiwen.com/subject/cbysektx.html