ffmpeg拿AVPacket做緩衝隊列時注意

1、AVPacket加入隊列注意

  在將AVPacket加入緩衝隊列如queue或deque時必須將原始的packet備份一份或者增加引用後再入隊,否則該數據包會被釋放。
具體兩種做法:
《1》、將原始數據包SrcPacket引用計數加一(推薦)

queue<AVPacket*> myqueue;
AVPacket tmp = { 0 };
av_packet_ref(&tmp, &SrcPkt);
myqueue.push(&tmp);
av_packet_unref(&SrcPkt);

《2》、將始數據包SrcPacket拷貝一份

av_copy_packet(&tmp, &SrcPkt);
myqueue.push(&tmp);

2、AVPacket加入智能指針管理的隊列中注意

   加入隊列時需要注意的和1一致,不過如果是用智能指針管理,那麼必須加入我們自己的刪除器,否則引用爲0時,釋放內存失敗,導致內存泄漏

deque< shared_ptr<AVPacket> >  MainVideoQueue;

//傳入lambda表達式定義的刪除器    
shared_ptr<AVPacket> tmp_share((AVPacket*)av_malloc(sizeof(AVPacket)),  [&](AVPacket* p) {av_packet_unref (p\);});

av_init_packet(tmp_share.get());
av_packet_ref(tmp_share.get(), &SrcPkt); 
MainVideoQueue.push_back(tmp_share);

av_packet_unref(&SrcPkt);

3、參考

《1》、avpacket做緩衝
《2》、智能指針處理avpacket

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章