AVFrame
是FFmpeg中的一个核心数据结构,用于表示音频或视频的帧。它包含了一系列用于描述帧数据和元数据的字段。以下是对AVFrame
结构体的详细分析,包括其主要字段及其作用。
在FFmpeg的源代码中,AVFrame
的定义可以在avframe.h
头文件中找到。其结构定义较为复杂,这里只简要描述其主要字段。
数据指针
uint8_t *data[AV_NUM_DATA_POINTERS]
: 指向实际的帧数据的指针数组。对于视频帧,这通常是图像平面(如YUV中的Y、U、V平面)。对于音频帧,这通常是音频通道的数据指针。int linesize[AV_NUM_DATA_POINTERS]
: 每一行(视频)或每一个音频通道(音频)的大小。对于视频,这通常是图像宽度的字节数。对于音频,这通常是一个通道的样本数量。基本信息
int width, height
: 视频帧的宽度和高度。对于音频帧,这些字段未使用。enum AVPixelFormat format
: 视频帧的像素格式,描述帧中每个像素的存储方式。对于音频帧,这个字段指的是样本格式。int sample_rate
: 音频帧的采样率。对于视频帧,这个字段未使用。int channels
: 音频通道的数量。对于视频帧,这个字段未使用。时间戳
int64_t pts
: 帧的显示时间戳(Presentation Timestamp),表示帧应该在何时被显示或播放。int64_t pkt_pts
和 int64_t pkt_dts
: 解码时间戳(Decoding Timestamp)和封装时间戳(Packet Timestamp),分别表示帧解码和封装的时间点。引用计数
int8_t *refcounted
: 表示该帧是否使用引用计数。启用引用计数可以防止帧在使用时被意外释放。int8_t *extended_data
: 指向扩展数据指针数组,通常用于音频数据,表示多个通道的音频样本。缓冲区
AVBufferRef *buf[AV_NUM_DATA_POINTERS]
: 指向包含实际数据的缓冲区。使用引用计数的缓冲区来管理内存。AVBufferRef *extended_buf
: 扩展缓冲区数组,用于存储超出buf
数组限制的数据。色彩信息
enum AVColorSpace colorspace
: 视频帧的色彩空间(如BT.709、BT.2020等)。enum AVColorRange color_range
: 视频帧的色彩范围(如全范围或限制范围)。音频
int nb_samples
: 音频帧中的样本数量。int channel_layout
: 音频帧的通道布局,表示音频通道的排列方式。代码示例:
- AVFrame *frame = av_frame_alloc();
- if (!frame) {
- fprintf(stderr, "Could not allocate frame\n");
- exit(1);
- }
-
- frame->format = AV_PIX_FMT_YUV420P;
- frame->width = 640;
- frame->height = 480;
-
- /* Allocate the buffers for the frame data */
- int ret = av_frame_get_buffer(frame, 32);
- if (ret < 0) {
- fprintf(stderr, "Could not allocate the video frame data\n");
- exit(1);
- }
-
- /* Fill the frame with some data here */
-
- /* When done, free the frame */
- av_frame_free(&frame);
在上面的示例中,av_frame_alloc
用于分配一个新的AVFrame
,并设置了帧的格式、宽度和高度。av_frame_get_buffer
则用于为帧数据分配内存。
AVFrame
是FFmpeg中非常重要的数据结构,用于存储和处理音频和视频帧。理解其各个字段及其作用对于处理多媒体数据非常关键。通过对这些字段的了解,开发者可以更有效地使用FFmpeg库进行多媒体处理任务。