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