使用ffmpeg解碼 需要注意的內存泄漏問題


說說項目中遇到的兩點失誤:

1. AVFrame結構,av_frame_alloc申請內存,av_frame_free釋放內存。容易混淆的是av_frame_unref,它的作用是釋放音視頻數據資源,而av_frame_free是釋放所有資源,包括音視頻數據資源和結構體本身的內存。可以從源碼中看到,av_frame_free函數體內是先調用了av_frame_unref釋放數據緩存,再free本身結構體內存。

2. AVPacket結構,比較神奇的是,av_read_frame執行過程中,內部為形參pkt自動申請一塊緩存用來存儲音視頻數據,而釋放資源卻由我們自己調用av_free_packet來釋放緩存。從源碼分析得知,當av_read_frame返回值不小於0時,內部會進行緩存操作,需要外界釋放;當返回值小於0時,內部會進行緩存並釋放,或者不進行緩存,由數據本身損壞或正常結束來決定。

相關源碼可以參看:

https://github.com/FFmpeg/FFmpeg/blob/master/libavutil/frame.c

https://www.ffmpeg.org/doxygen/0.6/avpacket_8c-source.html

https://ffmpeg.org/doxygen/trunk/libavformat_2utils_8c-source.html

https://www.ffmpeg.org/doxygen/2.7/libavcodec_2utils_8c_source.html


免責聲明!

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



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