FFMPEG開發中遇到的問題①avpicture_fill和AVFrame::data的內存管理

1.int avpicture_fill(AVPicture *picture, const uint8_t *ptr,enum AVPixelFormat pix_fmt, int width, int height);

這個函數的作用是給 picture掛上存放數據的代碼。在對幀數據進行scale之前,對於接受數據的picture(等同AVFrame)要用av_frame_alloc()初始化,但AVFrame::data需要手動初始化,即掛上內存,在scale的時候是直接在data裏寫入數據的。但在接收解碼數據時,只需要av_frame_alloc(),不用手動掛內存

2.AVFrame的內存釋放問題

在用AVFrame循環接受視頻的幀數據的時候,或者批量讀取圖片量比較大的時候,不釋放AVFrame會報指針越界錯誤,在我添加了av_free()並釋放了AVFrame指針後,發現報錯時間延後了,但任然有指針越界導致的報錯,調試後發現,av_free()並沒有釋放AVFrame中data[x]指向的 數據,僅僅是把data本身指向的數據釋放了,但其作爲二級指針指向的數據跳過了,需要手動釋放,添加 av_free(AVFrame->data[0])後問題解決。
總結        
av_free( AVFrame* )                                              對應    av_frame_alloc()    
av_free( AVFrame->data[0] )  或者av_free( ptr* )  對應   avpicture_fill 函數或者 avcodec_encode_video2()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章