FFmpeg第二话:FFmpeg 主要结构体剖析
FFmpeg 探索之旅
一、FFmpeg 简介与环境搭建
二、FFmpeg 主要结构体剖析
三、FFmpeg 视频解码详解
FFmpeg 主要结构体剖析
- FFmpeg 探索之旅
- 前言
- 1、AVFormatContext
- 2、AVCodecContext
- 3、AVCodec
- 4、AVStream
- 5、AVPacket
- 6、AVFrame
- 7、AVCodecParameters
- 7、SwsContext
- 8、AVIOContext
- 9、AVRational
- 总结
前言
嘿,各位小伙伴!在如今这个多媒体爆棚的时代,视频、音频那是五花八门,啥格式都有。而FFmpeg ,不管是给视频音频搞编解码,还是转码、加滤镜玩出各种花样,它都在行。不过呢,要想把 FFmpeg 这强大的本事给吃透,关键得弄懂它里面几个当家的结构体,这就好比你得摸清万能钥匙上那些齿痕到底是咋回事,有了这门道,才能真正解锁 FFmpeg 的魔法。今儿个,咱就一块儿来扒一扒这几个神秘又重要的结构体。
1、AVFormatContext
- 原型:
typedef struct AVFormatContext {
const AVClass *av_class;
void *priv_data;
AVIOContext *pb;
unsigned int nb_streams;
AVStream **streams;
char filename[1024];
int64_t start_time;
int64_t duration;
int64_t bit_rate;
unsigned int packet_size;
int flags;
// 还有许多其他成员变量
} AVFormatContext;
-
分析:
- 整体作用:它是FFmpeg中用于封装格式相关信息的结构体,是对输入或输出媒体文件的一种抽象表示,在整个多媒体处理流程中起着核心的协调作用。
- 成员变量含义:
av_class
提供了该结构体的类信息,主要用于FFmpeg内部的一些面向对象的操作和反射机制;priv_data
用于存储特定格式的私有数据,不同的封装格式可以在这里存储自己需要的额外信息;pb
是一个指向AVIOContext
的指针,用于对输入输出数据的读写操作,它使得FFmpeg可以从各种数据源读取数据或向各种数据目标写入数据;nb_streams
表示媒体文件中包含的流的数量,如视频流、音频流、字幕流等;streams
是一个指向AVStream
结构体指针的数组,每个元素对应媒体文件中的一个流;filename
存储了当前处理的媒体文件的文件名;start_time
、duration
和bit_rate
分别表示媒体文件的开始时间、持续时间和比特率;packet_size
和flags
等其他成员变量则用于存储与格式相关的其他各种参数和标志。
2、AVCodecContext
- 原型:
typedef struct AVCodecContext {
const AVClass *av_class;
void *priv_data;
AVCodec *codec;
int bit_rate;
int bits_per_coded_sample;
int global_quality;
int compression_level;
int flags;
int flags2;
AVRational time_base;
int width;
int height;
int coded_width;
int coded_height;
int gop_size;
int max_b_frames;
int pix_fmt;
int sample_rate;
int sample_fmt;
int channels;
int channel_layout;
// 还有许多其他成员变量
} AVCodecContext;
-
分析:
-
整体作用:
AVCodecContext
结构体在FFmpeg中起着至关重要的作用,它是编解码操作的核心上下文结构体,用于存储与编解码相关的各种参数和状态信息,为编解码器的正确运行提供了必要的环境和配置。 -
成员变量含义:
- 基础信息相关:
av_class
提供了该结构体的类信息,主要用于FFmpeg内部的一些面向对象的操作和反射机制,方便对结构体进行统一的管理和操作。priv_data
用于存储编解码器的私有数据,不同的编解码器可以在这里存储自己特有的一些信息,如特定算法的中间状态、优化参数等,以便在编解码过程中使用。codec
是一个指向AVCodec
结构体的指针,它代表了具体使用的编解码器,通过这个指针可以获取编解码器的各种属性和操作函数。
- 编码参数相关:
bit_rate
指定了编码的目标比特率,即每秒输出的比特数,用于控制编码后数据的大小和质量,比特率越高,编码后的质量通常越高,但数据量也越大。bits_per_coded_sample
表示每个编码样本的比特数,对于不同的编码格式和编码类型,这个值会有所不同,它决定了编码数据的精度和压缩程度。global_quality
和compression_level
用于控制编码的质量和压缩级别,较高的质量或较低的压缩级别通常会导致编码后的数据质量更好,但文件大小也会相应增加,用户可以根据具体需求进行调整。flags
和flags2
是一些标志位,用于控制编解码过程中的各种行为和特性,如是否使用特定的编码模式、是否启用某些优化选项等,不同的编解码器对这些标志位的定义和使用可能会有所差异。
- 时间相关:
time_base
是一个AVRational
结构体,用于表示时间基,即时间刻度的分数表示,它对于时间的计算和同步非常重要,在编解码过程中,时间戳等时间相关的信息都是基于这个时间基进行计算和处理的。
- 视频参数相关:
width
和height
分别表示视频的原始宽度和高度,即未经过编码或解码处理前的视频图像的尺寸,它们决定了视频画面的大小。coded_width
和coded_height
则表示编码后的视频宽度和高度,在一些编码格式中,编码后的视频尺寸可能与原始尺寸不同,这两个参数用于记录实际编码后的尺寸信息。gop_size
表示视频编码中的 GOP(Group of Pictures)大小,即两个关键帧之间的帧数,它对视频的压缩效率和随机访问性能有重要影响,较大的 GOP 尺寸可以提高压缩比,但会降低随机访问的灵活性。max_b_frames
指定了最大的B帧数量,B帧是视频编码中的一种帧类型,它通过参考前后的帧进行差值编码,适当增加B帧数量可以提高视频的压缩效率,但也会增加编解码的复杂度和延迟。pix_fmt
表示视频的像素格式,如YUV420P、RGB24等,不同的像素格式具有不同的颜色表示方式和存储结构,编解码器需要根据指定的像素格式进行正确的编码和解码操作。
- 音频参数相关:
sample_rate
表示音频的采样率,即每秒采集的音频样本数量,它决定了音频的频率范围和音质,常见的采样率有44100Hz、48000Hz等。sample_fmt
表示音频的样本格式,如AV_SAMPLE_FMT_S16、AV_SAMPLE_FMT_FLTP等,它决定了音频样本的数据类型和存储方式,不同的样本格式在精度、动态范围和计算效率等方面可能会有所差异。channels
表示音频的声道数,如单声道、双声道、立体声等,它决定了音频的空间效果和播放方式。channel_layout
则以更详细的位掩码形式表示音频的声道布局,用于更精确地描述声道的位置和组合方式,例如左右声道、环绕声道等的具体布局。
- 基础信息相关:
3、AVCodec
- 原型:
typedef struct AVCodec {
const char *name;
const char *long_name;
enum AVMediaType type;
enum AVCodecID id;
int capabilities;
const AVRational *supported_framerates;
const enum AVPixelFormat *pix_fmts;
const int *supported_samplerates;
const enum AVSampleFormat *sample_fmts;
const uint64_t *channel_layouts;
int priv_data_size;
// 还有其他成员变量
} AVCodec;
- 分析:
- 整体作用:
AVCodec
结构体用于表示一个编解码器,它包含了编解码器的各种属性和功能信息,是FFmpeg中进行编解码操作的重要依据和接口。通过该结构体,FFmpeg可以了解编解码器的名称、类型、支持的格式、帧率、采样率等关键信息,从而实现对不同媒体数据的编解码处理。 - 成员变量含义:
- 基本信息:
name
是编解码器的简短名称,通常是一个字符串标识符,用于在FFmpeg内部快速识别和查找编解码器,例如"h264"、"aac"等。long_name
是编解码器的详细名称,包含了更多关于编解码器的描述信息,如版本、特性等,方便用户在查看和选择编解码器时获取更全面的信息。type
是一个枚举类型AVMediaType
,用于指定编解码器处理的媒体类型,如视频(AVMEDIA_TYPE_VIDEO
)、音频(AVMEDIA_TYPE_AUDIO
)或字幕(AVMEDIA_TYPE_SUBTITLE
)等,这有助于FFmpeg对不同类型的媒体数据进行分类和处理。id
是一个枚举类型AVCodecID
,用于唯一标识编解码器,每个编解码器都有一个特定的AVCodecID
值,如AV_CODEC_ID_H264
、AV_CODEC_ID_AAC
等,通过这个标识符,FFmpeg可以快速准确地找到对应的编解码器进行操作。
- 功能特性:
capabilities
是一个整数,用于表示编解码器的功能特性,它包含了一系列的位标志,如是否支持编码、解码、硬件加速等功能,通过对这些位标志的判断,FFmpeg可以确定编解码器是否满足特定的操作需求。supported_framerates
是一个指向AVRational
结构体数组的指针,用于表示编解码器支持的帧率,每个AVRational
结构体表示一个帧率的分数形式,如{1, 25}
表示25帧每秒,通过这个成员变量,FFmpeg可以了解编解码器能够处理的帧率范围,从而进行相应的帧率设置和转换操作。
- 格式支持:
pix_fmts
是一个指向AVPixelFormat
枚举类型数组的指针,用于表示编解码器支持的像素格式,如AV_PIX_FMT_YUV420P
、AV_PIX_FMT_RGB24
等,不同的编解码器可能支持不同的像素格式,通过这个成员变量,FFmpeg可以在编码或解码过程中选择合适的像素格式进行数据处理。sample_fmts
是一个指向AVSampleFormat
枚举类型数组的指针,用于表示编解码器支持的音频采样格式,如AV_SAMPLE_FMT_S16
、AV_SAMPLE_FMT_FLAC
等,这对于音频编解码过程中的数据格式转换和处理非常重要。supported_samplerates
是一个指向整数数组的指针,用于表示编解码器支持的音频采样率,如44100、48000等,通过这个成员变量,FFmpeg可以根据实际需求选择合适的采样率进行音频编解码操作。channel_layouts
是一个指向uint64_t
类型数组的指针,用于表示编解码器支持的声道布局,如单声道、立体声、5.1声道等,通过这个成员变量,FFmpeg可以在音频编解码过程中正确处理声道信息,确保音频的正确播放和处理。
- 私有数据:
priv_data_size
表示编解码器私有数据的大小,某些编解码器可能需要一些额外的私有数据来进行特定的初始化或操作,通过这个成员变量,FFmpeg可以为编解码器分配足够的内存空间来存储私有数据,从而保证编解码器的正常运行。
- 基本信息:
- 整体作用:
4、AVStream
- 原型:
typedef struct AVStream {
int index;
AVCodecContext *codec;
AVCodecParameters *codecpar;
int64_t start_time;
int64_t duration;
int64_t nb_frames;
AVRational time_base;
int sample_aspect_ratio_num;
int sample_aspect_ratio_den;
// 还有其他成员变量
} AVStream;
- 分析:
- 整体作用:该结构体用于表示媒体文件中的一个流,如视频流、音频流或字幕流等,它包含了与流相关的各种参数和信息,是FFmpeg中对流进行操作和处理的重要数据结构。
- 成员变量含义:
index
是流在AVFormatContext
的streams
数组中的索引;codec
是一个指向AVCodecContext
的指针,用于存储该流的编解码上下文信息,通过它可以获取和设置编解码器的各种参数以及进行编解码操作;codecpar
是一个指向AVCodecParameters
的指针,它存储了流的编码参数信息,如编码类型、视频的宽高、音频的采样率等,在某些情况下可以直接通过它获取流的编码参数而无需访问codec
上下文;start_time
、duration
和nb_frames
分别表示流的开始时间、持续时间和帧数;time_base
是一个AVRational
结构体,用于表示时间基,即时间刻度的分数表示,它对于时间的计算和同步非常重要,不同的流可能有不同的时间基;sample_aspect_ratio_num
和sample_aspect_ratio_den
用于表示样本宽高比的分子和分母,主要用于视频流,用于描述视频像素的宽高比与显示宽高比之间的关系。
5、AVPacket
- 原型:
typedef struct AVPacket {
AVBufferRef *buf;
int64_t pts;
int64_t dts;
uint8_t *data;
int size;
int stream_index;
// 还有其他成员变量
} AVPacket;
- 分析:
- 整体作用:它是FFmpeg中用于存储压缩后的媒体数据的结构体,在多媒体数据的传输和处理过程中起着关键作用,例如在从媒体文件中读取数据、进行编解码操作以及向输出目标写入数据时都会用到。
- 成员变量含义:
buf
是一个指向AVBufferRef
的指针,用于管理数据包的内存缓冲区,它可以自动进行内存的引用计数和释放,确保数据的安全和高效处理;pts
和dts
分别表示显示时间戳和解码时间戳,它们对于视频和音频的同步播放以及正确解码顺序非常重要,pts
用于确定何时显示该数据包对应的帧,dts
用于确定何时解码该数据包;data
是一个指向存储媒体数据的字节数组的指针,实际的压缩媒体数据就存储在这里;size
表示data
数组中有效数据的长度;stream_index
表示该数据包所属的流在AVFormatContext
的streams
数组中的索引,通过它可以确定该数据包属于哪个视频流、音频流或其他流。
6、AVFrame
- 原型:
typedef struct AVFrame {
AVBufferRef *buf;
AVCodecContext *codec;
AVCodecParameters *codecpar;
uint8_t *data[AV_NUM_DATA_POINTERS];
int linesize[AV_NUM_DATA_POINTERS];
int width, height;
int key_frame;
enum AVPictureType pict_type;
AVRational sample_aspect_ratio;
// 还有其他成员变量
} AVFrame;
- 分析:
- 整体作用:用于存储解码后的原始媒体数据,如视频的一帧图像数据或音频的一段采样数据,是FFmpeg中在解码后和编码前对媒体数据进行处理和操作的重要结构体。
- 成员变量含义:
buf
同样是用于内存管理的AVBufferRef
指针;codec
和codecpar
分别指向编解码上下文和编解码参数,用于获取与该帧数据相关的编解码信息;data
是一个指针数组,用于存储实际的媒体数据,对于视频帧,它可以存储不同颜色平面的数据,如YUV格式的数据;linesize
数组表示data
中每个平面的一行数据的字节长度,这对于正确处理图像数据非常重要,特别是在进行图像格式转换和缩放等操作时;width
和height
表示视频帧的宽度和高度;key_frame
是一个标志位,用于表示该帧是否为关键帧,关键帧在视频编码中具有特殊的重要性,它是视频序列中的完整图像帧,可以独立进行解码和显示;pict_type
表示图像的类型,如I帧、P帧、B帧等;sample_aspect_ratio
用于存储视频帧的样本宽高比信息。在此基础上完善其他结构体
7、AVCodecParameters
- 原型
typedef struct AVCodecParameters {
AVCodecID codec_id;
enum AVMediaType codec_type;
int format;
int bit_rate;
int bits_per_coded_sample;
int bits_per_raw_sample;
int profile;
int level;
int width;
int height;
AVRational sample_aspect_ratio;
int fps_num;
int fps_den;
int field_order;
int time_base_num;
int time_base_den;
int refs;
int chroma_location;
int num_channels;
int block_align;
int frame_size;
int sample_rate;
int extradata_size;
uint8_t *extradata;
// 还有其他成员变量
} AVCodecParameters;
- 分析
- 整体作用:
AVCodecParameters
结构体主要用于存储流的编码参数信息,它提供了一种统一的方式来获取和设置编码相关的参数,使得FFmpeg能够在不依赖具体编解码器实现的情况下,对不同格式和编码类型的流进行处理和操作,是FFmpeg中在处理媒体流编码参数时的重要数据结构。 - 成员变量含义:
- 基本编码信息:
codec_id
:用于标识具体的编解码器,如AV_CODEC_ID_H264
表示H.264编解码器,AV_CODEC_ID_AAC
表示AAC编解码器等,通过这个ID,FFmpeg可以找到对应的编解码器进行后续操作。codec_type
:表示编码类型,如AVMEDIA_TYPE_VIDEO
代表视频,AVMEDIA_TYPE_AUDIO
代表音频,AVMEDIA_TYPE_SUBTITLE
代表字幕等,它帮助FFmpeg确定对该流应采用何种类型的处理方式。
- 数据格式与精度:
format
:指定了数据的存储格式,例如对于视频可能是YUV格式的某种具体表示,对于音频可能是PCM格式等,不同的格式会影响到后续的数据处理和显示。bit_rate
:表示编码后的比特率,即每秒传输的比特数,它反映了编码数据的压缩程度和质量,比特率越高,通常质量越好,但数据量也越大。bits_per_coded_sample
:表示每个编码样本的比特数,用于衡量编码后数据的精度,对于视频和音频有不同的含义和作用。bits_per_raw_sample
:表示每个原始样本的比特数,主要用于与编码前的原始数据精度进行对比和参考。
- 编解码特性与级别:
profile
:用于指定编解码器的特定配置文件或规范,不同的profile对应着不同的功能集和编码特性,例如H.264有Baseline、Main、High等profile,不同profile适用于不同的应用场景和设备兼容性要求。level
:表示编解码器的级别,它与profile一起进一步限定了编解码器的功能和性能范围,通常与视频的分辨率、帧率、比特率等参数相关联,用于确保编解码过程在特定的设备或系统上能够正常运行。
- 视频相关参数:
width
和height
:分别表示视频帧的宽度和高度,以像素为单位,这是视频显示和处理中非常重要的参数,决定了视频的分辨率和画面大小。sample_aspect_ratio
:用于表示视频的样本宽高比,即像素宽高比与显示宽高比之间的关系,它影响着视频在显示时的形状和比例是否正确。fps_num
和fps_den
:分别表示视频的帧率的分子和分母,通过这两个参数可以计算出视频的帧率,帧率决定了视频的流畅度和动态效果。field_order
:用于指定视频的场序,即视频图像的扫描顺序,常见的有逐行扫描和隔行扫描等不同的场序方式,对于视频的显示和处理有一定影响。time_base_num
和time_base_den
:用于表示视频的时间基,即时间刻度的分数表示,它与视频的帧率等参数一起用于时间的计算和同步,确保视频播放的时间准确性。
- 音频相关参数:
num_channels
:表示音频的声道数,如单声道为1,立体声为2等,声道数决定了音频的空间效果和声音的丰富程度。block_align
:表示音频数据块的对齐方式,通常与音频的编码格式和声道数等相关,对于音频数据的存储和处理有一定影响。frame_size
:表示音频的帧大小,即每次处理的音频样本数量,它与音频的采样率等参数一起用于音频的播放和处理。sample_rate
:表示音频的采样率,即每秒采集的音频样本数量,采样率越高,音频的质量和还原度越高,但数据量也越大。
- 额外数据与扩展:
extradata_size
:表示额外数据的大小,单位为字节。extradata
:是一个指向存储额外数据的字节数组的指针,这些额外数据通常包含一些与编码相关的补充信息,如编码的配置信息、头信息等,对于一些特殊的编码格式或编解码器可能会用到这些额外数据来进行更准确的编解码操作。
- 基本编码信息:
7、SwsContext
- 原型
typedef struct SwsContext {
const AVClass *av_class;
void *log_ctx;
enum AVPixelFormat srcFormat;
enum AVPixelFormat dstFormat;
int srcW;
int srcH;
int dstW;
int dstH;
int flags;
int srcRange;
int dstRange;
int param[2];
int sliceY;
int sliceH;
int lumX;
int lumY;
int chrX;
int chrY;
int numSrcSlice;
int numDstSlice;
int srcSliceX;
int srcSliceY;
int dstSliceX;
int dstSliceY;
int srcStride[4];
int dstStride[4];
uint8_t *srcSlice[4];
uint8_t *dstSlice[4];
struct SwsFilter *srcFilter;
struct SwsFilter *dstFilter;
void *filter_ctx;
const char *owner;
void *priv;
int (*scale)(struct SwsContext *c, const uint8_t *const srcSlice[],
const int srcStride[], int srcSliceY, int srcSliceH,
uint8_t *const dstSlice[], const int dstStride[]);
int (*chroma_scale)(struct SwsContext *c, const uint8_t *const srcSlice[],
const int srcStride[], int srcSliceY, int srcSliceH,
uint8_t *const dstSlice[], const int dstStride[]);
int (*lumXform)(struct SwsContext *c, const uint8_t *src, int srcStride,
uint8_t *dst, int dstStride);
int (*chrXform)(struct SwsContext *c, const uint8_t *src, int srcStride,
uint8_t *dst, int dstStride);
// 还有其他成员变量
} SwsContext;
- 分析
- 整体作用:
SwsContext
结构体在FFmpeg中处于核心地位,主要用于图像格式转换相关操作,像是在不同像素格式、分辨率以及颜色空间之间进行转换等,为视频处理中的图像缩放、像素格式变更、色彩空间转换等功能提供了支持,确保图像能按照设定的要求进行相应的转换处理,满足多样化的应用场景需求,比如适配不同显示设备、视频编辑中的格式调整等。 - 成员变量含义:
- 基础属性与上下文关联:
av_class
:指向AVClass
结构体,主要用于FFmpeg内部的一些面向对象风格的机制,像日志记录、属性访问等,有助于实现相关功能的统一管理和拓展。log_ctx
:用于关联日志记录的上下文,方便在图像转换过程中记录相关操作的日志信息,便于调试以及排查可能出现的问题。
- 源图像与目标图像格式及尺寸:
srcFormat
:指定了源图像的像素格式,例如AV_PIXEL_FORMAT_YUV420P
、AV_PIXEL_FORMAT_RGB24
等,明确了源图像数据的存储格式,决定了后续对源图像数据读取和处理的方式。dstFormat
:与之相对应,定义了目标图像的像素格式,即转换后图像应呈现的像素格式,这是转换操作期望达成的目标格式,根据不同的应用场景会设置为不同的格式类型。srcW
和srcH
:分别代表源图像的宽度和高度,以像素为单位,这两个参数确定了源图像的尺寸大小,是进行图像缩放等转换操作时的重要参考依据,决定了源图像数据的范围。dstW
和dstH
:表示目标图像的宽度和高度,同样以像素为单位,它们规定了转换后图像的尺寸,比如在将高清视频转换为标清视频或者适配不同分辨率显示设备时,会通过设置这两个参数来控制目标图像大小。
- 转换相关控制参数:
flags
:包含了一系列用于控制图像转换过程的标志位,比如是否进行高质量的缩放、是否使用特定的色彩空间转换算法等,通过不同的标志组合可以灵活调整转换的方式和效果。srcRange
和dstRange
:分别用于指定源图像和目标图像的像素值范围,例如是全范围(0 - 255)还是限幅范围(16 - 235)等,不同的范围设定会影响图像的色彩表现和亮度等特性。param
:这是一个数组,存放着与图像转换相关的参数,具体含义会根据不同的转换情况有所变化,比如可能涉及到色彩空间转换系数、缩放比例等参数,辅助控制转换过程的细节。
- 切片相关参数:
sliceY
、sliceH
等一系列以“slice”开头的参数,主要用于在图像转换时对图像进行切片处理,将图像划分为多个小块来分别进行转换,有助于提高转换效率,特别是在处理大尺寸图像或者并行处理的场景下会发挥作用。
- 图像数据指针与步长相关:
srcStride[4]
和dstStride[4]
:分别表示源图像和目标图像每行数据的字节数(步长),对于不同的像素格式和图像布局,每行数据的字节数可能不同,这些参数便于准确地定位和处理图像数据,确保在进行数据读取和写入时不会出现错误。srcSlice[4]
和dstSlice[4]
:是指向源图像和目标图像切片数据的指针数组,结合前面的切片参数以及步长参数,用于精确地操作图像切片数据,实现对图像不同部分的转换处理。
- 滤镜相关及转换函数指针:
srcFilter
和dstFilter
:分别指向源图像和目标图像的滤镜上下文结构体,用于在图像转换前后对图像进行滤镜处理,比如对图像进行锐化、模糊等操作,进一步优化图像质量或者实现特定的视觉效果。scale
、chroma_scale
、lumXform
、chrXform
等函数指针:这些指针指向了实际执行图像转换操作的函数,不同的函数负责不同方面的转换,比如scale
函数主要处理图像的整体缩放,chroma_scale
侧重于色度信息的缩放等,它们依据结构体中设定的各项参数来完成具体的图像转换动作,是实现图像转换功能的核心执行部分。
- 基础属性与上下文关联:
8、AVIOContext
AVIOContext
是FFmpeg库中用于处理输入输出(I/O)操作的一个重要结构体。以下是对其原型及相关信息的详细介绍:
AVDictionary
是FFmpeg库中的一个数据结构,用于存储键值对形式的相关参数或选项信息。以下是关于它的一些详细信息:
功能与用途
- 它提供了一种灵活的方式来传递和存储各种与音视频处理相关的参数,例如编码和解码的选项、滤镜的参数等。
- 在FFmpeg的许多函数和模块中,都可以使用
AVDictionary
来设置和获取特定的配置信息,以便对音视频处理过程进行精细的控制和调整。
数据结构特点
- 键值对形式:由一系列的键(
key
)和对应的值(value
)组成,其中键是字符串类型,用于标识参数的名称,值可以是多种数据类型,如整数、字符串、指针等,具体取决于参数的性质和用途。 - 动态可扩展:可以根据需要动态地添加、删除和修改键值对,方便在不同的处理阶段根据实际情况灵活配置参数。
常用操作函数
- 创建与销毁
av_dict_alloc()
:用于创建一个新的AVDictionary
实例。av_dict_free()
:用于释放一个AVDictionary
实例及其包含的所有键值对所占用的内存资源。
- 添加与设置键值对
av_dict_set()
:用于向AVDictionary
中添加或更新一个键值对。如果键已经存在,则更新对应的值;如果键不存在,则添加新的键值对。av_dict_set_int()
:专门用于添加或更新一个整数值类型的键值对。
- 获取键值对
av_dict_get()
:根据给定的键,从AVDictionary
中获取对应的值。
- 遍历键值对
- 可以通过
av_dict_iterate()
函数来遍历AVDictionary
中的所有键值对,方便对所有参数进行统一的处理或打印输出等操作。
- 可以通过
9、AVRational
结构体定义
typedef struct AVRational{
int num; // 分子
int den; // 分母
} AVRational;
功能与用途
- 表示分数形式的数据:在音视频领域,很多参数需要用分数来精确表示,如帧率、采样率、像素宽高比等。
AVRational
结构体提供了一种方便的方式来存储和操作这些分数值。 - 时间戳的表示:用于表示时间戳之间的相对关系,比如视频帧的显示时间间隔、音频样本的时间间隔等,方便进行时间相关的计算和同步操作。
常用操作函数
- 创建和初始化
- 可以直接通过对
num
和den
成员变量赋值来创建一个AVRational
实例,也可以使用av_make_q()
函数来创建并初始化,例如AVRational rational = av_make_q(3, 4);
表示创建了一个分子为3,分母为4的有理数。
- 可以直接通过对
- 有理数的运算
av_add_q()
:用于对两个AVRational
结构体表示的有理数进行加法运算。av_sub_q()
:用于减法运算。av_mul_q()
:用于乘法运算。av_div_q()
:用于除法运算。av_inv_q()
:用于求一个有理数的倒数。
- 比较操作
av_cmp_q()
:用于比较两个AVRational
结构体的大小关系,返回值小于0表示第一个有理数小于第二个,等于0表示相等,大于0表示大于第二个。
应用场景举例
- 帧率表示:视频的帧率通常用分数形式表示,如常见的24fps可以表示为
AVRational{24, 1}
,NTSC制式的视频帧率约为30000/1001fps,可以表示为AVRational{30000, 1001}
。 - 时间戳计算:在音视频同步过程中,需要根据音频和视频的帧率以及时间戳来进行同步操作。假设视频帧率为
AVRational{24, 1}
,音频采样率为44100Hz,要计算视频帧和音频样本之间的时间对应关系,就会用到AVRational
的相关运算。 - 像素宽高比计算:不同的视频格式可能有不同的像素宽高比,如16:9的宽高比可以表示为
AVRational{16, 9}
,在视频处理过程中,需要根据像素宽高比来进行画面的缩放、裁剪等操作,这时就需要使用AVRational
来准确表示和计算宽高比。
总结
这篇强调FFmpeg在多媒体处理领域的重要性以及理解其核心结构体对于深入运用它的关键意义,旨在接下来对FFmpeg的几个重要结构体展开剖析介绍,为读者揭开它们的神秘面纱,帮助读者更好地掌握FFmpeg相关知识并运用其强大功能。