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

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. 初识python——知其名而去其意

    ---背景 b2b,房地产,人工智能是今年最火的词汇,那么配套的软件技术究竟是怎样的呢,通过百度,园子里的信息分析,自我感觉需要用python来进行数据采集. ---环境 在百度,qq群的大神指导下, ...

  2. 配置本地目录作为yum端

    ---恢复内容开始--- 最近在配置gnome-session中发现需要太多依赖的包,又由于实验室使用的是局域网,没有办法连接网络,所以想着配置本地yum安装.在网上找了一些资料,经过整理,把自己这次 ...

  3. Java 多线程与并发(六):AQS

    我们前面几张提到过,JUC 这个包里面的工具类的底层就是使用 CAS 和 volatile 来保证线程安全的,整个 JUC 包里面的类都是基于它们构建的.今天我们介绍一个非常重要的同步器,这个类是 J ...

  4. Java 中级 学习笔记 1 JVM的理解以及新生代GC处理流程

    写在最前 从毕业到现在已经过去了差不多一年的时间,工作还算顺利,但总是离不开CRUD ,我觉得这样下去肯定是不行的,温水煮青蛙,势必有一天,会昏昏沉沉的迷失在温水里.所以,需要将之前学习JAVA 当中 ...

  5. 结合docker发布前端项目(基于npm包管理)的shell脚本

    结合docker发布前端项目(基于npm包管理)的shell脚本 本教程依据个人理解并经过实际验证为正确,特此记录下来,权当笔记. 注:基于linux操作系统 目前主流的前后端分离的项目中,常常在部署 ...

  6. 快速回顾MySQL:简单查询操作

    利用空闲时间花几分钟回顾一下 7.1 检索数据 为了查询出数据库表中的行(数据),使用SELECE语句. 格式: # 第一种 SELECT * FROM <table_name>; # 第 ...

  7. C# 使用nuget.exe发布类库及更新类库

    前景:在开发学习阶段希望一些重复使用代码或者算法代码积累.能够在VS中下载安装方便使用. 准备工作: 1.Nuget登录账号(可 Microsoft 账号).Nuget官网 2.Nuget.exe程序 ...

  8. Spring Boot2 系列教程 (四) | 集成 Swagger2 构建强大的 RESTful API 文档

    前言 快过年了,不知道你们啥时候放年假,忙不忙.反正我是挺闲的,所以有时间写 blog.今天给你们带来 SpringBoot 集成 Swagger2 的教程. 什么是 Swagger2 Swagger ...

  9. qiniuLive 连麦流程介绍

    本文出自APICloud官方论坛 qiniuLive 封装了七牛直播云服务平台的移动端开放 SDK.该模块包括视频流采集和视频流播放两部分 iOS连麦流程图: Android连麦流程图: 以下部分代码 ...

  10. 吸取教训:一段网上找的代码突然爆了,项目出现大BUG

    本人是做游戏服务器开发的,碰到一个需求,给符某些要求的玩家的发送道具奖励,奖励的数量根据离线的天数计算. 这个需求实现起来很简单,只需要在玩家上线的时候计算上次离线时间和当前时间间隔的天数,然后根据策 ...