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。
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。
相关文章推荐
- ffmpeg中的时间 DTS、PTS、AV_TIME_BASE、AV_TIME_BASE_Q 介绍
- Oracle函数参考(用于计算某个数值所表示的时间)
- 【代码保留】时间器(用于计算时间间隔的类)
- Linux系统使用time计算命令执行的时间
- 使用 console.time() 计算js代码执行时间
- 计算程序运行时间(time_t, clock_t)
- DataColumn.Expression 属性 获取或设置表达式,用于筛选行、计算列中的值或创建聚合列。
- C/C++中的日期和时间time_t详细解释
- python中关于时间和日期函数的常用计算总结(time和datatime)
- ffmpeg是否可以得知每一帧的解码时间?
- FFMPEG之TimeBase成员理解
- 【代码保留】时间器(用于计算时间间隔的类)
- GStreamer pipeline的basetime是如何计算出来的?
- BOOST:使用local_date_time 计算当前时间戳
- python中关于时间和日期函数的常用计算总结(time和datatime)
- Firefox - 附加软件 - Firebug - Console控制台视图 - 使用console.time()计算时间
- 计算程序运行时间(time_t, clock_t)
- 关于clock()计算进程运行的时间以及time()
- C语言计算时间函数 & 理解linux time命令的输出中“real”“user”“sys”的真正含义
- C/C++日期时间使用方法,struct tm, time_t, clock_t,计算循环所用时间