解碼流程如下圖
流程:首先,通過 avcodec_alloc_context3(nullptr)
分配一個 AVCodecContext
結構體,然后使用 avcodec_parameters_to_context
將參數復制到上下文中,接著通過 avcodec_find_decoder
查找指定的解碼器,并使用 avcodec_open2
打開解碼器。
接下來,使用 av_read_frame
從輸入流中讀取幀,如果讀取到幀,則使用 avcodec_send_packet
將幀發送到解碼器。然后,通過 avcodec_receive_packet
接收解碼后的幀,如果接收到幀,則進一步處理。
如果沒有接收到幀,則繼續讀取下一幀。
最后,當所有幀處理完畢后,使用 avcodec_close
關閉解碼器,并使用 avcodec_free_context
釋放上下文內存。
具體函數:
-
avcodec_alloc_context3(nullptr)
-
作用:分配一個 AVCodecContext 結構體,用于存儲解碼器的上下文信息。
-
返回值:返回一個指向 AVCodecContext 的指針
codecContext
。
-
-
avcodec_parameters_to_context
-
作用:將 AVCodecParameters 中的參數復制到 AVCodecContext 中,以便解碼器能夠正確地初始化。
-
參數:通常是從 AVFormatContext(如從文件讀取)中獲取的參數。
-
-
avcodec_find_decoder
-
作用:查找指定的解碼器。
-
返回值:返回一個指向 AVCodec 的指針
codec
。
-
-
avcodec_open2
-
作用:打開解碼器,初始化解碼器上下文。
-
參數:需要傳遞 AVCodecContext 和 AVCodec。
-
-
av_read_frame
-
作用:從輸入流中讀取一個視頻幀(或音頻幀)。
-
返回值:成功返回 0,失敗返回負值。
-
-
判斷是否讀取到幀
-
作用:檢查是否成功讀取到幀。
-
是:繼續處理。
-
否:跳轉到
avcodec_send_packet(nullptr)
。
-
-
avcodec_send_packet
-
作用:將讀取到的 AVPacket 發送到解碼器。
-
參數:AVPacket。
-
-
avcodec_receive_packet
-
作用:從解碼器中接收解碼后的 AVPacket。
-
返回值:成功返回 0,失敗返回負值。
-
-
判斷是否取到幀
-
作用:檢查是否成功接收到幀。
-
是:繼續處理。
-
否:跳轉到
avcodec_receive_frame
。
-
-
avcodec_receive_frame
-
作用:從解碼器中接收解碼后的 AVFrame。
-
返回值:成功返回 0,失敗返回負值。
-
-
判斷是否取到幀
-
作用:檢查是否成功接收到幀。
-
是:繼續處理。
-
否:跳轉到
avcodec_close
。
-
-
avcodec_close
-
作用:關閉解碼器。
-
-
avcodec_free_context
-
作用:釋放 AVCodecContext 的內存。
-
流程圖的邏輯
-
初始化解碼器:從分配上下文到打開解碼器。
-
讀取幀:從輸入流中讀取幀,并發送到解碼器。
-
接收解碼后的幀:從解碼器中接收解碼后的幀。
-
循環處理:直到所有幀都被處理完畢。
-
關閉解碼器:釋放資源。
具體代碼在這里:https://github.com/StudyWinter/MMAVPlayer/tree/main/chapter8