以 FFMPEG 格式填充 BGR 帧数据



我在这里遵循 FFmpeg 视频封装示例,但它会制作一些虚拟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]);,我将出现内存泄漏......但是把它留在那里会崩溃....那么释放已用内存的正确方法是什么?

使用 av_image_fill_linesizes() 填充

线条大小(除非它们被填充,在这种情况下,您应该手动指定它们),然后使用 av_image_fill_pointers() 填充数据指针。pix_fmt,请使用AV_PIX_FMT_BGR24。

现在,这为您提供了BGR24图片。您可以使用 libx264rgb 编码器将其编码为 RGB H264 图像。如果要编码YUV H264,首先需要将RGB图像转换为YUV,可以使用libswscale执行此操作。谷歌"libswscale示例"来查找有关如何执行此操作的示例代码。

最新更新