如果还要包括其它的附加信息呢 不止buffer
时间: 2024-03-13 15:44:16 浏览: 19
AVPacket 中除了 buffer 字段,还包含了很多其他的附加信息,例如 PTS、DTS、stream_index 等。要将 AVPacket 中的所有数据复制到一个新的 AVPacket 中,可以使用 av_packet_ref() 函数或者 av_packet_alloc() 函数。这两个函数都会在堆上分配一个新的 AVPacket,并将源 AVPacket 中的所有数据复制到新的 AVPacket 中。
使用 av_packet_ref() 函数:
```c
AVPacket *origin_pkt = ...; // 源 AVPacket
AVPacket clone_pkt;
av_init_packet(&clone_pkt); // 初始化新的 AVPacket
av_packet_ref(&clone_pkt, origin_pkt); // 复制 AVPacket
```
使用 av_packet_alloc() 函数:
```c
AVPacket *origin_pkt = ...; // 源 AVPacket
AVPacket *clone_pkt = av_packet_alloc(); // 分配新的 AVPacket
av_packet_ref(clone_pkt, origin_pkt); // 复制 AVPacket
```
需要注意的是,使用 av_packet_ref() 函数时,需要先手动初始化新的 AVPacket,而使用 av_packet_alloc() 函数则会自动初始化新的 AVPacket。在使用完复制的 AVPacket 后,需要使用 av_packet_unref() 函数或者 av_packet_free() 函数释放它占用的内存。
使用 av_packet_unref() 函数:
```c
av_packet_unref(&clone_pkt); // 释放复制的 AVPacket
```
使用 av_packet_free() 函数:
```c
av_packet_free(&clone_pkt); // 释放复制的 AVPacket
```
需要注意的是,使用 av_packet_ref() 函数或者 av_packet_alloc() 函数复制 AVPacket 时,不需要手动复制 buffer 数据。因为 av_packet_ref() 函数和 av_packet_alloc() 函数都会自动复制 buffer 数据。