核心地位
`avformat_open_input` 是 FFmpeg 打開媒體的入口函數,其重要性不言而喻。掌握其內部流程,有助於深入理解 FFmpeg 的解複用架構與協議層設計。
函數主要完成工作
- 初始化輸入輸出結構體 `AVIOContext`;
- 通過評分機制識別輸入數據協議(如 RTMP、File 等):
1. 判斷文件名後綴;
2. 讀取文件頭數據進行特徵比對;
- 選取得分最高的 `URLProtocol`,通過函數指針方式與 FFmpeg 核心連接;
- 後續調用該協議對應的 `open`、`read` 等函數指針完成實際 I/O 操作。
調用關係圖解
以下通過 Eclipse + MinGW 調試 FFmpeg 源碼獲得的函數調用關係圖,清晰展示了從 `avformat_open_input` 到具體協議層的調用鏈路:

可見最終均調用 `URLProtocol` 結構體中的函數指針,體現了 FFmpeg 靈活的插件化協議架構。
源碼級學習建議
- 從 `libavformat/utils.c` 中 `avformat_open_input` 入手,重點關注 `init_input`、`probe_input_format`、`ffurl_open_whitelist` 等關鍵內部函數;
- 對比 File、RTMP、HLS 等不同協議的 `URLProtocol` 實現(位於 `libavformat/*.c`),理解評分邏輯與私有數據結構;
- 嘗試添加自定義協議,體驗 FFmpeg 可擴展性設計。
本文源自 “leixiaohua1020視音頻技術” 博客,轉載請保留出處:https://leixiaohua1020.blog.51cto.com/3974648/1298896