我正在关注FFmpeg视频enconding示例here,但它制作了一些虚拟YUV420P帧,并且我已经从相机捕获了BGR图像。
我不确定如何使用frame->data[]
和frame->linesize[]
来填充我的BGR图像,因此我可以对H264视频进行编码。
编辑:
在罗纳德的回答之后,我有以下代码(相机发送的每张新照片都会调用它):
.............
AVFrame *bgrFrame = av_frame_alloc();
bgrFrame->width = originalBGRImage.cols;
bgrFrame->height = originalBGRImage.rows;
ret = av_image_alloc(bgrFrame->data, bgrFrame->linesize, bgrFrame->width, bgrFrame->height, AV_PIX_FMT_BGR24, 32);
/////////////////////////////////////
// This works and prevents memory leak....if I remove it, it consumes all the RAM....but I can't free this memory here, since I will use it later...
av_freep(&bgrFrame->data[0]);
av_frame_free(&bgrFrame);
return;
/////////////////////////////////////
ret = av_image_fill_pointers(bgrFrame->data, AV_PIX_FMT_BGR24, bgrFrame->height, originalBGRImage.data, bgrFrame->linesize);
/////////////////////////////////////
// Here is where I am done using the memory so I will want to free it...but this same code crashes the program.
av_freep(&bgrFrame->data[0]);
av_frame_free(&bgrFrame);
return;
/////////////////////////////////////
因此,如果我删除代码末尾的av_freep(&bgrFrame->data[0]);
,我将会发生内存泄漏...但是它会崩溃......所以正确的解决方法是什么?记忆?
答案 0 :(得分:1)
使用av_image_fill_linesizes()填充线条(除非它们已填充,在这种情况下您应手动指定),然后使用av_image_fill_pointers()填充数据指针。作为pix_fmt,请使用AV_PIX_FMT_BGR24。
现在,它为您提供了BGR24图片。您可以使用libx264rgb编码器将其编码为RGB H264图像。如果你想编码YUV H264,你首先需要将RGB图像转换为YUV,你可以使用libswscale。 Google" libswscale示例"找到关于如何做到这一点的示例代码。