ffmpeg swcale实现rgb24转yuv420p

本文介绍了一个将RGB格式图像转换为YUV格式的具体实现案例。通过使用FFmpeg相关库,如avcodec、avformat、swscale等,该程序能够读取RGB图像文件并将其转换为YUV格式。此外,还提供了详细的源代码,帮助读者理解整个转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我测试的rgb素材是BGR24的,如果你的 rgb数据是AV_PIX_FMT_RGB24格式,请自行替换

#include <stdio.h>
#include <stdint.h>
#include <cstring>
#include <malloc.h>
extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include "libavutil/imgutils.h"
};

int main(int argc, char **argv){
    av_register_all();
    const int width = 400, height = 400;
    enum AVPixelFormat src_pix_fmt = AV_PIX_FMT_BGR24, dst_pix_fmt = AV_PIX_FMT_YUV420P;
    FILE* fp = NULL;
    fopen_s(&fp, "sucai_rgb.rgb", "rb");
    uint8_t* rgbbuf = (uint8_t*)malloc(width * height * 3);
    fread(rgbbuf, width * height * 3, 1, fp);
    fclose(fp);


    AVFrame *pFrameYUV = av_frame_alloc();
    uint8_t *out_buffer = new uint8_t[avpicture_get_size(dst_pix_fmt, width, height)];
    //avpicture_fill是给pFrameYUV初始化一些字段,并且给填充data和linesize
    avpicture_fill((AVPicture *)pFrameYUV, out_buffer, dst_pix_fmt, width, height);

    AVFrame *rgbFrame = av_frame_alloc();

    avpicture_fill((AVPicture *)rgbFrame, rgbbuf, src_pix_fmt, width, height);

    SwsContext *sws_ctx = sws_getContext(
        width, height, src_pix_fmt,
        width, height, dst_pix_fmt,
        SWS_BILINEAR, NULL, NULL, NULL);
    /*
    int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[],
              const int srcStride[], int srcSliceY, int srcSliceH,
              uint8_t *const dst[], const int dstStride[]);
    srcSlice[],dst[]是输入输出图像数据各颜色通道的buffer指针数组
    srcStride[],dstStride[] 为输入输出图像数据各颜色通道每行存储的字节数数组
    srcSliceY 为从输入图像数据的第多少列开始逐行扫描,通常设为0
    srcSliceH 为需要扫描多少行,通常为输入图像数据的高度
    */
    // *(rgbFrame->linesize)--->3*width
    // *(pFrameYUV->linesize)-->width
    sws_scale(sws_ctx, rgbFrame->data, rgbFrame->linesize, 0, height, pFrameYUV->data, pFrameYUV->linesize);
    sws_freeContext(sws_ctx);

    FILE* fpout = NULL;
    fopen_s(&fpout, "yuv_out.yuv", "wb");
    fwrite(pFrameYUV->data[0], width * height, 1, fpout);
    fwrite(pFrameYUV->data[1], width * height / 4, 1, fpout);
    fwrite(pFrameYUV->data[2], width * height / 4, 1, fpout);

    fclose(fpout);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值