`
chriszeng87
  • 浏览: 741093 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

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:微秒。

 

repost from: http://yul100887.blog.163.com/blog/static/2003361352012111433326314/

分享到:
评论

相关推荐

    ffmpeg主要数据结构和函数[归类].pdf

    FFmpeg主要数据结构和函数归类 FFmpeg是一款功能强大且广泛使用的多媒体处理库,它提供了丰富的数据结构和函数来处理音视频编解码、文件操作等多种任务。下面我们将对FFmpeg中的主要数据结构和函数进行归类和分析。...

    FFMPEG-4.2 开发库(mingw730_x64)

    FFmpeg 是一个强大的开源多媒体处理框架,用于处理音频和视频数据。它包含了多个库,如 libavcodec(编码解码库)、libavformat(容器格式处理库)、libavfilter(滤镜库)和libavutil(通用工具库)。FFmpeg 4.2 ...

    VC调用ffmpeg步骤及示例代码

    以下是对"VC调用ffmpeg步骤及示例代码"的详细解释: 一、调用FFmpeg的步骤 1. **下载与编译FFmpeg**: 首先,你需要从FFmpeg的官方网站(https://ffmpeg.org/download.html)下载源码,并根据你的VC++版本选择合适...

    FFmpeg SDK的数据结构与API函数详解

    以下是对FFmpeg SDK中核心数据结构和API函数的详细解释。 **1. 数据结构** 在FFmpeg中,关键的数据结构包括: - **AVFormatContext**: 这是FFmpeg中的核心上下文结构,用于存储有关媒体文件的整体信息,如文件...

    ffmpeg编程(API)实现windows的录屏直播推流.zip

    使用`avformat_new_stream()`创建一个新的AVStream,并为其分配AVCodecContext。这里选择合适的编码器,例如H.264,通过`avcodec_find_encoder_by_name()`找到对应的AVCodecID。之后,调用`avcodec_open2()`初始化...

    FFMpeg_库中比较重要的函数以及数据结构

    - AVFormatContext:这是FFmpeg的核心数据结构,包含了输入或输出的多媒体文件格式上下文,如流信息、元数据、文件大小等。 - AVOutputFormat:定义了输出文件的格式,包括编码器、容器格式等信息。 - ...

    通过ffmpeg将AAC格式转成WAV格式

    3. libavutil:提供了一些通用的工具函数,如数据结构、随机数生成、内存管理等。 4. libavfilter:用于音频和视频的滤镜处理,可以实现各种特效和变换。 在VS2008环境下,你需要先下载FFmpeg源码,然后配置项目...

    ffmpeg sdk开发文档

    - `AVFormatContext`是FFMpeg中的一个关键数据结构,用于存储关于视频流格式的信息。 - 它包括了`AVInputFormat`(或`AVOutputFormat`,两者在同一时间只能存在一个)。 - 包含了`AVStream`和`AVPacket`等重要...

    Understanding FFmpeg with source code FFMPEG Fundementals.7z

    数据结构:介绍了FFmpeg中的关键数据结构,如AVFormatContext、AVStream、AVCodecContext、AVPacket、AVIOContext等,这些结构体用于描述多媒体文件、媒体流、编解码器上下文、数据包和I/O操作。 时间信息:讨论了...

    ffmpeg sdk

    - `libavutil`:包含通用的工具函数,如随机数生成、数据结构管理等。 - `libswscale`:用于色彩空间转换和像素格式转换。 - `libswresample`:用于音频重采样和音频通道布局转换。 2. **集成FFmpeg到iOS项目**...

    FFMPEG SDK手册

    FFMPEG中的数据结构是指FFMPEG中使用的各种数据结构,包括AVFormatContext、AVOutputFormat、AVInputFormat、AVCodecContext、AVCodec、AVFrame、AVPacket、AVPicture等。这些数据结构是FFMPEG的核心组件,都是...

    ffmpeg sdk开发手册

    以数据结构**AVFormatContext**为例,它是一个非常重要的结构体,通常贯穿于使用FFMPEG SDK的所有代码中。 - **声明**:`AVFormatContext *oc;` - **初始化**:由于AVFormatContext包含大量信息,因此初始化过程...

    ffmpeg基础库编程开发.pdf

    ### FFmpeg基础库编程开发知识点概览 ...以上是对《FFmpeg基础库编程开发》文档内容的详细解读,涉及多媒体的基本概念、FFmpeg框架、编译应用及核心数据结构等多个方面,为读者提供了全面的技术指导。

    FFMpeg SDK 开发手册

    1. AVFormatContext:这个数据结构包含了整个视频流的格式信息,是进行音视频编解码过程中的核心数据结构之一。它包括了对AVInputFormat或AVOutputFormat的引用,这些格式描述了输入文件或输出文件的格式。同时它也...

    FFMpeg SDK 开发手册 .pdf

    FFMpeg SDK提供了多种数据结构来管理上述概念: - **AVFormatContext**:格式输入/输出上下文,包含了视频流的格式信息、流数据、包数据以及元数据如标题、作者、版权等。 - **AVStream**:表示媒体流,每个...

    最新版FFMPEG解码流程

    在FFmpeg中,解码过程是一个关键步骤,涉及到多个函数和数据结构的交互。以下是FFmpeg解码流程的详细说明: 1. **注册所有容器格式和CODEC**: 使用`av_register_all()`函数,FFmpeg会注册已知的所有容器格式(如...

    ffmpeg3.4.1 将YUV数据封装成Mp4文件

    - 分割YUV数据为Y、U、V三个平面,并转换为FFmpeg的`AVFrame`结构。 - 使用`avcodec_encode_video2()`或`avcodec_send_frame()`发送原始帧到编码器。编码器会处理这些帧,并可能在内部缓冲区中累积编码后的数据包...

    FFMpeg SDK 开发手册(中文)

    本手册将以中文形式详细介绍了FFMpeg SDK的核心概念、数据结构、重要函数以及如何使用这些组件进行音视频处理。 首先,FFMpeg SDK中定义了一系列核心的数据结构,这些结构是进行多媒体处理的基础。 1. ...

Global site tag (gtag.js) - Google Analytics