說說項目中遇到的兩點失誤:
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