AVFrame
是FFmpeg中的一個核心數據結構,用于表示音頻或視頻的幀。它包含了一系列用于描述幀數據和元數據的字段。以下是對AVFrame
結構體的詳細分析,包括其主要字段及其作用。
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庫進行多媒體處理任務。