在FFMPEG中填写BGR帧数据

时间:2016-02-02 01:49:37

标签: video ffmpeg h.264 yuv bgr

我正在关注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]);,我将会发生内存泄漏...但是它会崩溃......所以正确的解决方法是什么?记忆?

1 个答案:

答案 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示例"找到关于如何做到这一点的示例代码。