2012-10-17 87 views
1

我想製作一個AVPacket的副本,以便稍後可以解碼它,當我喜歡。創建一個AVPacket結構的副本

AVPacket來自音頻流。

av_dup_packet似乎不起作用。

AVPacket複製構造函數不起作用。

創建我自己的拷貝構造函數會導致內存損壞。

回答

4

複製一個AVPacket結構的方式:(即作品)

AVPacket newPacket(oldPacket); 
newPacket->data = reinterpret_cast<uint8_t*>(new uint64_t[(oldPacket->size + FF_INPUT_BUFFER_PADDING_SIZE)/sizeof(uint64_t) + 1]); 
memcpy(newPacket->data, oldPacket->data, oldPacket->size); 

其原因是,解碼器的某些使用需要某些字節對齊和填充優化。簡單地分配oldPacket-> size並沒有足夠的分配,也沒有分配足夠的字節對齊。

請注意,如果私法設置爲一些有趣的事情,這可能不適合所有的情況下工作,例如。

1
 AVPacket *newpacket = (AVPacket*)malloc(sizeof(struct AVPacket)); 
     av_init_packet(newpacket); 
     av_packet_ref(newpacket, packet); 

     av_packet_unref(packet); 
     free(packet); 
     packet = nil; 

由於功能av_dup_packet從2015年10月 094952 棄用最好是改用av_packet_ref/av_packet_unref。 新數據包應該分配內存,並在啓動後使用av_init_packet

+1

如果您添加了一些說明,爲什麼這能解決問題 – Soren

+0

哇,真的是四年了嗎?是的,這可以工作,因爲內存管理是由libav處理的。沒有時間去測試。 – 0xbaadf00d