一.前言

  在学习使用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. C# decimal double 获取一组数字 小数点后最多有几位

    有一组数字,想判断一组数字中最多的有几位小数,乘以10的指定幂,转为整数,此处教大家一个高级的写法,拒接无脑for循环 decimal: decimal[] numbers = new decimal ...

  2. 聊一聊 Python 安装中的 --enable-shared

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 今天在 CentOS 7.4 使用源码编译安装 Python-2.7.15 的时候,发现了一个 ...

  3. 资源高效搜索方法,你 Get 到了吗?

      随手转发给好友和朋友圈  编辑:办公小通 百度搜索谁都会,但是搜出来的资料往往良莠不齐.搜索速度是快了,但是还要花大量的时间去筛选. 通过下面的两个最常用的栗子,小通强烈推荐大家用高级搜索. 高级 ...

  4. ORM总览

    ORM(Object-Relational Mapping)是一种常见的数据访问技术,它将对象模型和关系模型之间进行映射.ORM的主要作用是简化数据访问和管理,提高开发效率和代码质量.在实际应用中,O ...

  5. Supervisor启动并管理Celery相关进程

    Supervisor启动并管理Celery相关进程 关于celery在运行过程中, 默认情况下是无法在关机以后自动重启的.所以我们一般开发中会使用supervisor进程监控来对celery程序进行运 ...

  6. Nginx SSL 双向认证

    安装Nginx和OpenSSL yum install nginx openssl -y SSL 服务器 / 客户端双向验证证书的生成 创建一个新的 CA 根证书,在 nginx 安装目录下新建 ca ...

  7. ABP - 本地事件总线

    1. 事件总线 在我们的一个应用中,经常会出现一个逻辑执行之后要跟随执行另一个逻辑的情况,例如一个用户创建了后续还需要发送邮件进行通知,或者需要初始化相应的权限等.面对这样的情况,我们当然可以顺序进行 ...

  8. 论文日记一:AlexNet

    1.导读 ALexNet在2012图像识别竞赛中ILSVRC大放异彩,直接将错误了降低了近10个百分点. 论文<ImageNet Classification with Deep Convolu ...

  9. Go 并发模型—Goroutines

    前言 Goroutines 是 Go 语言主要的并发原语.它看起来非常像线程,但是相比于线程它的创建和管理成本很低.Go 在运行时将 goroutine 有效地调度到真实的线程上,以避免浪费资源,因此 ...

  10. 暗黑2能用Java开发?还能生成APP?

    最近烧哥发现个宝藏项目,竟然用Java开发了暗黑2出来. 众所周知,暗黑2是暴雪开发的一款经典游戏,距今虽有20多年,仍然有很多粉丝. 粉丝延续热情的方式有很多,一种是做Mod,比如魔电,对怪物.技能 ...