【问题标题】:How do I pre-allocate the memory for libavcodec to write decoded frame data?如何为 libavcodec 预先分配内存以写入解码的帧数据?
【发布时间】:2019-05-18 06:30:45
【问题描述】:

我正在尝试按照演示代码使用 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 论坛上提出类似的问题,但一直没有找到答案。

非常感谢~

【问题讨论】:

    标签: c++ ffmpeg libavcodec libav


    【解决方案1】:

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

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

    更多文档是here!

    【讨论】:

      猜你喜欢
      • 2012-11-15
      • 2015-12-05
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多