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

时间:2018-12-17 20:55:54

标签: c++ ffmpeg libavcodec libav

我正在尝试通过以下演示代码使用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中的某个地方管理自己的内存,而忽略了我之前分配给dataBuff的{​​{1}}。

所以我陷入了困境–如何告诉pFrame将解码的帧数据写入我预分配的内存中?我见过人们在网上和libav论坛上提出类似的问题,但是却找不到答案。

非常感谢〜

1 个答案:

答案 0 :(得分:0)

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

FFMPEG: While decoding video, is possible to generate result to user's provided buffer?

其他文档是here