zoukankan      html  css  js  c++  java
  • time_base

    From:http://blog.csdn.net/supermanwg/article/details/14521869

    FFMPEG的很多结构中有AVRational time_base;这样的一个成员,它是AVRational结构的

    typedef struct AVRational{
        int num; ///< numerator
        int den; ///< denominator
    } AVRational;

    AVRational这个结构标识一个分数,num为分数,den为分母。

    实际上time_base的意思就是时间的刻度:

    如(1,25),那么时间刻度就是1/25

    (1,9000),那么时间刻度就是1/90000

    那么,在刻度为1/25的体系下的time=5,转换成在刻度为1/90000体系下的时间time为(5*1/25)/(1/90000) = 3600*5=18000

    ffmpeg中做pts计算时,存在大量这种转换

    在以下结构中都有

    AVCodecContext:编解码上下文。

    AVStream:文件或其它容器中的某一个track。

    如果由某个解码器产生固定帧率的码流

    AVCodecContext中的AVRational根据帧率来设定,如25帧,那么num = 1,den=25

    AVStream中的time_base一般根据其采样频率设定,如(1,90000)

    在某些场景下涉及到PTS的计算时,就涉及到两个Time的转换,以及到底取哪里的time_base进行转换:

    场景1:编码器产生的帧,直接存入某个容器的AVStream中,那么此时packet的Time要从AVCodecContext的time转换成目标AVStream的time

    场景2:从一种容器中demux出来的源AVStream的frame,存入另一个容器中某个目的AVStream。

                此时的时间刻度应该从源AVStream的time,转换成目的AVStream timebase下的时间。

    其实,问题的关键还是要理解,不同的场景下取到的数据帧的time是相对哪个时间体系的。

    demux出来的帧的time:是相对于源AVStream的timebase

    编码器出来的帧的time:是相对于源AVCodecContext的timebase

    mux存入文件等容器的time:是相对于目的AVStream的timebase

    这里的time指pts。

    作者:长风 Email:844064492@qq.com QQ群:607717453 Git:https://github.com/zhaohu19910409Dz 开源项目:https://github.com/OriginMEK/MEK 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 感谢您的阅读。如果觉得有用的就请各位大神高抬贵手“推荐一下”吧!你的精神支持是博主强大的写作动力。 如果觉得我的博客有意思,欢迎点击首页左上角的“+加关注”按钮关注我!
  • 相关阅读:
    HTML中ID与NAME的区别
    三层架构的学习感悟(二)
    linux svn安装和配置,不结合apache
    _dopostback回发后台的局限
    ASP.NET 服务器端控件响应客户端事件
    linux centos 下面httpd支持的svn 服务器端安装
    最简单的html tab选项卡
    VC2010 控件的事件窗口面板空白解决办法
    记录一次低版本手机h5页面不能进行跳转
    设计模式的理解
  • 原文地址:https://www.cnblogs.com/zhaohu/p/6298532.html
Copyright © 2011-2022 走看看