FFmpeg 常见数据结构之AVRational

什么是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 类型可以表示有理数,但是存在以下问题:

  1. 精度不够:int 类型只能表示整数,而 double 类型虽然可以表示小数,但是在进行浮点数计算时可能会出现精度误差,导致计算结果不准确。
  2. 不便于时间单位转换:音视频处理中经常需要对时间单位进行转换,例如将微秒转换为秒、将帧率转换为时间间隔等。如果使用 int 类型或者 double 类型,需要额外的代码和计算才能完成时间单位转换。

因此,使用 AVRational 类型比使用 int 类型或 double 类型更加方便和准确,它可以表示任意的有理数,并且提供了便捷的函数用于分数/有理数的转换、计算和缩约。同时,AVRational 也支持时间单位转换,可以直接进行时间戳和帧率之间的转换,提高了音视频处理的效率和精度。

How使用AVRational

FFmpeg 提供了一些方便操作 AVRational 的函数,例如:

  • av_reduce(): 将一个有理数约分成最简形式。
  • av_d2q(): 将一个 double 值转换为 AVRational 类型。
  • av_q2d(): 将一个 AVRational 类型转换为 double 值。

使用 AVRational 结构体可以方便地进行有理数的计算、转换和运算,在音视频处理中非常常见。

使用样例

  1. 如何将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 的值就是媒体文件时长的微秒表示。

本文福利, 免费领取C++音视频学习资料包、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

猜你喜欢

转载自blog.csdn.net/m0_60259116/article/details/131134122