time_base梳理
time_base的定义与使用方法
在ffmpeg中,time_base是一种时间基准用于表示时间戳。在视频编解码过程中,每帧或者每个音频样本都有自己的时间戳,以表示该帧或样本在时间轴上的位置。time_base就是用来指定这些时间戳的时间基准。它是一个有理数类型,表示每个时间单位(通常是秒)有多少个时间基准单位。
typedef struct AVRational{
int num; ///< numerator
int den; ///< denominator
} AVRational;
AVRational采用分数形式进行存储,是为了编码浮点数的舍入带来的误差,达到保证精度的目的。
不同time_base的转换计算
A时间戳 * A时间基 = B时间戳 * B时间戳 ===> A时间戳 = B时间戳 * B时间基 / A时间基
例如,如果我们要将一个原始视频帧的时间戳从25fps的time_base(num=1,den=25)转换为30fps的time_base(num=1,den=30),那么上面的公式就可以表示为:
新时间戳 = (旧时间戳 * 1 / 25)* 30 / 1
常用的time_base
时间基准值的选择和采用原因是由具体的编码标准、设备硬件以及应用场景等多方面考虑决定的
- H.264编码格式的time_base通常是1/90000,这是因为H.264视频通常以每秒90,000个时钟周期(也称为系统时钟周期)的速率进行编码和解码
- MPEG-2编码格式的time_base通常是1/90000或1/180000,这是因为MPEG-2视频编码器和解码器通常使用27MHz的时钟来表示时间和时序信息
- AAC音频编码格式的time_base通常是1/44100,这是因为CD音质的采样率为44.1kHz,因此AAC编码器和解码器通常使用1/44,100作为时间基准
- MP3音频编码格式的time_base通常是1/1152,这是因为MP3音频的采样率为44.1kHz,且每帧包含1152个采样点,因此MP3编码器和解码器通常使用1/1152作为时间基准
time_base 存在场景
- 解码器中解码后输出帧时间戳的计算
- 编码器中编码前输入帧时间戳的转换
- 使用音视频过滤器进行格式转换
- 音视频同步显示向公共的time_base转换
其他
- AVCodecContext
- AVStream
编码前的时间基位于AVCodecContext中,AVFrame使用
编码后的时间基位于AVStream中,AVPacket AVStream使用
mux存入文件容器中的time:采用AVStream中time_base
demux出来的time,采用AVStream中的time_base
decode出来的frame采用AVCodecContext中的time_base
AVPacket中time(编码后数据),采用AVStream中time_base
音视频的计量单位不同
AVFrame视频要存储图片,则pts使用codec_ctx->gop_size计量,pts += 1; time_base使用帧率计量,time_base = 1/ codec_ctx->gop_size
AVFrame音频要存储声音,则pts使用codec_ctx->sample_rate计量,pts += 1, time_base = 1 / codec_ctx->sample_rate;
nb_samples == 1/ codec_ctx->sample_rate
参考文章:
本文来自博客园,作者:flxx,转载请注明原文链接:https://www.cnblogs.com/faithlocus/p/15719603.html