您的位置:首页 > 其它

ffmpeg的timeBase的属性解释,用于计算每一帧的时间

2014-08-17 11:16 218 查看
FFMPEG的很多结构中有***Rational time_base;这样的一个成员,它是***Rational结构的

typedef struct ***Rational{

int num; ///< numerator

int den; ///< denominator

} ***Rational;

***Rational这个结构标识一个分数,num为分数,den为分母。



实际上time_base的意思就是时间的刻度:

如(1,25),那么时间刻度就是1/25

(1,9000),那么时间刻度就是1/90000

那么,在刻度为1/25的体系下的time=5,转换成在刻度为1/90000体系下的时间time为(5*1/25)/(1/90000) = 3600*5=18000

ffmpeg中做pts计算时,存在大量这种转换



在以下结构中都有

***CodecContext:编解码上下文。

***Stream:文件或其它容器中的某一个track。



如果由某个解码器产生固定帧率的码流

***CodecContext中的***Rational根据帧率来设定,如25帧,那么num = 1,den=25

***Stream中的time_base一般根据其采样频率设定,如(1,90000)



在某些场景下涉及到PTS的计算时,就涉及到两个Time的转换,以及到底取哪里的time_base进行转换:

场景1:编码器产生的帧,直接存入某个容器的***Stream中,那么此时packet的Time要从***CodecContext的time转换成目标***Stream的time



场景2:从一种容器中demux出来的源***Stream的frame,存入另一个容器中某个目的***Stream。

此时的时间刻度应该从源***Stream的time,转换成目的***Stream timebase下的时间。



其实,问题的关键还是要理解,不同的场景下取到的数据帧的time是相对哪个时间体系的。

demux出来的帧的time:是相对于源***Stream的timebase

编码器出来的帧的time:是相对于源***CodecContext的timebase

mux存入文件等容器的time:是相对于目的***Stream的timebase

这里的time指pts。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: