zoukankan      html  css  js  c++  java
  • C++编程音视频库ffmpeg的pts时间换算方法 老夏课堂

    ffmpeg中的pts,dts,duration时间记录都是基于timebase换算,我们主要分析下pts的时间怎么换算,其它的是一样的换算。ffmpeg的时间换算对许多新接触同学算是一个大坑,很多刚接触ffmpeg的同学都不容易搞清楚它的时间计算方法。

    我们先看下ffmpeg时间是怎么算的:

    一帧图像(音频)的时间戳(时间戳一般以第一帧为0开始)= pts * (AVRational.num/AVRational.den)

    为什么要这么算(挖坑)我们看下ffmpeg的说明:

    “当有理数用浮点数做转换时是有损的,ffmpeg要求高精度的计算的时间戳,所以用分数来做换算”。

    我们在看下换算用到的结构体,一看到他是用分数就容易理解了

    typedef struct AVRational{

    int num; ///<分子

    int den; ///< 分母

    } AVRational;

    其实当num=1,den=1000的时候pts的时间单位就相当于毫秒 1/1000秒

    其实当num=1,den=1000000的时候pts的时间单位就相当于微秒 1/1000000秒

    时间换算

    比如我们要通过ffmpeg实现直播推流,推流一个文件,文件中的时间基数一般是{ num=1,den=1000000} ,推流用的正常是timebase {num=1,den=1000}。那就可以做如下计算:

    推流的pts = 文件pts * 文件timebase / 推流timebase

    如果手动计算要判断分母是否为0,不然会造成程序宕掉。当然ffmpeg内部也提供了转换的函数

    int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const;

    可以直接调用


    我们代码示例一下

    AVCodecContext *vc = NULL; //视频编码器上下文

    AVStream *vs = NULL; //输出rtmp封装器的视频流

    ///编码,推流处理代码。。。。。

    。。。

    。。。

    //编码后的视频packet,时间基数使用的视频编码器

    AVPacket pkt;

    。。。

    //推流用pts

    //使用ffmpeg函数换算

    //pkt.pts = av_rescale_q(pkt.pts,vc->timebase,vs->timebase);

    //如果手动换算

    if(vc->timebase.den > 0 && vs->timebase.den > 0)

    pkt.pts = pkt.pts * (vc->timebase.num/vc->timebase.den)/(vs->timebase.num/vs->timebase.den)


    更多的资料也可以关注我csdn上的视频课程

    夏老师课程专栏http://edu.csdn.net/lecturer/961

    C++编程FFMpeg实时美颜直播推流实战-基于ffmpeg,qt5,opencv视频课程

    C++编程FFMpeg实时美颜直播推流实战-基于ffmpeg,qt5,opencv视频课程


  • 相关阅读:
    (六)目标文件目录探测
    (五)物理路径探测
    (四)目标后台的探测
    小妙招
    MFC的一些常用操作
    UNICODE,GBK,UTF-8区别
    c++编程的字符集及其转换
    windows消息的循环机制
    c++ mfc和win32项目
    c++ 一些注意事项
  • 原文地址:https://www.cnblogs.com/xiacaojun/p/7419564.html
Copyright © 2011-2022 走看看