【发布时间】: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 的某个地方管理自己的内存,并忽略了我之前分配给 pFrame 的 dataBuff。
所以我被卡住了——如何告诉libav 将解码的帧数据写入我预先分配的内存?我看到有人在网上和 libav 论坛上提出类似的问题,但一直没有找到答案。
非常感谢~
【问题讨论】:
标签: c++ ffmpeg libavcodec libav