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

时间基准值的选择和采用原因是由具体的编码标准、设备硬件以及应用场景等多方面考虑决定的

  1. H.264编码格式的time_base通常是1/90000,这是因为H.264视频通常以每秒90,000个时钟周期(也称为系统时钟周期)的速率进行编码和解码
  2. MPEG-2编码格式的time_base通常是1/90000或1/180000,这是因为MPEG-2视频编码器和解码器通常使用27MHz的时钟来表示时间和时序信息
  3. AAC音频编码格式的time_base通常是1/44100,这是因为CD音质的采样率为44.1kHz,因此AAC编码器和解码器通常使用1/44,100作为时间基准
  4. MP3音频编码格式的time_base通常是1/1152,这是因为MP3音频的采样率为44.1kHz,且每帧包含1152个采样点,因此MP3编码器和解码器通常使用1/1152作为时间基准

time_base 存在场景

  1. 解码器中解码后输出帧时间戳的计算
  2. 编码器中编码前输入帧时间戳的转换
  3. 使用音视频过滤器进行格式转换
  4. 音视频同步显示向公共的time_base转换

其他

  1. AVCodecContext
  2. 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

参考文章:

ffmpeg time_base详解

posted @ 2021-12-22 15:06  flxx  阅读(360)  评论(0编辑  收藏  举报