1:av_q2d(AVRational a)函数
av_q2d(AVRational);该函数负责把AVRational结构转换成double,通过这个函数可以计算出某一帧在视频中的时间位置
timestamp(秒) = pts * av_q2d(st->time_base);
计算视频长度的方法:
time(秒) = st->duration * av_q2d(st->time_base);
2:av_rescale_q(int64_t a, AVRational bq, AVRational cq)函数
这个函数的作用是计算a*bq / cq来把时间戳从一个时间基调整到另外一个时间基。在进行时间基转换的时候,应该首先这个函数,因为它可以避免溢出的情况发生
3:ffmpeg内部的时间与标准的时间转换方法:
timestamp(ffmpeg内部的时间戳) = AV_TIME_BASE * time(秒)
time(秒) = AV_TIME_BASE_Q * timestamp(ffmpeg内部的时间戳)
4:ts格式文件中3600间隔是什么意思?
它是25fps帧率的ts媒体文件,每个视频帧的间隔时间。
ts文件的封装时基是90kHz为单位,timebase是AVRational{1,90000},简单的理解就是把1秒分成了90000等分,拿25帧率ts文件来分析
按标准时间来计算每帧的间隔:
公式为:1 / 25 = 0.04(秒) = 40毫秒
按ffmpeg中的1秒(即90000)来计算每帧的间隔(单位好像没有明确的定义,暂且使用ffmpeg吧):
90000 / 25 = 3600(ffmpeg)
用时间转换公式可能会更清楚一些:
1(s) = 90000(ffmpeg)
40(ms) = 3600(ffmpeg)
5:不同的时间基
现实中不同的封装格式,timebase是不一样的。另外,整个转码过程,不同的数据状态对应的时间基也不一致。还是拿mpegts封装格式25fps来
说(只说视频,音频大致一样,但也略有不同)。非压缩时候的数据(即YUV或者其它),在ffmpeg中对应的结构体为AVFrame,它的时间基为AVRational{1,25}。
压缩后的数据(对应的结构体为AVPacket)对应的时间基为AVRational{1,90000}
摘取自:ffmpeg pts dts