【问题标题】:Create a copy of an AVPacket structure创建 AVPacket 结构的副本
【发布时间】:2021-06-03 17:05:54
【问题描述】:

我想制作一个 AVPacket 的副本,以便以后可以在我喜欢的时候对其进行解码。

AVPacket 来自音频流。

av_dup_packet 似乎不起作用。

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

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

【问题讨论】:

    标签: c++ libavcodec


    【解决方案1】:

    一种复制 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 并没有分配足够的空间,也没有以正确的字节对齐方式分配。

    请注意,这可能不适用于所有情况,例如,如果 priv 设置为有趣的东西。

    【讨论】:

      【解决方案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;
      

      自 2015 年 10 月起已弃用函数 av_dup_packet 094952 最好使用 av_packet_ref / av_packet_unref。 新数据包应分配内存并在使用 av_init_packet 启动后

      ​​>

      【讨论】:

      • 如果您添加一些关于为什么这样可以解决问题的描述会很好
      • 哇,真的有四年了吗?是的,这可以工作,因为内存管理是由 libav 处理的。不过没时间测试。
      【解决方案3】:

      我一直在使用这种方法:

      AVPacket *clonedPacket = av_packet_clone(sourcePacket)
      /* use clonedPacket */
      av_packet_freee(&clonedPacket)
      

      【讨论】:

      • 是的,原来的问题现在已经 9 岁了。我希望事情有所进展。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      相关资源
      最近更新 更多