您的位置:首页 > 其它

FFMPEG之TimeBase成员理解

2018-01-19 11:17 246 查看
转http://blog.csdn.net/supermanwg/article/details/14521869FFMPEG的很多结构中有AVRational time_base;这样的一个成员,它是AVRational结构的typedef struct AVRational{
    int num; ///< numerator
    int den; ///< denominator
} AVRational;AVRational这个结构标识一个分数,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=18000ffmpeg中做pts计算时,存在大量这种转换 在以下结构中都有AVCodecContext:编解码上下文。AVStream:文件或其它容器中的某一个track。 如果由某个解码器产生固定帧率的码流AVCodecContext中的AVRational根据帧率来设定,如25帧,那么num = 1,den=25AVStream中的time_base一般根据其采样频率设定,如(1,90000) 在某些场景下涉及到PTS的计算时,就涉及到两个Time的转换,以及到底取哪里的time_base进行转换:场景1:编码器产生的帧,直接存入某个容器的AVStream中,那么此时packet的Time要从AVCodecContext的time转换成目标AVStream的time 场景2:从一种容器中demux出来的源AVStream的frame,存入另一个容器中某个目的AVStream。            此时的时间刻度应该从源AVStream的time,转换成目的AVStream timebase下的时间。 其实,问题的关键还是要理解,不同的场景下取到的数据帧的time是相对哪个时间体系的。demux出来的帧的time:是相对于源AVStream的timebase编码器出来的帧的time:是相对于源AVCodecContext的timebasemux存入文件等容器的time:是相对于目的AVStream的timebase这里的time指pts。
FFMpeg自带的播放器ffplay对音视频的处理方法总结:1. 如果声音是CBR的(也就是固定码率),就以音频的时间戳为基准2. 如果视频时CBR,就以视频的时间戳为基准3. 如果都是VBR的,就参考外部时钟,通过av_gettime()获取微妙集的时钟。ffmpeg通过AVStream结构的time_base(有理数由分子和分母组成)可以获取一个参考时间单位,所有音视频流的timestamp都是基于这个时间单位顺序递增,比如time_base.num=1,time_base.den=90000,表示把1秒分成90000等份,音视频的pts和dts值就表示有多少个1/90000等份,更简单一点假设time_base.num=1,time_base.den=1000,就表示1秒分成1000等份,相当于1毫秒,那时间戳就表示是以毫秒为单位的,再做音视频处理时候,如果解码的速度比按照时间戳显示的速度快,那就简单不用丟帧(Drop Frame)处理,当解码速度很慢时(比如手机设备),就需要丢帧处理,是每两帧丟一帧数据,还是每3帧丟掉一帧数据,就需要根据延时显示程度来计算丢帧的比率
一、函数声明:int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd);
直接看代码, 它的作用是计算 "a * b / c" 的值并分五种方式来取整.用在FFmpeg中, 则是将以 "时钟基c" 表示的 数值a 转换成以 "时钟基b" 来表示。
一共有5种方式:AV_ROUND_ZERO     = 0, // Round toward zero.      趋近于0

AV_ROUND_INF      = 1, // Round away from zero.   趋远于0

AV_ROUND_DOWN     = 2, // Round toward -infinity. 趋于更小的整数

AV_ROUND_UP       = 3, // Round toward +infinity. 趋于更大的整数

AV_ROUND_NEAR_INF = 5, // Round to nearest and halfway cases away from zero.

                       //                         四舍五入,小于0.5取值趋向0,大于0.5取值趋远于0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: