一、AVFrame
AVFrame是引用计数的原始多媒体数据的抽象。
一)、模块
描述其他帧属性的标志。
#define | AV_FRAME_FLAG_CORRUPT (1 << 0) |
由于解码错误。
#define | AV_FRAME_FLAG_DISCARD (1 << 2) |
二)、数据结构
AVFrameSideData
结构以保存AVFrame的边数据。
sizeof(AVFrameSideData)不是公共ABI的一部分,所以新的字段可能会添加到最后一个小的凹凸。
struct | AVFrameSideData{ enum AVFrameSideDataType type; uint8_t * data; int size; AVDictionary * metadata; AVBufferRef * buf; } |
AVFrame
该结构描述了解码(原始)音频或视频数据。
AVFrame必须使用av_frame_alloc()分配。 请注意,这只会分配AVFrame本身,数据的缓冲区必须通过其他方式进行管理(见下文)。 AVFrame必须与av_frame_free()一起释放。
AVFrame通常被分配一次,然后重复使用多次以保存不同的数据(例如,单个AVFrame来保存从解码器接收的帧)。 在这种情况下,av_frame_unref()将释放框架中的任何引用,并将其重新设置为原始的清洁状态,然后再次重新使用。
AVFrame描述的数据通常通过AVBuffer API进行引用。 基础缓冲区引用存储在AVFrame.buf / AVFrame.extended_buf中。 如果设置了至少一个引用,则AVFrame被认为是引用计数,即如果AVFrame.buf [0]!= NULL。 在这种情况下,每个单个数据平面必须包含在AVFrame.buf或AVFrame.extended_buf中的缓冲区之一中。 所有数据可能有一个缓冲区,或者每个平面有一个单独的缓冲区,或两者之间的任何内容。
sizeof(AVFrame)不是公共ABI的一部分,所以新的字段可能会被添加到最后一个小的碰撞。
可以通过AVOptions访问字段,使用的名称字符串与通过AVOptions可访问的字段的C结构字段名称相匹配。 用于AVFrame的AVClass可以从avcodec_get_frame_class()获取,
struct | AVFrame{ uint8_t * data [AV_NUM_DATA_POINTERS]; // 指向图片/频道平面的指针。 int linesize [AV_NUM_DATA_POINTERS] // 对于视频,每个图片行的字节大小。 uint8_t ** extended_data; //指向数据平面/通道的指针。 int nb_samples; // 此框描述的音频样本数(每个通道) int format; // 帧的格式,-1如果未知或未设置值对应于视频帧的枚举AVPixelFormat,枚举AVSampleFormat为音频) int key_frame; // 1 - >关键帧,0->非关键帧 enum AVPictureType pict_type;//帧的图片类型。 AVRational sample_aspect_ratio; //视频帧的采样宽高比,如果未知/未指定,则为0/1。 int64_t pts; // 以time_base为单位表示时间戳(应向用户显示帧的时间)。 attribute_deprecated int64_t pkt_pts; //从AVPacket复制的PTS被解码以产生此帧。 int64_t pkt_dts; // 从AVPacket复制的DTS触发返回此帧。 int coded_picture_number; //图片编号以比特比顺序 int display_picture_number; // 图片编号显示顺序 int quality; // 质量(1(好)和FF_LAMBDA_MAX(差)) void * opaque; //为用户的一些私人数据 attribute_deprecated uint64_t error [AV_NUM_DATA_POINTERS]; int repeat_pict; // 当解码时,这表示图片必须延迟多少。 int interlaced_frame; // 图片的内容是交错的。 int top_field_first; // 如果内容是隔行扫描,则首先显示顶部字段。 int palette_has_changed; //告诉用户应用程序调色板已从前一帧更改。 int64_t reordered_opaque; //重新排序的不透明64位(通常是整数或双精度浮点PTS,但可以是任何东西)。 int sample_rate; //音频数据的采样率。 uint64_t channel_layout; // 音频数据的通道布局。 AVBufferRef * buf [AV_NUM_DATA_POINTERS]; // AVBuffer引用支持此框架的数据。 AVBufferRef ** extended_buf; // 对于需要超过AV_NUM_DATA_POINTERS AVBufferRef指针的平面音频,此数组将保存所有不能适合AVFrame.buf的引用。 int nb_extended_buf; // extended_buf中的元素数。 AVFrameSideData ** side_data; int nb_side_data; int flags; //帧标志,AV_FRAME_FLAGS的组合。 enum AVColorRange color_range;// MPEG与JPEG YUV范围。 enum AVColorPrimaries color_primaries; enum AVColorTransferCharacteristic color_trc; enum AVColorSpace colorspace;//YUV颜色空间类型。 enum AVChromaLocation chroma_location; int64_t best_effort_timestamp; // 帧时间戳使用各种启发式估计,在流时基 int64_t pkt_pos; // 从已经输入到解码器的最后一个AVPacket重新排序pos int64_t pkt_duration; // 相应分组的持续时间,以AVStream-> time_base单位表示,如果未知,则为0。 AVDictionary * metadata;//元数据 int decode_error_flags; //解码帧的错误标志,如果解码器产生帧,则将其设置为FF_DECODE_ERROR_xxx标志的组合,但在解码期间存在错误。 int channels; // 音频通道数,仅用于音频。 int pkt_size; //包含压缩帧的相应分组的大小。 attribute_deprecated int8_t * qscale_table;// QP表。 attribute_deprecated int qstride;// QP店步伐。 attribute_deprecated int qscale_type; AVBufferRef * qp_table_buf; AVBufferRef * hw_frames_ctx; //对于hwaccel格式的帧,这应该是对描述帧的AVHWFramesContext的引用。 AVBufferRef * opaque_ref; // AVBufferRef由API用户免费使用。 } |
视频帧。
视频帧的编码维度(以像素为单位),即包含一些明确定义值的矩形的大小。
注意:用于显示/呈现的框架部分进一步受到“裁剪”矩形的限制。
int width
int height
裁剪
视频帧。 从帧的顶部/底部/左/右边界丢弃的像素数,以获得用于呈现的帧的子矩形。
size_t crop_top
size_t crop_bottom
size_t crop_left
size_t crop_right
三)、枚举
enum | AVActiveFormatDescription { AV_AFD_SAME = 8, AV_AFD_4_3 = 9, AV_AFD_16_9 = 10, AV_AFD_14_9 = 11, AV_AFD_4_3_SP_14_9 = 13, AV_AFD_16_9_SP_14_9 = 14, AV_AFD_SP_4_3 = 15 } |
四)、函数
int64_t | av_frame_get_best_effort_timestamp (const AVFrame *frame) |
void | av_frame_set_best_effort_timestamp (AVFrame *frame, int64_t val) |
int64_t | av_frame_get_pkt_duration (const AVFrame *frame) |
void | av_frame_set_pkt_duration (AVFrame *frame, int64_t val) |
int64_t | av_frame_get_pkt_pos (const AVFrame *frame) |
void | av_frame_set_pkt_pos (AVFrame *frame, int64_t val) |
int64_t | av_frame_get_channel_layout (const AVFrame *frame) |
void | av_frame_set_channel_layout (AVFrame *frame, int64_t val) |
int | av_frame_get_channels (const AVFrame *frame) |
void | av_frame_set_channels (AVFrame *frame, int val) |
int | av_frame_get_sample_rate (const AVFrame *frame) |
void | av_frame_set_sample_rate (AVFrame *frame, int val) |
AVDictionary * | av_frame_get_metadata (const AVFrame *frame) |
void | av_frame_set_metadata (AVFrame *frame, AVDictionary *val) |
int | av_frame_get_decode_error_flags (const AVFrame *frame) |
void | av_frame_set_decode_error_flags (AVFrame *frame, int val) |
int | av_frame_get_pkt_size (const AVFrame *frame) |
void | av_frame_set_pkt_size (AVFrame *frame, int val) |
AVDictionary ** | avpriv_frame_get_metadatap (AVFrame *frame) |
int8_t * | av_frame_get_qp_table (AVFrame *f, int *stride, int *type) |
int | av_frame_set_qp_table (AVFrame *f, AVBufferRef *buf, int stride, int type) |
enum AVColorSpace | av_frame_get_colorspace (const AVFrame *frame) |
void | av_frame_set_colorspace (AVFrame *frame, enum AVColorSpace val) |
enum AVColorRange | av_frame_get_color_range (const AVFrame *frame) |
void | av_frame_set_color_range (AVFrame *frame, enum AVColorRange val) |
const char * | av_get_colorspace_name (enum AVColorSpace val) |
返回:标识颜色空间的静态字符串; 可以为NULL。
AVFrame * | av_frame_alloc (void) |
结果必须使用av_frame_free()被释放。
返回:AVFrame充满默认值或失败时为NULL。
注意:这只分配AVFrame本身,而不是数据缓冲区。 那些必须通过其他方式分配,例如 使用av_frame_get_buffer()或手动。
void | av_frame_free (AVFrame **frame) |
extended_data。 如果框架被引用计数,则首先将其未引用。
参数:frame:框架被释放。 指针将设置为NULL。
int | av_frame_ref (AVFrame *dst, const AVFrame *src) |
将框架属性从src复制到dst,并从src为每个AVBufferRef创建一个新的引用。
如果src未引用计数,则会分配新的缓冲区并复制数据。
警告:在调用此函数之前,dst必须已经被av_frame_unref(dst)未被引用或新分配了av_frame_alloc(),否则将会发生未定义的行为。
返回:0成功,否定AVERROR出错
AVFrame * | av_frame_clone (const AVFrame *src) |
这是av_frame_alloc()+ av_frame_ref()的快捷方式。
返回:新创建的AVFrame成功,NULL出错。
void | av_frame_unref (AVFrame *frame) |
void | av_frame_move_ref (AVFrame *dst, AVFrame *src) |
警告:dst不是未引用的,而是直接覆盖而不读取或取消分配其内容。 在调用此函数之前,请手动调用av_frame_unref(dst),以确保没有内存泄漏。
int | av_frame_get_buffer (AVFrame *frame, int align) |
在调用此函数之前,必须在框架上设置以下字段:
1、格式(视频的像素格式,音频采样格式)
2、视频的宽度和高度
3、音频的nb_samples和channel_layout
此函数将填充AVFrame.data和AVFrame.buf数组,并在必要时分配并填充AVFrame.extended_data和AVFrame.extended_buf。 对于平面格式,将为每个平面分配一个缓冲区。
警告:如果帧已经被分配,调用此函数将泄漏内存。 此外,在某些情况下可能会发生未定义的行为。
参数:frame:在其中存储新缓冲区的帧。
align:所需缓冲区大小对齐
返回:0成功,否定AVERROR出错。
int | av_frame_is_writable (AVFrame *frame) |
返回:如果帧数据是可写的,则为正值(如果且仅当每个底层缓冲区只有一个引用,即存储在此帧中的引用)时,则该值为真。 否则返回0。
如果返回1,答案是有效的,直到av_buffer_ref()被调用到任何一个底层的AVBufferRefs(例如通过av_frame_ref()或直接)。
int | av_frame_make_writable (AVFrame *frame) |
如果帧是可写的,则不执行任何操作,如果不是,则分配新的缓冲区并复制数据。
返回:0成功,否定AVERROR出错。
int | av_frame_copy (AVFrame *dst, const AVFrame *src) |
此函数不分配任何东西,dst必须已经初始化并分配与src相同的参数。
该功能仅复制帧数据(即数据/扩展数据数组的内容),而不是任何其他属性。
返回:> = 0成功,错误的AVERROR为负。
int | av_frame_copy_props (AVFrame *dst, const AVFrame *src) |
用于此功能的元数据是不影响缓冲区中数据布局的那些字段。 例如。 pts,采样率(音频)或采样宽高比(视频),但不是宽/高或通道布局。 侧面数据也被复制。
AVBufferRef * | av_frame_get_plane_buffer (AVFrame *frame, int plane) |
参数:plane:在frame-> extended_data中感兴趣的数据平面的索引。
返回:包含平面的缓冲区引用,如果输入框无效则为NULL。
AVFrameSideData * | av_frame_new_side_data (AVFrame *frame, enum AVFrameSideDataType type, int size) |
参数:frame:应该添加侧面数据的框架
type:添加侧数据的类型
size:边数据的大小
返回:新添加的侧面数据成功,NULL出错
AVFrameSideData * | av_frame_get_side_data (const AVFrame *frame, enum AVFrameSideDataType type) |
void | av_frame_remove_side_data (AVFrame *frame, enum AVFrameSideDataType type) |
const char * | av_frame_side_data_name (enum AVFrameSideDataType type) |