一.前言

  在学习使用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;

    

    

    

FFmpeg中的常用结构体分析的更多相关文章

  1. FFmpeg中几个结构体的意义

    AVCodec是存储编解码器信息的结构体,特指一个特定的解码器,比如H264编码器的名字,ID,支持的视频格式,支持的采样率等: AVCodecContext是一个描述编解码器采用的具体参数,比如采用 ...

  2. Objective-C基础笔记(7)Foundation中的常用结构体

    一.NSRange NSRange的定义: typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange; N ...

  3. FFMPEG结构体分析:AVPacket

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  4. FFMPEG结构体分析:AVStream

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  5. FFMPEG结构体分析:AVCodec

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  6. FFMPEG结构体分析:AVIOContext

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  7. FFMPEG结构体分析:AVCodecContext

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  8. FFMPEG结构体分析:AVFormatContext

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrameFFMPEG结构体分析:AVFormatContextFFMPEG结构体分析:AVCodecContext ...

  9. FFMPEG结构体分析:AVFrame

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrameFFMPEG结构体分析:AVFormatContextFFMPEG结构体分析:AVCodecContext ...

  10. FFmpeg: AVPacket 结构体分析

    AVPacket是FFmpeg中很重要的一个数据结构,它保存了解封装之后,解码之前的数据(注意:仍然是压缩后的数据)和关于这些数据的一些附加信息,如显示时间戳(pts).解码时间戳(dts).数据时长 ...

随机推荐

  1. Pandas 加载数据的方法和技巧

    哈喽大家好,我是咸鱼 相信小伙伴们在学习 python 数据分析的过程中或多或少都会听说或者使用过 pandas pandas 是 python 的一个拓展库,常用于数据分析 今天咸鱼将介绍几个关于 ...

  2. Python 列表、字典、元组的一些小技巧

    1. 字典排序 我们知道 Python 的内置 dictionary 数据类型是无序的,通过 key 来获取对应的 value.可是有时我们需要对 dictionary 中的 item 进行排序输出, ...

  3. 用R来分析洛杉矶犯罪

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 洛杉矶市(Los Angeles)或"爵士乐的诞生地(The Birthplace ...

  4. Android APK 文件结构

    序言 APK(全称:Android application package,Android应用程序包)是Android操作系统使用的一种应用程序包文件格式,用于分发和安装移动应用及中间件. APK 文 ...

  5. AI 协助办公 |记一次用 GPT-4 写一个消息同步 App

    GPT-4 最近风头正劲,作为 NebulaGraph 的研发人员的我自然是跟进新技术步伐.恰好,现在有一个将 Slack channel 消息同步到其他 IM 的需求,看看 GPT-4 能不能帮我完 ...

  6. Anaconda3安装(Win_x64)

    一.获取Anaconda3 链接:https://pan.baidu.com/s/14Imqk1KBsB84Mwzebpv2BA?pwd=no2x 提取码:no2x --来自百度网盘超级会员V4的分享 ...

  7. 龙芯下如何进行.net core程序开发部署

    龙芯LoongArch64已经发布了对.NETCore的支持,相关工具链也已完成,目前支持.NETCore3.1..NET6..NET7版本.本文以.NETCore3.1在loongnix-serve ...

  8. 阿里云ASK试用心得(避坑贴)

    前言 常年BP阿里云的各种服务,今天却被阿里云给上了一课,这一套组合拳把我安排的明明白白,血亏50大洋,算是提前为各位大佬排坑了,预祝大家中秋快乐 目的 最近阿里云首页放出了免费试用的活动,本着不用白 ...

  9. AWSBackup:备份您的云计算资源及数据

    目录 <AWS Backup:备份您的云计算资源及数据> 背景介绍 随着云计算技术的不断普及,越来越多的企业开始将云计算资源视为其关键业务数据的潜在来源.同时,随着数据价值的不断增加,备份 ...

  10. 如何在.net6webapi中记录每次接口请求的日志

    为什么在软件设计中一定要有日志系统? 在软件设计中日志模块是必不可少的一部分,可以帮助开发人员更好的了解程序的运行情况,提高软件的可靠性,安全性和性能,日志通常能帮我们解决如下问题: 调试和故障排查: ...