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_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.rhkb.cn/news/494167.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

以太网帧、IP数据报图解

注:本文为 “以太网帧、IP数据报”图解相关文章合辑。 未整理去重。 以太网帧、IP数据报的图解格式(包含相关例题讲解) Rebecca.Yan已于 2023-05-27 14:13:19 修改 一、基础知识 UDP 段、IP 数据包,以太网帧图示 通信过程中&…

Java程序打包成exe,无Java环境也能运行

Java程序开发完成后,通常情况下以jar包的形式发布。但有时我们需要给非软件开发人员使用程序,如制作好窗体应用,把它发给没有java开发环境的人使用,此时就需要制作exe安装包。本文介绍如何将java程序制作成exe安装包,并…

华为IPD流程6大阶段370个流程活动详解_第一阶段:概念阶段 — 81个活动

华为IPD流程涵盖了产品从概念到上市的完整过程,各阶段活动明确且相互衔接。在概念启动阶段,产品经理和项目经理分析可行性,PAC评审后成立PDT。概念阶段则包括产品描述、市场定位、投资期望等内容的确定,同时组建PDT核心组并准备项目环境。团队培训涵盖团队建设、流程、业务…

Linux中Mysql5.7主从架构(一主多从)配置教程

🏡作者主页:点击! 🐧Linux基础知识(初学):点击! 🐧Linux高级管理防护和群集专栏:点击! 🔐Linux中firewalld防火墙:点击! ⏰️创作…

Pytorch | 利用PI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用PI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集PI-FGSM介绍背景和动机算法原理算法流程 PI-FGSM代码实现PI-FGSM算法实现攻击效果 代码汇总pifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器: Pytorch | 从零构建AlexN…

Hadoop yarn安装

目录 一、环境准备 1、准备三台服务器 2、给三台主机分别配置主机名 3、给三台服务器配置域名,三台配置一样的 4、关闭防火墙 5、创建用户和用户组,三台配置一样的 6、创建安装目录 7、设置免密登录,三台机器都要执行下面的步骤 8、三…

人脸生成3d模型 Era3D

从单视图图像进行3D重建是计算机视觉和图形学中的一项基本任务,因为它在游戏设计、虚拟现实和机器人技术中具有潜在的应用价值。早期的研究主要依赖于直接在体素上进行3D回归,这往往会导致过于平滑的结果,并且由于3D训练数据的限制&#xff0…

MFC用List Control 和Picture控件实现界面切换效果

添加List Control 和Picture控件 添加 3个子窗体 把子窗体边框设置为None, 样式设为Child 声明 CListCtrl m_listPageForm;void ShowForm(int nIndex);void CreatFormList();void CMFCApplication3Dlg::DoDataExchange(CDataExchange* pDX) {CDialogEx::DoDataExchange(pDX);DD…

机器学习基础算法 (一)-线性回归

python 环境的配置参考 从零开始:Python 环境搭建与工具配置 线性回归的 Python 实现 线性回归是一种经典的机器学习算法,用于预测连续的目标变量。它假设目标变量和特征之间存在线性关系。本文将详细介绍线性回归的原理、Python 实现、模型评估和调优&…

图解HTTP-HTTP报文

参考资料:图解HTTP HTTP报文 用于HTTP协议交互的信息被称为HTTP报文。请求端的HTTP请求报文,响应端(服务器端)的叫做响应报文。HTTP报文本身是由多行(CR LF作为换行符)数据行构成的文本。 请求报文及响…

WPF Binding 绑定

绑定是 wpf 开发中的精髓,有绑定才有所谓的数据驱动。 1 . 背景 目前 wpf 界面可视化的控件,继承关系如下, 控件的数据绑定,基本上都要借助于 FrameworkElement 的 DataContext 属性。 只有先设置了控件的 DataContext 属性&…

Day-03 Vue(生命周期、生命周期钩子八个函数、工程化开发和脚手架、组件化开发、根组件、局部注册和全局注册的步骤)

01.生命周期 Vue生命周期:就是一个Vue实例从创建 到 销毁 的整个过程 生命周期四个阶段:① 创建 ② 挂载 ③ 更新 ④ 销毁 1.创建阶段:创建响应式数据 2.挂载阶段:渲染模板 3.更新阶段:修改数据,更新视图 4…

AI芯片常见概念

文章目录 AI芯片常见概念前言常见概念AI芯片分类按照芯片的技术架构分GPU半定制化的 FPGA全定制化 ASIC神经拟态芯片 按应用场景分训练卡推理卡 按部署位置分国产AI卡资料汇总 AI芯片算力和能效比AI芯片算力AI芯片能效比 封装相关Chiplet技术3DIC三星多芯片集成联盟&#xff08…

边缘智能网关助力打造建筑智慧消防物联网

随着经济社会的快速发展,为了满足民众生产、生活、消费需求,高层建筑、大型综合连体建筑持续兴建,各类火灾风险和事故也越发增加。得益于物联网的普及应用,消防监测和管理迎来数字化、智慧化转型升级。 针对各类高层、大型建筑消防…

深度学习实战车辆目标跟踪【bytetrack/deepsort】

本文采用YOLOv8作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv8以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对车辆目标数据集进行训练和优化,该数据集包含丰富的车辆目标图像样本…

电脑开机提示error loading operating system怎么修复?

前一天电脑还能正常运行,但今天启动时却显示“Error loading operating system”(加载操作系统错误)。我已经仔细检查了硬盘、接线、内存、CPU和电源,确认这些硬件都没有问题。硬盘在其他电脑上可以正常使用,说明不是硬…

财会〔2024〕22号发布,全面提高管理会计数字化、智能化水平,泛微·齐业成来助力

自《财政部关于全面推进管理会计体系建设的指导意见》(财会〔2014〕27号)发布以来,我国管理会计体系建设取得明显成效。时隔十载,2024年12月16日财政部发布《关于全面深化管理会计应用的指导意见》财会〔2024〕22 号(以…

数字经济下的 AR 眼镜

目录 1. 📂 AR 眼镜发展历史 1.1 AR 眼镜相关概念 1.2 市面主流 XR 眼镜 1.3 AR 眼镜大事记 1.4 国内外 XR 眼镜 1.5 国内 AR 眼镜四小龙 2. 🔱 关键技术 2.1 AR 眼镜近眼显示原理 2.2 AR 眼镜关键技术 2.3 AR 眼镜技术难点 3. &#x1f4a…

浅析InnoDB引擎架构(已完结)

大家好,我是此林。 今天来介绍下InnoDB底层架构。 1. 磁盘架构 我们所有的数据库文件都保存在 /var/lib/mysql目录下。 由于我这边是docker部署的mysql,用如下命令查看mysql数据挂载。 docker inspect mysql-master 如下图,目前只有一个数…

k8s迁移——岁月云实战笔记

新系统使用rockylinux9.5,旧系统虚拟机装的是centos7 1 目标服务器 1.1 禁止swap swapoff -a vi /etc/fstab #/dev/mapper/rl-swap none swap defaults 0 0 #执行,swap一行都是0 free -h 1.2 关闭防火墙 只是为了减…