什么是AVRational
AVRational
是 FFmpeg 中表示有理数(ratio)的数据结构,用于进行时间戳和帧率等计算。它的定义如下:
typedef struct AVRational {
int num; ///< Numerator (分子)
int den; ///< Denominator (分母)
} AVRational;
其中,num
表示有理数分子,den
表示有理数的分母。例如,对于一个帧率为 25fps 的视频来说,其 AVRational
可以表示为 {25, 1}
。
在 FFmpeg 中,AVRational
主要用于时间戳和帧率的计算。例如,在解码视频时,视频帧的 PTS(显示时间戳)和 DTS(解码时间戳)都是基于 AVRational
进行计算的。
Why要使用AVRational
为什么要使用AVRational类型,而不使用int类型或者double类型?
使用 int
类型或者 double
类型可以表示有理数,但是存在以下问题:
精度不够:
int
类型只能表示整数,而double
类型虽然可以表示小数,但是在进行浮点数计算时可能会出现精度误差,导致计算结果不准确。不便于时间单位转换:音视频处理中经常需要对时间单位进行转换,例如将微秒转换为秒、将帧率转换为时间间隔等。如果使用
int
类型或者double
类型,需要额外的代码和计算才能完成时间单位转换。
因此,使用 AVRational
类型比使用 int
类型或 double
类型更加方便和准确,它可以表示任意的有理数,并且提供了便捷的函数用于分数/有理数的转换、计算和缩约。同时,AVRational
也支持时间单位转换,可以直接进行时间戳和帧率之间的转换,提高了音视频处理的效率和精度。
How使用AVRational
FFmpeg 提供了一些方便操作 AVRational
的函数,例如:
av_reduce()
: 将一个有理数约分成最简形式。av_d2q()
: 将一个 double 值转换为AVRational
类型。av_q2d()
: 将一个AVRational
类型转换为 double 值。
使用 AVRational
结构体可以方便地进行有理数的计算、转换和运算,在音视频处理中非常常见。
使用样例
- 如何将AVFormatContext中的duration(以AVRational为时间基为单位)转成微秒单位
在 AVFormatContext
结构体中,duration
表示的是媒体文件的播放时长,以时间基为单位。为了将其转换为微秒单位,你需要进行如下计算:
int64_t duration_us = av_rescale_q(avFormatContext->duration, avFormatContext->streams[0]->time_base, AV_TIME_BASE_Q);
经过上述计算,duration_us
的值就是媒体文件时长的微秒表示。