gpt4 book ai didi

FFmpeg中的常用结构体分析

转载 作者:我是一只小鸟 更新时间:2023-09-08 23:02:32 38 4
gpt4 key购买 nike

一.前言 。

  在学习使用FFmpeg进行编解码时,我们有必要先去熟悉FFmpeg中的常用结构体,只有对它们的含义和用途有深刻的了解,我们才能为后面的学习打下坚实的基础。所以,这篇文章将会介绍这些常用的结构体有哪些,然后再介绍它们的具体用途.

二.常用的结构体分析 。

  1.AVFormatContext

    它用于表示音视频容器的格式特定信息和状态,它可以用来读取和写入各种格式的音视频文件。AVFormatContext结构含有输入或输出格式的信息,例如格式名称、持续时间、比特率、流和元数据,它是与FFmpeg中音视频容器交互的主要接口。在读取多媒体文件时,通常使用avformat_open_input()函数打开文件,该函数会初始化一个AVFormatContext结构并填充所需的文件格式信息;在写入多媒体文件时,可以使用avformat_alloc_output_context2()函数创建一个AVFormatContext结构并填充所需的输出格式信息,然后可以使用avformat_new_stream()函数为AVFormatContext添加音视频流,并为每个流设置必要的编解码器参数。AVFormatContext结构还提供了从输入文件中读入数据包(av_read_frame())和向输出文件写入数据包(av_write_frame())以及其他功能。总的来说,AVFormatContext是FFmpeg中处理音视频容器的关键组件,为读取和写入各种格式的多媒体文件提供了抽象层。由于AVFormatContext结构体比较庞大,下面只列出该结构体中比较重要的成员,代码如下:

                          typedef 
                          
                            struct
                          
                          
                             AVFormatContext{
   
                          
                          
                            const
                          
                          
                            struct
                          
                           AVInputFormat *
                          
                            iformat; //指向输入格式的指针,包含输入文件格式的信息
   
                          
                          
                            const
                          
                          
                            struct
                          
                           AVOutputFormat *
                          
                            oformat; //指向输出格式的指针,包含输出文件格式的信息
   AVIOContext 
                          
                          *
                          
                            pb; //指向输入/输出的AVIOContext结构体的指针
   AVDictionary 
                          
                          *
                          
                            metadata; //指向元数据字典的指针,它包含有关音视频文件的元数据信息,如标题、作者、日期等
   unsigned 
                          
                          
                            int
                          
                          
                             nb_streams; //表示流的数量,它指示在音视频文件中存在多少个流(如音频流、视频流、字幕流等)
   AVStream 
                          
                          **
                          
                            streams;  //指向音频流或视频流的指针
   int64_t duration;   //音视频文件总时长
   int64_t bit_rate;  //码率,也称比特率,单位时间传输的比特数
}AVFormatContext;
                          
                        

  2.AVInputFormat

    它用来描述和处理输入媒体文件的格式信息,它的作用主要有以下几个方面:标识媒体文件的格式、解析和读取媒体文件、提供编解码器相关信息。下面给出该结构体的部分定义,代码如下:

                          typedef 
                          
                            struct
                          
                          
                             AVInputFormat {
    
                          
                          
                            const
                          
                          
                            char
                          
                           *
                          
                            name; //输入格式的名称,缩写
    
                          
                          
                            const
                          
                          
                            char
                          
                           *
                          
                            long_name;  //输入格式的完整名称
    
                          
                          
                            int
                          
                          
                             flags; //输入格式的标志,可用于指定一些特定的格式要求,如是否支持流式传输、是否支持实时解码等。
    
                          
                          
                            const
                          
                          
                            char
                          
                           *
                          
                            extensions; //文件扩展名
    
                          
                          
                            const
                          
                          
                            struct
                          
                           AVCodecTag * 
                          
                            const
                          
                           *
                          
                            codec_tag; //媒体文件容器中所用的编解码器标签。
                          
                          
                                const char *mime_type; //支持该输入格式的MIME类型,用于通过MIME类型识别和匹配输入文件格式
                          
                          
                            int
                          
                          
                             raw_codec_id; //媒体文件容器所用的编解码器ID
                          
                          
                            int
                          
                           (*read_probe)(
                          
                            const
                          
                           AVProbeData *
                          
                            ); //探测函数指针,用于探测输入文件的格式
    
                          
                          
                            int
                          
                           (*read_header)(
                          
                            struct
                          
                           AVFormatContext *
                          
                            );  //读取头部函数指针,用于解析输入文件的头部信息
    
                          
                          
                            int
                          
                           (*read_packet)(
                          
                            struct
                          
                           AVFormatContext *, AVPacket *
                          
                            pkt); //读取数据包函数指针,用于读取输入文件中的数据包
    
                          
                          
                            int
                          
                           (*read_close)(
                          
                            struct
                          
                           AVFormatContext *
                          
                            ); //关闭输入流函数指针,用于在结束读取文件后释放相关资源
                          
                          
                            
} AVInputFormat;
                          
                        

  3.AVOutputFormat

    它用来描述和处理输出媒体文件的格式信息,和AVInputFormat很类似,它的结构体定义如下:

                          typedef 
                          
                            struct
                          
                          
                             AVOutputFormat {
    
                          
                          
                            const
                          
                          
                            char
                          
                           *
                          
                            name;
                          
                          
                            const
                          
                          
                            char
                          
                           *
                          
                            long_name;
    
                          
                          
                            const
                          
                          
                            char
                          
                           *
                          
                            mime_type;
    
                          
                          
                            const
                          
                          
                            char
                          
                           *extensions; 
    
                          
                            enum
                          
                           AVCodecID audio_codec; //音频编码器ID
    
                          
                            enum
                          
                           AVCodecID video_codec;    //视频编码器ID
    
                          
                            enum
                          
                           AVCodecID subtitle_codec;  //字幕编码器ID
    
                          
                            int
                          
                          
                             flags;
                          
                          
                            const
                          
                          
                            struct
                          
                           AVCodecTag * 
                          
                            const
                          
                           *
                          
                            codec_tag;
                          
                          
                            } AVOutputFormat;
                          
                        

  4.AVStream

    它用来描述媒体文件中的每个流,可以是音频流,也可以是视频流。它的结构体定义如下:

                          typedef 
                          
                            struct
                          
                          
                             AVStream {
                          
                          
                            int
                          
                           index; //在AVFormatContext中的流索引
    
                          
                            int
                          
                          
                             id; //流标识符,用来区分音频流和视频流
                          
                          
                            
    AVCodecParameters 
                          
                          *
                          
                            codecpar; //编解码器参数
                          
                          
                            
    AVRational time_base;  //时间基
                          
                          
                            
    int64_t start_time; //起始时间
                          
                          
                            
    int64_t duration;   //时长
    int64_t nb_frames; //包含的帧的数量         
                          
                          
                            
    AVDictionary 
                          
                          *
                          
                            metadata;
                          
                          
                            
    AVRational r_frame_rate;  //帧率
                          
                          
                            
} AVStream;
                          
                        

  5.AVCodecContext

    它用来表示音视频编解码器的上下文信息,包含了各种参数,配置和状态,用于初始化和控制音视频编解码器的行为,该结构体的部分定义如下:

                          typedef 
                          
                            struct
                          
                          
                             AVCodecContext{
    
                          
                          
                            enum
                          
                           AVMediaType codec_type; 
                          
                            //
                          
                          
                            媒体文件类型
                          
                          
                            const
                          
                          
                            struct
                          
                           AVCodec  *codec;  
                          
                            //
                          
                          
                            指向的编解码器
                          
                          
                            enum
                          
                           AVCodecID     codec_id;  
                          
                            //
                          
                          
                            编解码器id
                          
                          
    int64_t bit_rate; 
                          
                            //
                          
                          
                            码率
                          
                          
    AVRational time_base; 
                          
                            //
                          
                          
                            时间基
                          
                          
                            int
                          
                          
                             width, height;
    
                          
                          
                            enum
                          
                           AVPixelFormat pix_fmt; 
                          
                            //
                          
                          
                            像素格式
                          
                          
                            int
                          
                           channels; 
                          
                            //
                          
                          
                            声道数
                          
                          
                            int
                          
                           sample_rate; 
                          
                            //
                          
                          
                            采样率
                          
                          
                            enum
                          
                           AVSampleFormat sample_fmt; 
                          
                            //
                          
                          
                            采样格式
                          
                          
                            int
                          
                           frame_size; 
                          
                            //
                          
                          
                            帧大小
                          
                          
                            void
                          
                           *priv_data; 
                          
                            //
                          
                          
                            指向编解码器私有参数的指针
                          
                          
                            int
                          
                           max_b_frames; 
                          
                            //
                          
                          
                            最大的b帧数量
                          
                          
                            int
                          
                          
                             gop_size; //关键帧间距,即两个I帧之间的帧的数量
}AVCodecContext;
                          
                        

  6.AVCodec

    它用来表示音视频编解码器,定义了编解码器的属性和功能,该结构体的定义如下:

                          typedef 
                          
                            struct
                          
                          
                             AVCodec {
    
                          
                          
                            const
                          
                          
                            char
                          
                           *
                          
                            name; //编解码器的名称,缩写
    
                          
                          
                            const
                          
                          
                            char
                          
                           *
                          
                            long_name;  //编解码器的完整名称
    
                          
                          
                            enum
                          
                          
                             AVMediaType type; //媒体类型
    
                          
                          
                            enum
                          
                          
                             AVCodecID id;  //编解码器ID
    
                          
                          
                            int
                          
                          
                             capabilities;  //编解码器支持的功能和操作
    
                          
                          
                            const
                          
                           AVRational *
                          
                            supported_framerates; //支持的帧率
    
                          
                          
                            const
                          
                          
                            enum
                          
                           AVPixelFormat *
                          
                            pix_fmts;    //支持的像素格式
    
                          
                          
                            const
                          
                          
                            int
                          
                           *
                          
                            supported_samplerates;     //支持的采样率 
    
                          
                          
                            const
                          
                          
                            enum
                          
                           AVSampleFormat *
                          
                            sample_fmts; //支持的采样格式
                          
                          
                            
} AVCodec;
                          
                        

  7.AVFrame

    AVFrame结构体一般用于存储原始数据,即未压缩数据,对视频来说是YUV,RGB,对音频来说是PCM。该结构体的部分定义如下:

                          typedef 
                          
                            struct
                          
                          
                             AVFrame{
    uint8_t 
                          
                          *
                          
                            data[AV_NUM_DATA_POINTERS];  //存储音视频数据的缓冲区指针数组。不同的元素对应不同的数据平面,例如视频的Y、U、V分量或音频的声道数据
    
                          
                          
                            int
                          
                          
                             linesize[AV_NUM_DATA_POINTERS]; //每个数据平面的行大小(以字节为单位)
    
                          
                          
                            int
                          
                          
                             width, height;  //视频帧的宽度和高度
    
                          
                          
                            int
                          
                          
                             nb_samples;  //采样点个数
    
                          
                          
                            int
                          
                          
                             format; //对于音频来说指的是音频采样格式,对于视频来说指的是像素格式
    int64_t pts;  //显示时间戳
    AVRational time_base; //时间基
    
                          
                          
                            int
                          
                          
                             sample_rate; //采样率
    
                          
                          
                            int
                          
                          
                             channels;  //声道数
    int64_t duration; //时长
}AVFrame;
                          
                        

  8.AVPacket

    它用来存储编码后的视频帧数据,AVPacket保存了解复用之后,解码前的数据(仍然是压缩后的数据)和关于这些数据的一些附加信息,如显示时间戳,解码时间戳,数据时长和所在媒体流的索引等;该结构体的定义如下:

                          typedef 
                          
                            struct
                          
                          
                             AVPacket {
    AVBufferRef 
                          
                          *
                          
                            buf;//用来管理data指针引用的数据缓存
    int64_t pts;//显示时间戳
    int64_t dts;//解码时间戳
    uint8_t 
                          
                          *
                          
                            data;//指向保存压缩数据的指针,这就是AVPacket实际的数据
    
                          
                          
                            int
                          
                          
                               size;//压缩数据的大小
    
                          
                          
                            int
                          
                          
                               stream_index;//所属的流的索引
                          
                          
                            
    AVPacketSideData 
                          
                          *
                          
                            side_data;//填充容器的一些附件数据
                          
                          
                            
    int64_t duration;//时长
                          
                          
                            
    AVRational time_base;//时间基
} AVPacket;
                          
                        

  9.AVIOContext

    它用来管理输入输出操作,AVIOContext提供了读取和写入数据的接口。AVFormatContext结构体中的pb指针就是AVIOContext类型的,当打开媒体文件时, AVFormatContext 会创建和设置一个 AVIOContext ,并将其分配给 pb 指针,以便后续的读取操作可以使用该 AVIOContext 进行数据的读取,如果想要实现自定义的I/O操作,可以创建自己的 AVIOContext ,并将其分配给 pb 指针,从而使 AVFormatContext 使用自定义的I/O函数来读取或写入数据。该结构体的定义如下:

                          typedef 
                          
                            struct
                          
                          
                             AVIOContext {
    unsigned 
                          
                          
                            char
                          
                           *
                          
                            buffer;  //指向缓冲区的指针
    
                          
                          
                            int
                          
                          
                             buffer_size;       //缓冲区的大小
    unsigned 
                          
                          
                            char
                          
                           *
                          
                            buf_ptr; //当前的读取或写入位置
    unsigned 
                          
                          
                            char
                          
                           *
                          
                            buf_end; //缓冲区有效数据的末尾位置
    
                          
                          
                            void
                          
                           *
                          
                            opaque; //指向用户自定义数据的指针        
    
                          
                          
                            int
                          
                           (*read_packet)(
                          
                            void
                          
                           *opaque, uint8_t *buf, 
                          
                            int
                          
                          
                             buf_size); //读取数据的回调函数指针
    
                          
                          
                            int
                          
                           (*write_packet)(
                          
                            void
                          
                           *opaque, uint8_t *buf, 
                          
                            int
                          
                          
                             buf_size); //写入数据的回调函数指针
    int64_t (
                          
                          *seek)(
                          
                            void
                          
                           *opaque, int64_t offset, 
                          
                            int
                          
                          
                             whence); //定位到指定位置的回调函数指针
                          
                          
                            
} AVIOContext;
                          
                        

  。

  。

  。

  。

最后此篇关于FFmpeg中的常用结构体分析的文章就讲到这里了,如果你想了解更多关于FFmpeg中的常用结构体分析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com