创建AVPacket结构的副本

时间:2012-10-17 07:33:29

标签: c++ libavcodec

我想制作AVPacket的副本,以便我可以在以后随时解码。

AVPacket来自音频流。

av_dup_packet似乎不起作用。

AVPacket复制构造函数不起作用。

创建我自己的复制构造函数会导致内存损坏。

3 个答案:

答案 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)