首页 > 其他分享 >FFmpeg中的常用结构体分析

FFmpeg中的常用结构体分析

时间:2023-09-08 16:25:42浏览次数:36  
标签:分析 常用 const FFmpeg AVFormatContext int 编解码器 格式 struct

一.前言

  在学习使用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; //媒体文件容器所用的编解码器IDint (*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;

 

    

 

 

 

    

    

标签:分析,常用,const,FFmpeg,AVFormatContext,int,编解码器,格式,struct
From: https://www.cnblogs.com/luqman/p/ffmpeg_start.html

相关文章

  • 以视频监控平台 EasyCVR为例分析视频汇聚平台在汛期防洪场景中能起到什么样的作用
    华夏千载悠悠,江河淮济东流,曾兹润泽九州,却患祸无止不休。水可以是人类文明的起源,但同样也可以轻而易举的让人们流离失所。每逢夏季,我国各省市也进入汛期,夏季雨水较多,暴雨等极端天气时有发生,因此抗洪防汛任务艰巨。在汛期加大对河道、湖泊、坝区、水库等重点关注区域的密切监控与管理......
  • 国标EHOME视频平台EasyCVR更新后首页无法打开原因分析
    EasyCVR是一款安防视频监控平台,具有强大的可拓展性、灵活的视频能力和轻快的部署特性。它支持多种主流标准协议,包括国标GB28181、RTSP/Onvif、RTMP等,并能够接入各个厂家的私有协议与SDK,例如海康Ehome、海大宇等设备的SDK。该平台不仅具备传统安防视频监控的功能,如视频监控直播、云......
  • 智能视频与分析技术构建可视化消防风险预警视频监控平台EasyCVR
    TSINGSEE青犀视频提出了智慧消防解决方案,以多维感知、数据共享和业务联动为理念,旨在改善消防安全管理。通过整合消防与安防资源,利用视频监控和智能分析技术实时监测火灾风险,并提供火灾报警和现场视频资料供消防人员快速响应和处置。该方案还支持数据可视化,以直观方式展示火灾风险状......
  • Lnton羚通视频分析算法开发平台关工服穿戴检测联动门禁开关算法的介绍
    Lnton羚通的算法算力云平台以其突出的特点成为一款优秀的解决方案。它的高性能、高可靠性、高可扩展性和低成本使得用户能够高效地进行复杂的计算任务。同时,丰富的算法库和工具以及支持用户上传和部署自定义算法的功能进一步提升了平台的灵活性和个性化能力。工服穿戴检测联动门禁......
  • 监控汇聚平台EasyCVR可智能分析抽烟/打电话行为
    随着人工智能技术的不断发展,其已经广泛应用于视频监控领域。我们最近推出的基于AI智能视频云存储/安防监控视频AI智能分析平台,具备多项新功能。该平台内置了多种AI算法,可以实时对视频中的人脸、人体、物体等进行检测、跟踪和抓拍。这个平台支持口罩佩戴检测,可以识别出口罩是否被佩......
  • 安防视频监控平台EasyCVR平台+AI智能分析助力构建智慧城市
    EasyCVR平台的智能分析功能在构建智慧城市方面发挥了重要作用。安防行业已经参与智慧城市建设十多年,经历了摸索和探索的阶段。从数字城市到平安城市再到现在的智慧城市,绿色、智能、安全成为智慧城市建设的主题,并在中国迅速发展。EasyCVR通过TSINGSEE青犀视频打造的安防视频云服务,支......
  • A3C与GA3C的收敛性分析
    G-A3C的代码:https://gitee.com/devilmaycry812839668/gpu_a3c  论文:《ReinforcementLearningthorughAsynchronousAdvantageActor-CriticonaGPU》 论文地址:https://openreview.net/forum?id=r1VGvBcxl  =================================================......
  • 非时序回溯与时序回溯代码分析2(2023-9-7)
    采用CB+NCB的方式后传播序列trail各层中的文字层序属性发生了变化,原有层数的递增、同层文字属于单一层序发生了变化。 [1]AlexanderNadel,VadimRyvchin:ChronologicalBacktracking.SAT2018:111-121 Inparticular,thedecisionlevel ofthevariablesintheass......
  • 国标GB28181协议视频智能分析平台EasyGBS,其无法播放的常见原因及排查汇总
    关于EasyGBS服务稳定性的问题,TSINGSEE青犀视频平台一直备受咨询者关注。然而,服务稳定性与用户接入方式和配置密切相关。如果您对此有更详细的了解需求,我们建议您联系我们以获取测试版本进行自行测试。有时候用户会反映EasyGBS无法播放的问题,但是"不能播放"是一个广泛的概念,有很多可......
  • docker常用功能小记
    1、查看docker容器、镜像的元数据dockerinspect容器ID/镜像IDdockerinspectimages示例如下:应用:查看容器关于目录挂载的信息:dockerinspectxxxx|grepMounts-A50查看挂载数据Mounts后50行的数据,如下:2、查看容器运行的日志实时查看日志dockerlogs-fcontainer......