FFMPEG-数据结构解释(AVCodecContext,AVStream,AVFormatContext)

http://blog.csdn.net/yuan892173701/article/details/8702333

AVCodecContext

 这是一个描述编解码器上下文的数据结构,包含了众多编解码器需要的参数信息

如果是单纯使用libavcodec,这部分信息需要调 用者进行初始化;如果是使用整个FFMPEG库,这部分信息在调用 av_open_input_file和av_find_stream_info的过程中根据文件的头信息及媒体流内的头部信息完成初始化。其中几个主要 域的释义如下:

  1. extradata/extradata_size: 这个buffer中存放了解码器可能会用到的额外信息,在av_read_frame中填充。一般来说,首先,某种具体格式的demuxer在读取格式头 信息的时候会填充extradata,其次,如果demuxer没有做这个事情,比如可能在头部压根儿就没有相关的编解码信息,则相应的parser会继 续从已经解复用出来的媒体流中继续寻找。在没有找到任何额外信息的情况下,这个buffer指针为空。
  2. time_base:
  3. width/height:视频的宽和高。
  4. sample_rate/channels:音频的采样率和信道数目。
  5. sample_fmt: 音频的原始采样格式。
  6. codec_name/codec_type/codec_id/codec_tag:编解码器的信息。

AVStream

 该结构体描述一个媒体流

主要域的释义如下,其中大部分域的值可以由av_open_input_file根据文件头的信息确定,缺少的信息需要通过调用av_find_stream_info读帧及软解码进一步获取:

  1. index/id:index对应流的索引,这个数字是自动生成的,根据index可以从AVFormatContext::streams表中索引到该流;而id则是流的标识,依赖于具体的容器格式。比如对于MPEG TS格式,id就是pid。
  2. time_base:流的时间基准,是一个实数,该流中媒体数据的pts和dts都将以这个时间基准为粒度。通常,使用av_rescale/av_rescale_q可以实现不同时间基准的转换。
  3. start_time:流的起始时间,以流的时间基准为单位,通常是该流中第一个帧的pts。
  4. duration:流的总时间,以流的时间基准为单位。
  5. need_parsing:对该流parsing过程的控制域。
  6. nb_frames:流内的帧数目。
  7. r_frame_rate/framerate/avg_frame_rate:帧率相关。
  8. codec:指向该流对应的AVCodecContext结构,调用av_open_input_file时生成。
  9. parser:指向该流对应的AVCodecParserContext结构,调用av_find_stream_info时生成。

AVFormatContext

   这个结构体描述了一个媒体文件或媒体流的构成和基本信息

这是FFMpeg中最为基本的一个结构,是其他所有结构的根,是一个多媒体文件或流的根本抽象。其中:nb_streams和streams所表示的AVStream结构指针数组包含了所有内嵌媒体流的描述;iformat和oformat指向对应的demuxer和muxer指针;pb则指向一个控制底层数据读写的ByteIOContext结构。

  • start_time和duration是从streams数组的各个AVStream中推断出的多媒体文件的起始时间和长度,以微妙为单位。

通常,这个结构由av_open_input_file在内部创建并以缺省值初始化部分成员。但是,如果调用者希望自己创建该结构,则需要显式为该结构的一些成员置缺省值——如果没有缺省值的话,会导致之后的动作产生异常。以下成员需要被关注:

  • probesize
  • mux_rate
  • packet_size
  • flags
  • max_analyze_duration
  • key
  • max_index_size
  • max_picture_buffer
  • max_delay

AVPacket

AVPacket定义在avcodec.h中

 FFMPEG使用AVPacket来暂存解复用之后、解码之前的媒体数据(一个音/视频帧、一个字幕包等)及附加信息(解码时间戳、显示时间戳、时长等)。其中:

  • dts 表示解码时间戳,pts表示显示时间戳,它们的单位是所属媒体流的时间基准。
  • stream_index 给出所属媒体流的索引;
  • data 为数据缓冲区指针,size为长度;
  • duration 为数据的时长,也是以所属媒体流的时间基准为单位;
  • pos 表示该数据在媒体流中的字节偏移量;
  • destruct 为用于释放数据缓冲区的函数指针;
  • flags 为标志域,其中,最低为置1表示该数据是一个关键帧。

AVPacket 结构本身只是个容器,它使用data成员指向实际的数据缓冲区,这个缓冲区可以通过av_new_packet创建,可以通过     av_dup_packet 拷贝,也可以由FFMPEG的API产生(如av_read_frame),使用之后需要通过调用av_free_packet释放。

av_free_packet调用的是结构体本身的 destruct函数,它的值有两种情况:(1)av_destruct_packet_nofree或 0;(2)av_destruct_packet,其中,前者仅仅是将data和size的值清0而已,后者才会真正地释放缓冲区。FFMPEG内部使用 AVPacket结构建立缓冲区装载数据,同时提供destruct函数,如果FFMPEG打算自己维护缓冲区,则将destruct设为 av_destruct_packet_nofree,用户调用av_free_packet清理缓冲区时并不能够将其释放;如果FFMPEG不会再使用 该缓冲区,则将destruct设为av_destruct_packet,表示它能够被释放。对于缓冲区不能够被释放的AVPackt,用户在使用之前 最好调用av_dup_packet进行缓冲区的克隆,将其转化为缓冲区能够被释放的AVPacket,以免对缓冲区的不当占用造成异常错误。而 av_dup_packet会为destruct指针为av_destruct_packet_nofree的AVPacket新建一个缓冲区,然后将原 缓冲区的数据拷贝至新缓冲区,置data的值为新缓冲区的地址,同时设destruct指针为av_destruct_packet。

时间信息

时间信息用于实现多媒体同步。

同步的目的在于展示多媒体信息时,能够保持媒体对象之间 固有的时间关系。同步有两类,一类是流内同步,其主要任务是保证单个媒体流内的时间关系,以满足感知 要求,如按照规定的帧率播放一段视频;另一类是流间同步,主要任务是保证不同媒体流之间的时间关系,如音频和视频之间的关系(lipsync)。

对于固定速率的媒体,如固定帧率的视频或固定比特率的音频,可以将时间信息(帧率或比特率)置于文件首部(header),如AVI的hdrl List、MP4的moov box,还有一种相对复杂的方案是将时间信息嵌入媒体流的内部,如MPEG TS和Real video,这种方案可以处理变速率的媒体,亦可有效避免同步过程中的时间漂移。

FFMPEG会为每一个数据包打上时间标 签,以更有效地支持上层应用的同步机制。时间标签有两种,一种是DTS,称为解码时间标签,另一种是PTS,称为显示时间标签。对于声音来说 ,这两个时间标签是相同的,但对于某些视频编码格式,由于采用了双向预测技术,会造成DTS和PTS的不一致。

时间信息的获取:

通过调用av_find_stream_info,多媒体应用可以从AVFormatContext对象中拿到媒体文件的时间信息:主要是总时间长度和开始时间,此外还有与时间信息相关的比特率和文件大小。其中时间信息的单位是AV_TIME_BASE:微秒。

时间: 2024-10-10 14:58:02

FFMPEG-数据结构解释(AVCodecContext,AVStream,AVFormatContext)的相关文章

(转)FFMPEG-数据结构解释(AVCodecContext,AVStream,AVFormatContext)

AVCodecContext  这是一个描述编解码器上下文的数据结构,包含了众多编解码器需要的参数信息 如果是单纯使用libavcodec,这部分信息需要调用者进行初始化:如果是使用整个FFMPEG库,这部分信息在调用 av_open_input_file和av_find_stream_info的过程中根据文件的头信息及媒体流内的头部信息完成初始化.其中几个主要 域的释义如下: extradata/extradata_size: 这个buffer中存放了解码器可能会用到的额外信息,在av_rea

FFmpeg 数据结构解析

最近在做媒体盒子的项目,接触到音视频的编解码,于是开始研究FFmpeg的研究之旅. 记得有大牛说过show me your data ,那么就从数据结构开始吧. 先通过下图对各个结构结构有个总体的认识,再具体的分析: AVCodecContext 这是一个描述编解码器上下文的数据结构,包含了众多编解码器需要的参数信息. 如下列出了部分比较重要的域: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

ffmpeg参数解释 <第三篇>

例子:ffmpeg -y -i "1.avi" -title "Test" -vcodec xvid -s 368x208 -r 29.97 -b 1500 -acodec aac -ac 2 -ar 24000 -ab 128 -vol 200 -f psp -muxvb 768 "output.wmv" 解释:以上命令可以在Dos命令行中输入,也可以创建到批处理文件中运行.不过,前提是:要在ffmpeg所在的目录中执行(转换君所在目录下面的c

FFmpeg源代码简单分析:常见结构体(AVFormatContext,AVFrame等)的初始化和销毁

本文简单分析FFmpeg常见结构体的初始化和销毁函数的源代码.常见的结构体在文章: <FFMPEG中最关键的结构体之间的关系>中已经有过叙述,包括: AVFormatContext:统领全局的基本结构体.主要用于处理封装格式(FLV/MKV/RMVB等). AVIOContext:输入输出对应的结构体,用于输入输出(读写文件,RTMP协议等). AVStream,AVCodecContext:视音频流对应的结构体,用于视音频编解码. AVFrame:存储非压缩的数据(视频对应RGB/YUV像素

FFMPEG视音频编解码零基础学习方法-b

感谢大神分享,虽然现在还看不懂,留着大家一起看啦 PS:有不少人不清楚“FFmpeg”应该怎么读.它读作“ef ef em peg” 0. 背景知识 本章主要介绍一下FFMPEG都用在了哪里(在这里仅列几个我所知的,其实远比这个多).说白了就是为了说明:FFMPEG是非常重要的. 使用FFMPEG作为内核视频播放器: Mplayer,ffplay,射手播放器,暴风影音,KMPlayer,QQ影音... 使用FFMPEG作为内核的Directshow Filter: ffdshow,lav fil

FFMPEG视音频编解码零基础学习方法

在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在“大神”和初学者之间好像有一个不可逾越的鸿沟.“大神”们水平高超,探讨着深奥的问题:而初学者们还停留在入门阶段.究竟是什么原因造成的这种“两极分化”呢?最后,我发现了问题的关键:FFMPEG难度比较大,却没有一个循序渐进,由简单到复杂的教程.现在网上的有关FFMPEG的教程多半难度比较大,不太适合刚接

[总结]FFMPEG视音频编解码零基础学习方法

转至 http://my.oschina.net/leixiaohua1020/blog/302174 在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在“大神”和初学者之间好像有一个不可逾越的鸿沟.“大神”们水平高超,探讨着深奥的问题:而初学者们还停留在入门阶段.究竟是什么原因造成的这种“两极分化”呢?最后,我发现了问题的关键:FFMPEG难度比较

转[总结]FFMPEG视音频编解码零基础学习方法 .

http://blog.csdn.net/leixiaohua1020/article/details/15811977 在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在“大神”和初学者之间好像有一个不可逾越的鸿沟.“大神”们水平高超,探讨着深奥的问题:而初学者们还停留在入门阶段.究竟是什么原因造成的这种“两极分化”呢?最后,我发现了问题的关键:F

FFMPEG视音频编解码零基础学习方法 【荐】

在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频 编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在“大神”和初学者之间好像有一 个不可逾越的鸿沟.“大神”们水平高超,探讨着深奥的问题:而初学者们还停留在入门阶段.究竟是什么原因造成的这种“两极分化”呢?最后,我发现了问题的 关键:FFMPEG难度比较大,却没有一个循序渐进,由简单到复杂的教程.现在网上的有关FFMPEG的教程多半难度比较大,不太适