如何为libavcodec预先分配内存来写入解码后的帧数据?

gur*_*ulu 5 c++ ffmpeg libavcodec libav

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

我需要能够控制帧数据的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);
Run Code Online (Sandbox Code Playgroud)

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

所以我陷入了困境 - 我如何才能知道libav将解码的帧数据写入我预先分配的内存?我看到人们在网上和 libav 论坛中提出类似的问题,但未能找到答案。

非常感谢~

gur*_*ulu 3

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

FFMPEG:解码视频时,是否可以将结果生成到用户提供的缓冲区?

更多文档在这里