【问题标题】:Fill a BGR Frame Data in FFMPEG在 FFMPEG 中填充 BGR 帧数据
【发布时间】:2016-02-02 01:49:36
【问题描述】:

我正在关注 FFmpeg 视频编码示例 here,但它会生成一些虚拟 YUV420P 帧,并且我已经从相机捕获了 BGR 图像。

我不知道如何使用 frame->data[]frame->linesize[] 来填充我的 BGR 图像,所以我可以编码 H264 视频。


编辑:

在 Ronald 的回答之后,我有以下代码(相机发送的每张新照片都会调用它):

    .............
    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]);,我将出现内存泄漏......但让它在那里崩溃......那么释放已用内存的正确方法是什么?

【问题讨论】:

    标签: video ffmpeg h.264 yuv bgr


    【解决方案1】:

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

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

    【讨论】:

    • 这只是我的印象还是av_image_alloc() 也会做av_image_fill_linesizes() 的工作,所以我只需要打电话给av_image_fill_linesizes() 用我的图片填充数据?
    • av_image_alloc 会为你做的,是的。
    • av_frame_free() 也会免费提供frame->data[] 吗?代码文档在我看来是的,它会,但源代码没有。所以我有av_freep(&frame->data[0])以防万一
    • 如果您使用av_frame_alloc() 分配帧内容,av_frame_free() 将释放它们,是的。如果您手动分配指针,它们不会使用AVBufferRef,因此不会被av_frame_free() 触及。
    • av_image_fill_pointers() 导致内存泄漏.....如果我在它之后创建av_freep(&frame->data[0]);,程序会崩溃,如果我不这样做,它会消耗我所有的内存...... ..清理内存的正确方法是什么?
    猜你喜欢
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    相关资源
    最近更新 更多