ffmpeg SwsContext像素格式转换BGRA转YUV420P
一、概述
ffmpeg提供了一个很有用的工具进行像素格式的转换。在实际的应用场景中可以根据需求来定制转换过程。
本例通过BGRA转YUV420P来展现这个过程
注意事项:
-
- 输入输出不能搞错,特别是输入的像素格式是什么,要求的输出像素格式是什么
- 如果输入和输出的宽高不一致像素格式一致,则是在进行裁剪操作,如果宽高和像素格式不一致,则进行裁剪+转换操作
- 注意其中的一个参数:linesize,linesize表示的是图像一行像素的字节数。如:YUV420P的linesize=width,RGBA的linesize=width*4,RGB24的linesize=width*3等。
二、代码示例
- 导入库
extern "C" { #include "libswscale/swscale.h" #include "libavutil/avutil.h" }
- 初始化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!"; }
- 开始转换
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); }
- 销毁
if (swsCtx) { sws_freeContext(swsCtx); swsCtx = nullptr; }
- 使用
encoder->scale((uint8_t*)data, frame); auto pkt = encoder->Encode(frame);
浙公网安备 33010602011771号