ffmpeg SwsContext像素格式转换BGRA转YUV420P

一、概述

  ffmpeg提供了一个很有用的工具进行像素格式的转换。在实际的应用场景中可以根据需求来定制转换过程。

  本例通过BGRA转YUV420P来展现这个过程

  注意事项:

    • 输入输出不能搞错,特别是输入的像素格式是什么,要求的输出像素格式是什么
    • 如果输入和输出的宽高不一致像素格式一致,则是在进行裁剪操作,如果宽高和像素格式不一致,则进行裁剪+转换操作
    • 注意其中的一个参数:linesize,linesize表示的是图像一行像素的字节数。如:YUV420P的linesize=width,RGBA的linesize=width*4,RGB24的linesize=width*3等。

二、代码示例

  1. 导入库
    extern "C"
    {
    #include "libswscale/swscale.h"
    #include "libavutil/avutil.h"
    }

     

  2. 初始化SwsContext
    swsCtx = sws_getCachedContext(swsCtx,
        mContext->width, mContext->height, AV_PIX_FMT_BGRA,//输入的宽高及像素格式
        mContext->width, mContext->height,//输出的宽高
        AV_PIX_FMT_YUV420P,//输出的像素格式
        SWS_BILINEAR,//双线性插值算法
        0, 0, 0
    );
    if (!swsCtx)
    {
        qDebug() << "sws_getCachedContext failed!";
    }

     

  3. 开始转换
    const uint8_t* srcData[AV_NUM_DATA_POINTERS];
    srcData[0] = inData;
    int srcLines[AV_NUM_DATA_POINTERS];
    srcLines[0] = mContext->width * 4;
    int ret = sws_scale(swsCtx
        , srcData, srcLines, 0, mContext->height,
        frame->data, frame->linesize
    );
    if (ret <= 0)
    {
        PrintErr(ret);
    }

     

  4. 销毁
    if (swsCtx)
    {
        sws_freeContext(swsCtx);
        swsCtx = nullptr;
    }

     

  5. 使用
    encoder->scale((uint8_t*)data, frame);
    auto pkt = encoder->Encode(frame);

     

posted on 2025-05-21 16:00  飘杨......  阅读(57)  评论(0)    收藏  举报