前言
FFmpeg 結構體眾多,初學者易迷失。本文將核心結構體按功能分為四類,梳理它們的層級關係與數據流向,附官方架構圖說明。
四大類核心結構體
a) 解協議層
- AVIOContext:I/O 操作上下文,封裝讀寫操作;
- URLProtocol:協議註冊表項,每種協議(http, rtmp, file 等)對應一個;
- URLContext:具體協議實例,存儲狀態、私有數據。
注意:FFmpeg 將本地文件視為 `file` 協議。
b) 解封裝層
- AVFormatContext:封裝格式上下文,統領全局,包含流列表、元數據等;
- AVInputFormat:解封裝器註冊表項(如 flv, mp4, mkv),每種格式一個。
c) 解碼層
- AVStream:每條音視頻流對應一個,含時間基、編解碼參數;
- AVCodecContext:編解碼器上下文,存儲具體編解碼參數(分辨率、採樣率等);
- AVCodec:編解碼器註冊表項(如 h264, aac),含編解碼函數指針。
關係:`AVFormatContext` → 多個 `AVStream` → 各自一個 `AVCodecContext` → 對應一個 `AVCodec`。
d) 數據存儲層
- AVPacket:壓縮數據包(解碼前),通常一幀視頻或多幀音頻;
- AVFrame:解碼後原始數據(YUV/RGB/PCM),視頻一幀,音頻多幀。
結構體關係圖

數據流向總結
- 協議層讀取字節流 →
- 封裝層解析容器 → 產生 `AVPacket` →
- 解碼層 `AVCodecContext` 解碼 `AVPacket` → 產生 `AVFrame` →
- 上層應用渲染/播放 `AVFrame`。
學習建議
- 從 `AVFormatContext` 入手,理解 `avformat_open_input`/`avformat_find_stream_info` 流程;
- 重點掌握 `AVCodecContext` 配置與 `avcodec_send_packet`/`avcodec_receive_frame` 新 API;
- 結合 `leixiaohua1020` 博客系列文章逐模塊攻克。