我想製作一個AVPacket的副本,以便稍後可以解碼它,當我喜歡。創建一個AVPacket結構的副本
AVPacket來自音頻流。
av_dup_packet似乎不起作用。
AVPacket複製構造函數不起作用。
創建我自己的拷貝構造函數會導致內存損壞。
我想製作一個AVPacket的副本,以便稍後可以解碼它,當我喜歡。創建一個AVPacket結構的副本
AVPacket來自音頻流。
av_dup_packet似乎不起作用。
AVPacket複製構造函數不起作用。
創建我自己的拷貝構造函數會導致內存損壞。
複製一個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並沒有足夠的分配,也沒有分配足夠的字節對齊。
請注意,如果私法設置爲一些有趣的事情,這可能不適合所有的情況下工作,例如。
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
如果您添加了一些說明,爲什麼這能解決問題 – Soren
哇,真的是四年了嗎?是的,這可以工作,因爲內存管理是由libav處理的。沒有時間去測試。 – 0xbaadf00d