AVCodecContext
这是一个描述编解码器上下文的数据结构,包含了众多编解码器需要的参数信息
如 果是单纯使用libavcodec,这部分信息需要调用者进行初始化;如果是使用整个FFMPEG库,这部分信息在调用 av_open_input_file和av_find_stream_info的过程中根据文件的头信息及媒体流内的头部信息完成初始化。其中几个主要 域的释义如下:
- extradata/extradata_size: 这个buffer中存放了解码器可能会用到的额外信息,在av_read_frame中填充。一般来说,首先,某种具体格式的demuxer在读取格式头 信息的时候会填充extradata,其次,如果demuxer没有做这个事情,比如可能在头部压根儿就没有相关的编解码信息,则相应的parser会继 续从已经解复用出来的媒体流中继续寻找。在没有找到任何额外信息的情况下,这个buffer指针为空。
- time_base:
- width/height:视频的宽和高。
- sample_rate/channels:音频的采样率和信道数目。
- sample_fmt: 音频的原始采样格式。
- codec_name/codec_type/codec_id/codec_tag:编解码器的信息。
AVStream
该结构体描述一个媒体流
主要域的释义如下,其中大部分域的值可以由av_open_input_file根据文件头的信息确定,缺少的信息需要通过调用av_find_stream_info读帧及软解码进一步获取:
- index/id:index对应流的索引,这个数字是自动生成的,根据index可以从AVFormatContext::streams表中索引到该流;而id则是流的标识,依赖于具体的容器格式。比如对于MPEG TS格式,id就是pid。
- time_base:流的时间基准,是一个实数,该流中媒体数据的pts和dts都将以这个时间基准为粒度。通常,使用av_rescale/av_rescale_q可以实现不同时间基准的转换。
- start_time:流的起始时间,以流的时间基准为单位,通常是该流中第一个帧的pts。
- duration:流的总时间,以流的时间基准为单位。
- need_parsing:对该流parsing过程的控制域。
- nb_frames:流内的帧数目。
- r_frame_rate/framerate/avg_frame_rate:帧率相关。
- codec:指向该流对应的AVCodecContext结构,调用av_open_input_file时生成。
- 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主要数据结构和函数归类 FFmpeg是一款功能强大且广泛使用的多媒体处理库,它提供了丰富的数据结构和函数来处理音视频编解码、文件操作等多种任务。下面我们将对FFmpeg中的主要数据结构和函数进行归类和分析。...
FFmpeg 是一个强大的开源多媒体处理框架,用于处理音频和视频数据。它包含了多个库,如 libavcodec(编码解码库)、libavformat(容器格式处理库)、libavfilter(滤镜库)和libavutil(通用工具库)。FFmpeg 4.2 ...
以下是对"VC调用ffmpeg步骤及示例代码"的详细解释: 一、调用FFmpeg的步骤 1. **下载与编译FFmpeg**: 首先,你需要从FFmpeg的官方网站(https://ffmpeg.org/download.html)下载源码,并根据你的VC++版本选择合适...
以下是对FFmpeg SDK中核心数据结构和API函数的详细解释。 **1. 数据结构** 在FFmpeg中,关键的数据结构包括: - **AVFormatContext**: 这是FFmpeg中的核心上下文结构,用于存储有关媒体文件的整体信息,如文件...
使用`avformat_new_stream()`创建一个新的AVStream,并为其分配AVCodecContext。这里选择合适的编码器,例如H.264,通过`avcodec_find_encoder_by_name()`找到对应的AVCodecID。之后,调用`avcodec_open2()`初始化...
3. libavutil:提供了一些通用的工具函数,如数据结构、随机数生成、内存管理等。 4. libavfilter:用于音频和视频的滤镜处理,可以实现各种特效和变换。 在VS2008环境下,你需要先下载FFmpeg源码,然后配置项目...
- `AVFormatContext`是FFMpeg中的一个关键数据结构,用于存储关于视频流格式的信息。 - 它包括了`AVInputFormat`(或`AVOutputFormat`,两者在同一时间只能存在一个)。 - 包含了`AVStream`和`AVPacket`等重要...
数据结构:介绍了FFmpeg中的关键数据结构,如AVFormatContext、AVStream、AVCodecContext、AVPacket、AVIOContext等,这些结构体用于描述多媒体文件、媒体流、编解码器上下文、数据包和I/O操作。 时间信息:讨论了...
- `libavutil`:包含通用的工具函数,如随机数生成、数据结构管理等。 - `libswscale`:用于色彩空间转换和像素格式转换。 - `libswresample`:用于音频重采样和音频通道布局转换。 2. **集成FFmpeg到iOS项目**...
以数据结构**AVFormatContext**为例,它是一个非常重要的结构体,通常贯穿于使用FFMPEG SDK的所有代码中。 - **声明**:`AVFormatContext *oc;` - **初始化**:由于AVFormatContext包含大量信息,因此初始化过程...
### FFmpeg基础库编程开发知识点概览 ...以上是对《FFmpeg基础库编程开发》文档内容的详细解读,涉及多媒体的基本概念、FFmpeg框架、编译应用及核心数据结构等多个方面,为读者提供了全面的技术指导。
1. AVFormatContext:这个数据结构包含了整个视频流的格式信息,是进行音视频编解码过程中的核心数据结构之一。它包括了对AVInputFormat或AVOutputFormat的引用,这些格式描述了输入文件或输出文件的格式。同时它也...
FFMpeg SDK提供了多种数据结构来管理上述概念: - **AVFormatContext**:格式输入/输出上下文,包含了视频流的格式信息、流数据、包数据以及元数据如标题、作者、版权等。 - **AVStream**:表示媒体流,每个...
在FFmpeg中,解码过程是一个关键步骤,涉及到多个函数和数据结构的交互。以下是FFmpeg解码流程的详细说明: 1. **注册所有容器格式和CODEC**: 使用`av_register_all()`函数,FFmpeg会注册已知的所有容器格式(如...
- 分割YUV数据为Y、U、V三个平面,并转换为FFmpeg的`AVFrame`结构。 - 使用`avcodec_encode_video2()`或`avcodec_send_frame()`发送原始帧到编码器。编码器会处理这些帧,并可能在内部缓冲区中累积编码后的数据包...
本手册将以中文形式详细介绍了FFMpeg SDK的核心概念、数据结构、重要函数以及如何使用这些组件进行音视频处理。 首先,FFMpeg SDK中定义了一系列核心的数据结构,这些结构是进行多媒体处理的基础。 1. ...