美文网首页
ffmpeg 常见数据结构之AVRational

ffmpeg 常见数据结构之AVRational

作者: _你的昵称_ | 来源:发表于2023-05-26 21:37 被阅读0次

什么是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 的值就是媒体文件时长的微秒表示。

相关文章

网友评论

      本文标题:ffmpeg 常见数据结构之AVRational

      本文链接:https://www.haomeiwen.com/subject/ipqledtx.html