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

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. .NET Core 3.1之深入源码理解HealthCheck(二)

    写在前面 前文讨论了HealthCheck的理论部分,本文将讨论有关HealthCheck的应用内容. 可以监视内存.磁盘和其他物理服务器资源的使用情况来了解是否处于正常状态. 运行状况检查可以测试应 ...

  2. python接口自动化测试-unittest-生成测试报告

    用例的管理问题解决了后,接下来要考虑的就是报告我问题了,这里生成测试报告主要用到 HTMLTestRunner.py 这个模块,下面简单介绍一下如何使用: 一.下载HTMLTestRunner下载: ...

  3. js动态改变下拉框内容

    今天为大家分享一篇js动态设置select下拉菜单的默认选中项实例,具有很好的参考价值,希望对大家有所帮助. 代码实例如下: <!DOCTYPE html> <html lang=& ...

  4. 使用Rancher Server部署本地多节点K8S集群

    当我第一次开始我的Kubernetes之旅时,我一直在寻找一种设置本地部署环境的方式.很多人常常会使用minikube或microk8s,这两者非常适合新手在单节点集群环境下进行操作.但当我已经了解了 ...

  5. linux条件变量使用和与信号量的区别

    近来在项目中用到条件变量和信号量做同步时,这一块一直都有了解,但也一直没有总结,这次总结一下,给大家提供点参考,也给自己留点纪念. 首先,关于信号量和条件变量的概念可以自行查看APUE,我这直接把AP ...

  6. Pandas 数据分析,高中体测练习

    分析体测成绩 需求: 体侧成绩转变成分数 开卷考试 excel完成可以 pandas读取excel代码中 完成 一个手输入 进一步,画图,分布,体重正常,肥胖,偏瘦比例,绘制饼图 男生跑步1000成绩 ...

  7. FastJSON将Java对象转为json,日期显示时间戳未格式化解决办法

    JSON版本:FastJson Java 对象转换为 JSON 格式 定义以下 Person JavaBean: public class Person { @JSONField(name = &qu ...

  8. C#反射与特性(七):自定义特性以及应用

    目录 1,属性字段的赋值和读值 2,自定义特性和特性查找 2.1 特性规范和自定义特性 2.2 检索特性 3,设计一个数据验证工具 3.1 定义抽象验证特性类 3.2 实现多个自定义验证特性 3.3 ...

  9. 【转】最受欢迎的8位Java牛人

    本文由 ImportNew - 唐尤华 翻译自 javatyro.如需转载本文,请先参见文章末尾处的转载要求. 下面是8位Java牛人,他们为Java社区编写框架.产品.工具或撰写书籍改变了Java编 ...

  10. python对象的初始化

    效果图: 代码: # 对象的初始化 class Person: # 在类中可以定义一些特殊方法(魔术方法) # 特殊方法都是以__开头,__结尾的方法 前后都是两个下划线 # 特殊方法会在特殊的时刻自 ...