但是这个结构体全是动态指针 我复制出来的不是原始数据
时间: 2024-03-13 21:44:24 浏览: 58
确实,AVPacket 中的 buf 字段对应的 AVBufferRef 结构体中的数据是动态分配的,如果直接进行 memcpy() 操作,只是复制了指针的值,而没有复制实际的数据内容,因此复制出来的数据不是原始数据。
要复制 AVPacket 中的 buf 字段对应的 AVBufferRef 结构体中的数据,可以使用 av_buffer_alloc() 函数和 av_buffer_ref() 函数进行复制。具体实现如下:
```c
AVPacket *pkt = ...; // 源 AVPacket
char *buffer = (char *) malloc(pkt->size + AV_INPUT_BUFFER_PADDING_SIZE); // 分配 char* 缓冲区,注意要包含 AV_INPUT_BUFFER_PADDING_SIZE 字节的填充数据
memcpy(buffer, pkt, sizeof(AVPacket)); // 复制 AVPacket 中的所有信息到缓冲区
AVBufferRef *src_buf = pkt->buf;
if (src_buf) {
AVBufferRef *dst_buf = av_buffer_alloc(src_buf->size); // 分配新的 AVBufferRef 结构体
av_buffer_ref(dst_buf, src_buf); // 复制 AVBufferRef 中的数据
memcpy(buffer + sizeof(AVPacket), &dst_buf, sizeof(AVBufferRef *)); // 将新的 AVBufferRef 结构体的指针复制到缓冲区
memcpy(buffer + sizeof(AVPacket) + sizeof(AVBufferRef), dst_buf->data, dst_buf->size); // 复制 AVBufferRef 中的数据到缓冲区
}
```
需要注意的是,在使用完复制的缓冲区后,需要先释放 AVBufferRef 结构体占用的内存,然后再释放缓冲区占用的内存。具体实现如下:
```c
if (dst_buf) {
av_buffer_unref(&dst_buf); // 释放复制的 AVBufferRef 结构体
}
free(buffer); // 释放 char* 缓冲区
```
需要注意的是,这种方式复制的 AVPacket 数据可以直接使用,因为它的 buf 字段中的指针已经重新指向了复制后的 AVBufferRef 结构体中的地址。
阅读全文