我想制作AVPacket的副本,以便我可以在以后随时解码。
AVPacket来自音频流。
av_dup_packet似乎不起作用。
AVPacket复制构造函数不起作用。
创建我自己的复制构造函数会导致内存损坏。
答案 0 :(得分: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-&gt;大小分配不够,也不分配正确的字节对齐。
请注意,这可能不适用于所有情况,例如,如果将priv设置为有趣的内容。
答案 1 :(得分:2)
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
启动后答案 2 :(得分:0)
我一直在使用这种方法:
AVPacket *clonedPacket = av_packet_clone(sourcePacket)
/* use clonedPacket */
av_packet_freee(&clonedPacket)