- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
一.前言 。
在学习使用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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
本文主要给大家介绍Mysql数据库分库和分表方式(常用),涉及到mysql数据库相关知识,对mysql数据库分库分表相关知识感兴趣的朋友一起学习吧 1 分库 1.1 按照功能分库 按照功能进行
在当前对象由其他包含对象操作的系统中,当传递对当前对象的引用时,链接似乎一直在继续......没有任何结束(对于下面的代码,Car ->myCurrentComponent->myCar_Brake-
我有一个密码 UIAlertView,我们要求用户提供。我需要根据情况在不同的 View 上询问它,从 downloadViewController (用户下载数据后),当他们切换到他们的数据时(如果
我正在尝试编写一个函数,使得对于任何整数 x 的 P(x) 都有一个包含三个元素的列表,即平方、立方和 n 的四次方,但我仍然不知道如何组合然后制作一个函数,例如我有平方、立方体和 4 次幂函数下面是
关闭。这个问题需要更多 focused .它目前不接受答案。 关闭4年前。 锁定。这个问题及其答案是locked因为这个问题是题外话,但具有历史意义。它目前不接受新的答案或交互。 我能否列出一份常见的
Python 常用 PEP8 编码规范 代码布局 缩进 每级缩进用4个空格。 括号中使用垂直隐式缩进或使用悬挂缩进。 EXAMPLE: ?
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 去年关闭。 Improve this questio
在经典 ui 中,您可以使用 xtype:cqinclude 包含来自不同路径的 rtePlugins,基本上为标准 RTE 插件创建一个位置,我如何在 Touch UI 中执行相同操作? 我尝试使用
在经典 ui 中,您可以使用 xtype:cqinclude 包含来自不同路径的 rtePlugins,基本上为标准 RTE 插件创建一个位置,我如何在 Touch UI 中执行相同操作? 我尝试使用
*strong text*我有多个网络应用程序使用了一些常见的依赖项,比如蒙戈连接器谷歌 Guava 乔达时间 我想到将它们从 webapp/WEB-INF/lib 中取出并放入一些 common-l
我正在编写一个 Web 服务器,我想知道哪些 HTTP 请求 header (由客户端发送)是最常见的,因此我应该重点实现。 目前,我只支持Accept 和Host。 最佳答案 不确定您的范围,但由于
我是一名优秀的程序员,十分优秀!