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/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。

时间: 2024-11-09 03:55:47

FFmpeg结构体彻底分析——AVRational-转的相关文章

FFmpeg结构体彻底分析——AVCodecContext

/** * main external API structure. * New fields can be added to the end with minor version bumps. * Removal, reordering and changes to existing fields require a major * version bump. * Please use AVOptions (av_opt* / av_set/get*()) to access these fi

FFmpeg 结构体学习(二): AVStream 分析

在上文FFmpeg 结构体学习(一): AVFormatContext 分析我们学习了AVFormatContext结构体的相关内容.本文,我们将讲述一下AVStream. AVStream是存储每一个视频/音频流信息的结构体.下面我们来分析一下该结构体里重要变量的含义和作用. 一.源码整理 首先我们先看一下结构体AVStream的定义的结构体源码(位于libavformat/avformat.h): /** * Stream structure. * New fields can be add

FFmpeg 结构体学习(五): AVCodec 分析

在上文FFmpeg 结构体学习(四): AVFrame 分析我们学习了AVStream结构体的相关内容.本文,我们将讲述一下AVCodec. AVCodec是存储编解码器信息的结构体.下面我们来分析一下该结构体里重要变量的含义和作用. 一.源码整理 首先我们先看一下结构体AVFrame的定义的结构体源码(位于libavcodec/avcodec.h): /* 雷霄骅 * 中国传媒大学/数字电视技术 * [email protected] * */ /** * AVCodec. */ typede

FFmpeg 结构体学习(七): AVIOContext 分析

在上文FFmpeg 结构体学习(六): AVCodecContext 分析我们学习了AVCodec结构体的相关内容.本文,我们将讲述一下AVIOContext. AVIOContext是FFMPEG管理输入输出数据的结构体.下面我们来分析一下该结构体里重要变量的含义和作用. 一.源码整理 首先我们先看一下结构体AVIOContext的定义的结构体源码(位于libavformat/avio.h): /** * Bytestream IO Context. * New fields can be a

ffmpeg结构体SpecifierOpt说明文档

FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的.FFmpeg具体介绍见:百度百科.FFmpeg官方主页:FFmpeg.org. 这里面涉及到一个重要的结构体:SpecifierOpt.很遗憾,除了官方文档,我没有找到很有价值的分析文章,如果各位

FFMPEG结构体分析:AVFrame(解码后的数据)

https://blog.csdn.net/jxcr1984/article/details/52766524 本文转自: http://blog.csdn.net/leixiaohua1020/article/details/14214577 /*   *雷霄骅   *[email protected]   *中国传媒大学/数字电视技术   */   /**   * Audio Video Frame.   * New fields can be added to the end of AVF

FFmpeg结构体之AVCodec

AVCodec字段 AVCodec是存储编解码器信息的结构体,主要字段注释如下: const char *name; //编解码器名字 const char *long_name; //编解码器全名 enum AVMediaType type; //编解码器类型 enum AVCodecID id; //编解码器ID const AVRational *supported_framerates; //支持帧率数组(视频) const enum AVPixelFormat *pix_fmts; /

FFmpeg: AVPacket 结构体分析

AVPacket是FFmpeg中很重要的一个数据结构,它保存了解封装之后,解码之前的数据(注意:仍然是压缩后的数据)和关于这些数据的一些附加信息,如显示时间戳(pts).解码时间戳(dts).数据时长,所在媒体流的索引等.对于视频来说,AVPacket通常包含一个压缩的Frame,而音频(Audio)则有可能包含多个压缩的Frame.并且,一个Packet有可能是空的,不包含任何压缩数据,只含有side data(side data,容器提供的关于Packet的一些附加信息.例如,在编码结束的时

FFmpeg 常用结构体

0.FFmpeg 中最关键的结构体之间的关系 FFmpeg 中结构体很多.最关键的结构体可以分成以下几类: 1)解协议(http, rtsp, rtmp, mms) AVIOContext,URLProtocol,URLContext 主要存储视音频使用的协议的类型以及状态.URLProtocol 存储输入视音频使用的封装格式.每种协议都对应一个 URLProtocol 结构.(注意:FFmpeg 中文件也被当做一种协议 "file") 2)解封装(flv, avi, rmvb, mp