美文网首页FFmpeg
ffmpeg中的时间单位

ffmpeg中的时间单位

作者: haige | 来源:发表于2017-10-16 14:35 被阅读7次

    fmpeg中的时间单位
    AV_TIME_BASE
    ffmpeg中的内部计时单位(时间基),ffmepg中的所有时间都是于它为一个单位,比如AVStream中的duration即以为着这个流的长度为duration个AV_TIME_BASE。AV_TIME_BASE定义为:

    define AV_TIME_BASE 1000000

    AV_TIME_BASE_Q
    ffmpeg内部时间基的分数表示,实际上它是AV_TIME_BASE的倒数。从它的定义能很清楚的看到这点:

    define AV_TIME_BASE_Q (AVRational){1, AV_TIME_BASE}

    AVRatioal的定义如下:
    typedef struct AVRational{int num; //numeratorint den; //denominator} AVRational;

    ffmpeg提供了一个把AVRatioal结构转换成double的函数:

    static inline double av_q2d(AVRational a){
    /**

    • Convert rational to double.
    • @param a rational to convert
      **/

    return a.num / (double) a.den;
    }

    现在可以根据pts来计算一桢在整个视频中的时间位置:
    timestamp(秒) = pts * av_q2d(st->time_base)

    计算视频长度的方法:
    time(秒) = st->duration * av_q2d(st->time_base)

    这里的st是一个AVStream对象指针。
    时间基转换公式
    timestamp(ffmpeg内部时间戳) = AV_TIME_BASE * time(秒)
    time(秒) = AV_TIME_BASE_Q * timestamp(ffmpeg内部时间戳)

    所以当需要把视频跳转到N秒的时候可以使用下面的方法:
    int64_t timestamp = N * AV_TIME_BASE; 2av_seek_frame(fmtctx, index_of_video, timestamp, AVSEEK_FLAG_BACKWARD);

    ffmpeg同样为我们提供了不同时间基之间的转换函数:
    int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)

    这个函数的作用是计算a * bq / cq,来把时间戳从一个时基调整到另外一个时基。在进行时基转换的时候,我们应该首选这个函数,因为它可以避免溢出的情况发生。

    相关文章

      网友评论

        本文标题:ffmpeg中的时间单位

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