注:写了一系列的结构体的分析的文章,在这里列一个列表:

FFMPEG结构体分析:AVFrame

FFMPEG结构体分析:AVFormatContext

FFMPEG结构体分析:AVCodecContext

FFMPEG结构体分析:AVIOContext

FFMPEG结构体分析:AVCodec

FFMPEG结构体分析:AVStream

FFMPEG结构体分析:AVPacket

FFMPEG有几个最重要的结构体,包含了解协议,解封装,解码操作,此前已经进行过分析:

FFMPEG中最关键的结构体之间的关系

在此不再详述,其中AVStream是存储每一个视频/音频流信息的结构体。本文将会分析一下该结构体里重要变量的含义和作用。

首先看一下结构体的定义(位于avformat.h文件中):

[cpp] view
plain
 copy

  1. /* 雷霄骅
  2. * 中国传媒大学/数字电视技术
  3. * leixiaohua1020@126.com
  4. *
  5. */
  6. /**
  7. * Stream structure.
  8. * New fields can be added to the end with minor version bumps.
  9. * Removal, reordering and changes to existing fields require a major
  10. * version bump.
  11. * sizeof(AVStream) must not be used outside libav*.
  12. */
  13. typedef struct AVStream {
  14. int index;    /**< stream index in AVFormatContext */
  15. /**
  16. * Format-specific stream ID.
  17. * decoding: set by libavformat
  18. * encoding: set by the user
  19. */
  20. int id;
  21. AVCodecContext *codec; /**< codec context */
  22. /**
  23. * Real base framerate of the stream.
  24. * This is the lowest framerate with which all timestamps can be
  25. * represented accurately (it is the least common multiple of all
  26. * framerates in the stream). Note, this value is just a guess!
  27. * For example, if the time base is 1/90000 and all frames have either
  28. * approximately 3600 or 1800 timer ticks, then r_frame_rate will be 50/1.
  29. */
  30. AVRational r_frame_rate;
  31. void *priv_data;
  32. /**
  33. * encoding: pts generation when outputting stream
  34. */
  35. struct AVFrac pts;
  36. /**
  37. * This is the fundamental unit of time (in seconds) in terms
  38. * of which frame timestamps are represented. For fixed-fps content,
  39. * time base should be 1/framerate and timestamp increments should be 1.
  40. * decoding: set by libavformat
  41. * encoding: set by libavformat in av_write_header
  42. */
  43. AVRational time_base;
  44. /**
  45. * Decoding: pts of the first frame of the stream in presentation order, in stream time base.
  46. * Only set this if you are absolutely 100% sure that the value you set
  47. * it to really is the pts of the first frame.
  48. * This may be undefined (AV_NOPTS_VALUE).
  49. * @note The ASF header does NOT contain a correct start_time the ASF
  50. * demuxer must NOT set this.
  51. */
  52. int64_t start_time;
  53. /**
  54. * Decoding: duration of the stream, in stream time base.
  55. * If a source file does not specify a duration, but does specify
  56. * a bitrate, this value will be estimated from bitrate and file size.
  57. */
  58. int64_t duration;
  59. int64_t nb_frames;                 ///< number of frames in this stream if known or 0
  60. int disposition; /**< AV_DISPOSITION_* bit field */
  61. enum AVDiscard discard; ///< Selects which packets can be discarded at will and do not need to be demuxed.
  62. /**
  63. * sample aspect ratio (0 if unknown)
  64. * - encoding: Set by user.
  65. * - decoding: Set by libavformat.
  66. */
  67. AVRational sample_aspect_ratio;
  68. AVDictionary *metadata;
  69. /**
  70. * Average framerate
  71. */
  72. AVRational avg_frame_rate;
  73. /**
  74. * For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet
  75. * will contain the attached picture.
  76. *
  77. * decoding: set by libavformat, must not be modified by the caller.
  78. * encoding: unused
  79. */
  80. AVPacket attached_pic;
  81. /*****************************************************************
  82. * All fields below this line are not part of the public API. They
  83. * may not be used outside of libavformat and can be changed and
  84. * removed at will.
  85. * New public fields should be added right above.
  86. *****************************************************************
  87. */
  88. /**
  89. * Stream information used internally by av_find_stream_info()
  90. */
  91. #define MAX_STD_TIMEBASES (60*12+5)
  92. struct {
  93. int64_t last_dts;
  94. int64_t duration_gcd;
  95. int duration_count;
  96. double duration_error[2][2][MAX_STD_TIMEBASES];
  97. int64_t codec_info_duration;
  98. int nb_decoded_frames;
  99. int found_decoder;
  100. } *info;
  101. int pts_wrap_bits; /**< number of bits in pts (used for wrapping control) */
  102. // Timestamp generation support:
  103. /**
  104. * Timestamp corresponding to the last dts sync point.
  105. *
  106. * Initialized when AVCodecParserContext.dts_sync_point >= 0 and
  107. * a DTS is received from the underlying container. Otherwise set to
  108. * AV_NOPTS_VALUE by default.
  109. */
  110. int64_t reference_dts;
  111. int64_t first_dts;
  112. int64_t cur_dts;
  113. int64_t last_IP_pts;
  114. int last_IP_duration;
  115. /**
  116. * Number of packets to buffer for codec probing
  117. */
  118. #define MAX_PROBE_PACKETS 2500
  119. int probe_packets;
  120. /**
  121. * Number of frames that have been demuxed during av_find_stream_info()
  122. */
  123. int codec_info_nb_frames;
  124. /**
  125. * Stream Identifier
  126. * This is the MPEG-TS stream identifier +1
  127. * 0 means unknown
  128. */
  129. int stream_identifier;
  130. int64_t interleaver_chunk_size;
  131. int64_t interleaver_chunk_duration;
  132. /* av_read_frame() support */
  133. enum AVStreamParseType need_parsing;
  134. struct AVCodecParserContext *parser;
  135. /**
  136. * last packet in packet_buffer for this stream when muxing.
  137. */
  138. struct AVPacketList *last_in_packet_buffer;
  139. AVProbeData probe_data;
  140. #define MAX_REORDER_DELAY 16
  141. int64_t pts_buffer[MAX_REORDER_DELAY+1];
  142. AVIndexEntry *index_entries; /**< Only used if the format does not
  143. support seeking natively. */
  144. int nb_index_entries;
  145. unsigned int index_entries_allocated_size;
  146. /**
  147. * flag to indicate that probing is requested
  148. * NOT PART OF PUBLIC API
  149. */
  150. int request_probe;
  151. } AVStream;

AVStream重要的变量如下所示:

int index:标识该视频/音频流

AVCodecContext *codec:指向该视频/音频流的AVCodecContext(它们是一一对应的关系)

AVRational time_base:时基。通过该值可以把PTS,DTS转化为真正的时间。FFMPEG其他结构体中也有这个字段,但是根据我的经验,只有AVStream中的time_base是可用的。PTS*time_base=真正的时间

int64_t duration:该视频/音频流长度

AVDictionary *metadata:元数据信息

AVRational avg_frame_rate:帧率(注:对视频来说,这个挺重要的)

AVPacket attached_pic:附带的图片。比如说一些MP3,AAC音频文件附带的专辑封面。

该结构体其他字段的作用目前还有待于探索。

FMPEG结构体分析:AVStream的更多相关文章

  1. FFMPEG结构体分析:AVStream

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  2. FFMPEG结构体分析:AVPacket

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  3. FFMPEG结构体分析:AVCodec

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  4. FFMPEG结构体分析:AVIOContext

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  5. FFMPEG结构体分析:AVCodecContext

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  6. FFMPEG结构体分析:AVFormatContext

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrameFFMPEG结构体分析:AVFormatContextFFMPEG结构体分析:AVCodecContext ...

  7. FFMPEG结构体分析:AVFrame

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrameFFMPEG结构体分析:AVFormatContextFFMPEG结构体分析:AVCodecContext ...

  8. FFmpeg: AVFormatContext 结构体分析

    AVFormatContext 结构体分析这个结构体描述了一个媒体文件或媒体流的构成和基本信息.这是FFMpeg中最为基本的一个结构,是其他所有结构的根,是一个多媒体文件或流的根本抽象.主要成员释义: ...

  9. FFMPEG结构体分析:AVCodecContext(转)

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrameFFMPEG结构体分析:AVFormatContextFFMPEG结构体分析:AVCodecContext ...

随机推荐

  1. $Noip2014/Luogu1351$ 联合权值 树形

    $Luogu$ $Description$ 给定一棵树,每两个距离为$2$的点之间可以产生"联合权值","联合权值"定义为这两个数的乘积.求最大的联合权值以及所 ...

  2. 1067 试密码 (20分)C语言

    当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码(长度不超过 20 的.不包含空格. ...

  3. CentOS7.2 部署Ceph分布式存储

    1.1 环境准备 主机名 IP地址 ceph-admin 192.168.16.220 ceph-node1,ceph-mon 192.168.16.221 ceph-node2,ceph-mon 1 ...

  4. linux下卸载旧版本cmake安装新版本cmake

    1.看当前cmake版本 cmake --version 2.卸载旧版本下的cmake apt-get autoremove cmake 3.安装新版面cmake http://www.cnblogs ...

  5. java反射-- Field 用法实践

    java 反射是一种常用的技术手段, 通过加载类的字节码的方式来获取相关类的一些信息 比如成员变量, 成员方法等. Field 是什么呢? field 是一个类, 位于java.lang.reflec ...

  6. Spring Boot2 系列教程(三十一)Spring Boot 构建 RESTful 风格应用

    RESTful ,到现在相信已经没人不知道这个东西了吧!关于 RESTful 的概念,我这里就不做过多介绍了,传统的 Struts 对 RESTful 支持不够友好 ,但是 SpringMVC 对于 ...

  7. eclipse中使用postgreSQL报错( Cannot load JDBC driver class )

    需求: 使用Maven插件调用PostgreSQL数据库 环境: eclipse_4.5.0+JDK_1.7+Tomcat_7.0+Maven+postgresql-9.1-901.jdbc4.jar ...

  8. ArcGIS Server for JavaScript 3.3 的安装部署

    一.安装包下载 首先从官网下载ArcGIS API for JavaScript 3.3 的API和SDK,地址:http://support.esrichina.com.cn/2011/0223/9 ...

  9. navicate远程连接mysql8.0失败

    已经给了远程连接权限(update mysql.user set host = "%" where user = 'root'; flush privileges;) 连接错误提示 ...

  10. 【一起学源码-微服务】Hystrix 源码一:Hystrix基础原理与Demo搭建

    说明 原创不易,如若转载 请标明来源! 欢迎关注本人微信公众号:壹枝花算不算浪漫 更多内容也可查看本人博客:一枝花算不算浪漫 前言 前情回顾 上一个系列文章讲解了Feign的源码,主要是Feign动态 ...