zoukankan      html  css  js  c++  java
  • FFMPEG AVRational

    FFMPEG的很多结构中有AVRational time_base;这样的一个成员,它是AVRational结构的
    
    typedef struct AVRational{
        int num; ///< numerator
        int den; ///< denominator
    } AVRational;
    
    AVRational这个结构标识一个分数,num为分数,den为分母。
    
     
    
    实际上time_base的意思就是时间的刻度:
    
    如(1,25),那么时间刻度就是1/251,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一般根据其采样频率设定,如(190000)
    
     
    
    在某些场景下涉及到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。
  • 相关阅读:
    FreeIPA部署及基本使用
    第7天:Django模板使用与表单
    第6天:数据库配置与模型
    第5天:基于类的视图与中间件
    linux下修改MySQL表名与表的字符编码
    webService理解(一)
    查询MySQL库下所有表名,数据为空的表名
    linux中MySQL连接找不到mysql.sock文件
    初步书写Webservice项目,运行后报错:Cannot assign requested address: bind
    linux配置jdk,MySQL环境
  • 原文地址:https://www.cnblogs.com/poissonnotes/p/6904147.html
Copyright © 2011-2022 走看看