FFmpeg第二话:FFmpeg 主要结构体剖析

news/2024/12/23 18:47:10 标签: 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_timedurationbit_rate分别表示媒体文件的开始时间、持续时间和比特率;packet_sizeflags等其他成员变量则用于存储与格式相关的其他各种参数和标志。

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_qualitycompression_level用于控制编码的质量和压缩级别,较高的质量或较低的压缩级别通常会导致编码后的数据质量更好,但文件大小也会相应增加,用户可以根据具体需求进行调整。
      • flagsflags2是一些标志位,用于控制编解码过程中的各种行为和特性,如是否使用特定的编码模式、是否启用某些优化选项等,不同的编解码器对这些标志位的定义和使用可能会有所差异。
    • 时间相关
      • time_base是一个AVRational结构体,用于表示时间基,即时间刻度的分数表示,它对于时间的计算和同步非常重要,在编解码过程中,时间戳等时间相关的信息都是基于这个时间基进行计算和处理的。
    • 视频参数相关
      • widthheight分别表示视频的原始宽度和高度,即未经过编码或解码处理前的视频图像的尺寸,它们决定了视频画面的大小。
      • coded_widthcoded_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_H264AV_CODEC_ID_AAC等,通过这个标识符,FFmpeg可以快速准确地找到对应的编解码器进行操作。
      • 功能特性
        • capabilities是一个整数,用于表示编解码器的功能特性,它包含了一系列的位标志,如是否支持编码、解码、硬件加速等功能,通过对这些位标志的判断,FFmpeg可以确定编解码器是否满足特定的操作需求。
        • supported_framerates是一个指向AVRational结构体数组的指针,用于表示编解码器支持的帧率,每个AVRational结构体表示一个帧率的分数形式,如{1, 25}表示25帧每秒,通过这个成员变量,FFmpeg可以了解编解码器能够处理的帧率范围,从而进行相应的帧率设置和转换操作。
      • 格式支持
        • pix_fmts是一个指向AVPixelFormat枚举类型数组的指针,用于表示编解码器支持的像素格式,如AV_PIX_FMT_YUV420PAV_PIX_FMT_RGB24等,不同的编解码器可能支持不同的像素格式,通过这个成员变量,FFmpeg可以在编码或解码过程中选择合适的像素格式进行数据处理。
        • sample_fmts是一个指向AVSampleFormat枚举类型数组的指针,用于表示编解码器支持的音频采样格式,如AV_SAMPLE_FMT_S16AV_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是流在AVFormatContextstreams数组中的索引;codec是一个指向AVCodecContext的指针,用于存储该流的编解码上下文信息,通过它可以获取和设置编解码器的各种参数以及进行编解码操作;codecpar是一个指向AVCodecParameters的指针,它存储了流的编码参数信息,如编码类型、视频的宽高、音频的采样率等,在某些情况下可以直接通过它获取流的编码参数而无需访问codec上下文;start_timedurationnb_frames分别表示流的开始时间、持续时间和帧数;time_base是一个AVRational结构体,用于表示时间基,即时间刻度的分数表示,它对于时间的计算和同步非常重要,不同的流可能有不同的时间基;sample_aspect_ratio_numsample_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的指针,用于管理数据包的内存缓冲区,它可以自动进行内存的引用计数和释放,确保数据的安全和高效处理;ptsdts分别表示显示时间戳和解码时间戳,它们对于视频和音频的同步播放以及正确解码顺序非常重要,pts用于确定何时显示该数据包对应的帧,dts用于确定何时解码该数据包;data是一个指向存储媒体数据的字节数组的指针,实际的压缩媒体数据就存储在这里;size表示data数组中有效数据的长度;stream_index表示该数据包所属的流在AVFormatContextstreams数组中的索引,通过它可以确定该数据包属于哪个视频流、音频流或其他流。

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指针;codeccodecpar分别指向编解码上下文和编解码参数,用于获取与该帧数据相关的编解码信息;data是一个指针数组,用于存储实际的媒体数据,对于视频帧,它可以存储不同颜色平面的数据,如YUV格式的数据;linesize数组表示data中每个平面的一行数据的字节长度,这对于正确处理图像数据非常重要,特别是在进行图像格式转换和缩放等操作时;widthheight表示视频帧的宽度和高度;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一起进一步限定了编解码器的功能和性能范围,通常与视频的分辨率、帧率、比特率等参数相关联,用于确保编解码过程在特定的设备或系统上能够正常运行。
    • 视频相关参数
      • widthheight:分别表示视频帧的宽度和高度,以像素为单位,这是视频显示和处理中非常重要的参数,决定了视频的分辨率和画面大小。
      • sample_aspect_ratio:用于表示视频的样本宽高比,即像素宽高比与显示宽高比之间的关系,它影响着视频在显示时的形状和比例是否正确。
      • fps_numfps_den:分别表示视频的帧率的分子和分母,通过这两个参数可以计算出视频的帧率,帧率决定了视频的流畅度和动态效果。
      • field_order:用于指定视频的场序,即视频图像的扫描顺序,常见的有逐行扫描和隔行扫描等不同的场序方式,对于视频的显示和处理有一定影响。
      • time_base_numtime_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_YUV420PAV_PIXEL_FORMAT_RGB24等,明确了源图像数据的存储格式,决定了后续对源图像数据读取和处理的方式。
      • dstFormat:与之相对应,定义了目标图像的像素格式,即转换后图像应呈现的像素格式,这是转换操作期望达成的目标格式,根据不同的应用场景会设置为不同的格式类型。
      • srcWsrcH:分别代表源图像的宽度和高度,以像素为单位,这两个参数确定了源图像的尺寸大小,是进行图像缩放等转换操作时的重要参考依据,决定了源图像数据的范围。
      • dstWdstH:表示目标图像的宽度和高度,同样以像素为单位,它们规定了转换后图像的尺寸,比如在将高清视频转换为标清视频或者适配不同分辨率显示设备时,会通过设置这两个参数来控制目标图像大小。
    • 转换相关控制参数
      • flags:包含了一系列用于控制图像转换过程的标志位,比如是否进行高质量的缩放、是否使用特定的色彩空间转换算法等,通过不同的标志组合可以灵活调整转换的方式和效果。
      • srcRangedstRange:分别用于指定源图像和目标图像的像素值范围,例如是全范围(0 - 255)还是限幅范围(16 - 235)等,不同的范围设定会影响图像的色彩表现和亮度等特性。
      • param:这是一个数组,存放着与图像转换相关的参数,具体含义会根据不同的转换情况有所变化,比如可能涉及到色彩空间转换系数、缩放比例等参数,辅助控制转换过程的细节。
    • 切片相关参数
      • sliceYsliceH等一系列以“slice”开头的参数,主要用于在图像转换时对图像进行切片处理,将图像划分为多个小块来分别进行转换,有助于提高转换效率,特别是在处理大尺寸图像或者并行处理的场景下会发挥作用。
    • 图像数据指针与步长相关
      • srcStride[4]dstStride[4]:分别表示源图像和目标图像每行数据的字节数(步长),对于不同的像素格式和图像布局,每行数据的字节数可能不同,这些参数便于准确地定位和处理图像数据,确保在进行数据读取和写入时不会出现错误。
      • srcSlice[4]dstSlice[4]:是指向源图像和目标图像切片数据的指针数组,结合前面的切片参数以及步长参数,用于精确地操作图像切片数据,实现对图像不同部分的转换处理。
    • 滤镜相关及转换函数指针
      • srcFilterdstFilter:分别指向源图像和目标图像的滤镜上下文结构体,用于在图像转换前后对图像进行滤镜处理,比如对图像进行锐化、模糊等操作,进一步优化图像质量或者实现特定的视觉效果。
      • scalechroma_scalelumXformchrXform等函数指针:这些指针指向了实际执行图像转换操作的函数,不同的函数负责不同方面的转换,比如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结构体提供了一种方便的方式来存储和操作这些分数值。
  • 时间戳的表示:用于表示时间戳之间的相对关系,比如视频帧的显示时间间隔、音频样本的时间间隔等,方便进行时间相关的计算和同步操作。

常用操作函数

  • 创建和初始化
    • 可以直接通过对numden成员变量赋值来创建一个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相关知识并运用其强大功能。


http://www.niftyadmin.cn/n/5796842.html

相关文章

《庐山派从入门到...》板载按键启动!

《庐山派从入门到...》板载按键启动! 《庐山派从入门到...》板载按键启动! 视频内容大致如下 我们之前了解了GPIO的输出模式使用方法,并且成功点灯,很明显本篇要来分享的自然是GPIO的输入模式 正好回顾一下之前学的python基础包…

扩散模型经典问题:训练Diffusion Models的Loss有什么特别之处?

AIGC算法工程师 面试八股文 Diffusion Loss的推导原理?训练Diffusion Models的Loss有什么特别之处?Diffusion Models的Loss下降趋势是什么样的?为什么训练Diffusion Models的Loss会有这样的特征? 目录 Diffusion Loss的推导原理 一般Diffusion Models训练Loss特征 Loss可…

Vue.js前端框架教程9:Vue插槽slot用法

文章目录 插槽(Slots)无名插槽(默认插槽)具名插槽`reference` 插槽使用 `v-slot` 的缩写语法插槽(Slots) 在 Vue 中,插槽(Slots)是一种组件内容分发的机制,允许你将内容从父组件传递到子组件的模板中。插槽可以有名字,这样你就可以在子组件中定义多个插槽,并且在父…

分布式链路追踪-03-分布式系统跟踪工具,如何设计 span?

开源项目 auto-log 自动日志输出 分布式系统跟踪工具,如何设计 span 在分布式系统跟踪工具中,"Span" 是一个核心概念,它代表着一个跟踪单元或操作的一部分。 Span 是分布式系统中的一个时间跨度,用于表示一个请求或…

Java入门2-idea 第五章:IO流(java.io包中)

一、理解 1. 简单而言&#xff1a;流就是内存与存储设备之间传输数据的通道、管道。 2. 分类&#xff1a; (1) 按方向 ( 以 JVM 虚拟机为参照物 ) 【重点】 输入流&#xff1a;将< 存储设备 > 中的内容读入到 < 内存 > 中。 输出流&#xff1a;将< 内存 …

dify.ai和fastgpt,各有什么优缺点,有什么区别

从专业技术角度来看&#xff0c;Dify.ai 和 FastGPT 的区别可以从 架构设计、技术生态、适用场景和性能优化 四个方面进行深入对比&#xff1a; 1. 架构设计 Dify.ai&#xff1a; 云端优先&#xff1a; 主要基于 SaaS&#xff08;Software as a Service&#xff09;模式&…

VScode 查看linux 内核代码

0&#xff0c;安装c.c 1&#xff0c;查看linux 目录下的linux代码&#xff0c;安装remote ssh 2&#xff0c; 输入服务器IP 3 选择服务器为linux

Linux网络——网络基础

Linux网络——网络基础 文章目录 Linux网络——网络基础一、计算机网络的发展背景1、网络的定义&#xff08;1&#xff09; 独立模式&#xff08;2&#xff09;网络互联 2、局域网 LAN3、广域网 WAN4、比较局域网和广域网5、扩展 —— 域域网和互联网 二、协议1、协议的概念2、…