avcodec_send_packet 和avcodec_receive_frame實現解碼


新的版本,斷點進入發現老的解碼函數avcodec_decode_video2實際上還是調用的這2個函數.

avcodec_decode_video2
--->compat_decode
    --->avcodec_send_packet
      --->decode_receive_frame_internal

avcodec_decode_video2
--->compat_decode
    --->avcodec_receive_frame

 

 

 

avcodec_send_packet 發送數據到ffmepg,放到解碼隊列
avcodec_receive_frame 將成功的解碼隊列中取出1個frame  (如果失敗會返回0)

avcodec_send_packet后顯示ret已經-11
 

 

 ff_decode_get_packet,再h264_decode_frame(它會根據 NAL Unit 的類型進行解碼

 

 decode時,2種調用方式,如下:(libavcodec/decode.c)

 

 

 

 

 



int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpacket)
avpacket 解碼和解封裝是2個線程,如果解封裝后,調用此函數后,會將avpacket的引用計數加1 或者 復制一份(沒有計數引用)。因此在調用了后,釋放掉 avpacket。
 

int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame)
frame會每次清掉上一次frame,然后重新賦值,可以給同一個frame


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM