Video 在FFMPEG中填充BGR帧数据

Video 在FFMPEG中填充BGR帧数据,video,ffmpeg,h.264,yuv,bgr,Video,Ffmpeg,H.264,Yuv,Bgr,我遵循FFmpeg视频编码示例,但它生成了一些虚拟YUV420P帧,并且我已经从相机捕获了BGR图像 我不知道如何使用frame->data[]和frame->linesize[]来填充我的BGR图像,因此我可以对H264视频进行编码 编辑: 在Ronald的回答之后,我有以下代码(相机发送的每一张新照片都会调用该代码): ............. AVFrame *bgrFrame = av_frame_alloc(); bgrFrame->width =

我遵循FFmpeg视频编码示例,但它生成了一些虚拟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])在代码的末尾,我会有一个内存泄漏…但是让它留在那里会崩溃…那么,释放已用内存的正确方法是什么呢

用于填充线条尺寸(除非它们是填充的,在这种情况下,您应该手动指定它们),然后用于填充数据指针。作为pix_fmt,使用


现在,这给你一个BGR24图片。您可以使用编码器将其编码为RGB H264图像。如果要对YUV H264进行编码,首先需要将RGB图像转换为YUV,这可以使用libswscale完成。谷歌“libswscale example”来找到如何做的示例代码。

这只是我的印象还是将
av\u image\u alloc()
也做
av\u image\u fill\u linesize()
工作,所以我只需要调用
av\u image\u fill\u linesize()
用我的图片填充数据?av\u image\u alloc会帮你做的,是的。而且会
av\u frame\u free()
free
frame->data[]
吗?代码文档在我看来是的,它会,但源代码没有。所以我有
av\u freep(&frame->data[0])
以防万一如果您使用
av\u frame\u alloc()
分配帧内容,
av\u frame\u free()
将释放它们,是的。如果手动分配指针,它们不会使用
AVBufferRef
,因此不会被
av\u frame\u free()
av\u image\u fill\u指针()触及。
会导致内存泄漏……如果我使用
av\u freep(&frame->data[0])之后,程序崩溃,如果我不这样做,它会消耗我所有的内存……清理内存的正确方法是什么?