如何为 libavcodec 预分配内存以写入解码帧数据?

How do I pre-allocate the memory for libavcodec to write decoded frame data?

我正在尝试按照演示代码使用 libav 解码视频:here

我需要能够控制 pFrame->data[0] 中帧数据的存储位置。我已尝试将 pFrame->data 设置为我自己的缓冲区,如下所示:

// Determine required buffer size and allocate buffer 
int numBytes = av_image_get_buffer_size(pixFmt, width, height, 1); 
(uint8_t*) dataBuff = (uint8_t*) malloc (numBytes * sizeof(uint8_t)); 

// Assign buffer to image planes in pFrame
av_image_fill_arrays(frame->data, frame->linesize, dataBuff, pixFmt, width,
height, 1);

虽然这确实将 pFrame->data 设置为 dataBuff(如果我打印它们的地址,它们是相同的),但这个接收解码数据的调用 ret = avcodec_receive_frame(pCodecContext, pFrame) 总是写入数据到不同的地址。它似乎在底层 API 的某处管理自己的内存,并忽略了我之前分配给 pFramedataBuff

所以我被卡住了——我如何告诉 libav 将解码的帧数据写入我预先分配的内存?我在网上和 libav 论坛上看到有人问过类似的问题,但一直找不到答案。

非常感谢~

我发现正确的方法是通过回调函数 get_buffer2 创建您自己的自定义分配器,正如这个答案所示:

进一步的文档是 here!