如何为 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 的某处管理自己的内存,并忽略了我之前分配给 pFrame
的 dataBuff
。
所以我被卡住了——我如何告诉 libav
将解码的帧数据写入我预先分配的内存?我在网上和 libav 论坛上看到有人问过类似的问题,但一直找不到答案。
非常感谢~
我发现正确的方法是通过回调函数 get_buffer2
创建您自己的自定义分配器,正如这个答案所示:
进一步的文档是 here!
我正在尝试按照演示代码使用 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 的某处管理自己的内存,并忽略了我之前分配给 pFrame
的 dataBuff
。
所以我被卡住了——我如何告诉 libav
将解码的帧数据写入我预先分配的内存?我在网上和 libav 论坛上看到有人问过类似的问题,但一直找不到答案。
非常感谢~
我发现正确的方法是通过回调函数 get_buffer2
创建您自己的自定义分配器,正如这个答案所示:
进一步的文档是 here!