近期我參與了部門底層庫依賴的 FFmpeg 從 3.4 升級至 7.0.2 的工作,在此分享一些經驗和遇到的 API 變動。
將 FFmpeg 升級到高版本后,編譯過程中遇到大量報錯是常態。這些錯誤通常源于 API 接口變更或結構體字段調整。此時不必驚慌,核心解決思路是將報錯的接口或用法適配到新版本。
如何快速準確地找到新版本中的對應替代方案? 以下是我找到的一些方法:
-
FFmpeg 官方文檔 :查找任何 API 用法和參數說明的最權威來源。
-
FFmpeg 廢棄 API 文檔:這是解決升級問題的有效資源。文檔詳細列出了當前版本(如 7.0)相比舊版本廢棄的 API、結構體成員、宏等,并且明確指明了應該使用的新接口或替代方案。
-
互聯網搜索與 AI 輔助:如果在官方文檔中沒有找到直接的答案(特別是對于一些隱晦的變更或行為差異),搜索引擎和開發者社區(Stack Overflow 等)是重要的補充。像 DeepSeek 這類 AI 助手也是高效的查詢工具,能快速提供可能的替代方案或解釋變更背景。
-
源碼探索(最后手段):如果以上途徑都未能解決問題(這種情況極少遇到),最后的辦法是深入源碼。主要思路是先定位舊版本中相關 API/結構體的源碼實現,然后在高版本 FFmpeg 源碼的對應位置(或通過搜索相關功能關鍵詞),查看新版本是如何實現相同功能的。這需要一定的源碼閱讀能力。
在完成本次升級后,我整理了遇到的一些API變動。以下表格概述了這些變更及其影響/替代方案(詳細說明請參考官方文檔和廢棄列表):
變更類型 | 舊版 API/字段 | 新版 API/字段 | 備注/參考 |
---|---|---|---|
Packet 初始化 | av_init_packet | av_packet_alloc (內部調用 get_packet_defaults ) | 參考 |
幀時間戳字段 | AVFrame::pkt_pts | AVFrame::pts | 參考 |
編解碼器參數類型 | AVCodec* | const AVCodec* | 高版本函數普遍使用 const 修飾符 |
全局注冊函數 | av_register_all | 自動注冊 | 輸入輸出設備仍需 avdevice_register_all() 參考 |
聲道布局表示 | channels 字段 | ch_layout 結構體 | 更精確的聲道描述方式 |
音頻重采樣上下文創建 | swr_alloc_set_opts | swr_alloc_set_opts2 | 統一接口,支持更多參數 |
內存分配函數 | av_mallocz_array | av_calloc | 參考 |
內存管理頭文件 | <libavutil/mem.h> | 內部實現(mem_internal.h ) | 不再作為公共頭文件導出 |
解復用器遍歷 | 舊版迭代方式 | av_demuxer_iterate | MLT 框架適配示例 參考 |
音頻重采樣接口 | audio_resample | swr_convert | 參考 |
流創建參數 | avformat_new_stream 的 codec 參數 | 無效 | 參考 |
解碼接口 | avcodec_decode_video2 /audio4 | avcodec_send_packet + avcodec_receive_frame | 參考 |
索引訪問方式 | AVStream::nb_index_entries /index_entries | avformat_index_get_entries_count() + avformat_index_get_entry() | 參考 |