文章目錄
- 🎬 FFmpeg 解碼播放流程概覽(以音視頻文件為例)
- 1?? 創建結構體
- 2?? 打開音視頻文件
- 3?? 查找解碼器并打開解碼器
- 4?? 循環讀取數據包(Packet)
- 5?? 解碼成幀(Frame)
- 6?? 播放 / 顯示 / 播放音頻
- 7?? 清理資源
- ? 總結一句話流程:
🎬 FFmpeg 解碼播放流程概覽(以音視頻文件為例)
1?? 創建結構體
準備容器結構體,用于打開媒體文件并讀取信息
-
創建
AVFormatContext
AVFormatContext *fmt_ctx = NULL;
-
【可選】使用
avformat_alloc_context
手動分配(很多時候由avformat_open_input
自動完成)
2?? 打開音視頻文件
打開媒體文件并讀取格式頭部信息
- 使用
avformat_open_input()
打開文件 - 使用
avformat_find_stream_info()
讀取流信息(視頻流、音頻流)
3?? 查找解碼器并打開解碼器
- 遍歷
fmt_ctx->streams[i]
,找到視頻流和音頻流的索引 - 獲取
AVCodecParameters
- 使用
avcodec_find_decoder()
找到對應的解碼器 - 使用
avcodec_alloc_context3()
創建解碼器上下文AVCodecContext
- 使用
avcodec_parameters_to_context()
拷貝參數 - 使用
avcodec_open2()
打開解碼器
4?? 循環讀取數據包(Packet)
將原始的壓縮音視頻數據讀取出來
- 使用
av_read_frame()
讀取AVPacket
- 判斷
packet.stream_index
來區分是視頻包還是音頻包
5?? 解碼成幀(Frame)
將壓縮包解碼成原始幀
- 使用
avcodec_send_packet()
將AVPacket
發送給解碼器 - 使用
avcodec_receive_frame()
獲取解碼后的AVFrame
6?? 播放 / 顯示 / 播放音頻
這一步跟平臺相關:
- 視頻幀可以用 SDL、OpenGL、Qt 等顯示
- 音頻幀可以送給音頻設備播放(如 SDL、PortAudio、ALSA)
7?? 清理資源
av_packet_unref()
和av_frame_unref()
用于復用avcodec_free_context()
釋放解碼器上下文avformat_close_input()
和avformat_free_context()
釋放格式上下文
? 總結一句話流程:
創建結構體 → 打開文件 → 查找流 → 找解碼器 → 解碼成幀 → 播放 → 釋放資源