优缺点
相比openGL shader转换来说,ffmpeg转换相对简单,但是效率相对较低
函数
1> sws_getContext:获取上下文
2> sws_getCachedContext:获取上下文,与sws_getContext区别在于内存空间由调用者自己管理
@param SwsContext *context:格式转换上下文
@param int srcW, int srcH, enum AVPixelFormat srcFormat:输入格式
@param int dstW, int dstH, enum AVPixelFormat dstFormat:输出格式
@param int flags:转换算法,如线性差值算法
@param SwsFilter *srcFilter:通常不用
@param SwsFilter *dstFilter:通常不用
@param const double **param:算法参数,不涉及可不指定
3> sws_scale:转换
@param SwsContext *context:格式转换上下文
@param const uint8_t *const srcSlice[]:源数据数组,二维数组数据
@param const int srcStride[]:一行数据的宽度,linesize
@param int srcSliceY:用不到
@param int srcSliceH:图像高度,遍历一行行数据
@param uint8_t *dst[]:输出数据地址
@param const int dstStride[]:输出数据长度
@return:输出的数据高度
4> sws_freeContext:释放上下文空间
示例程序
代码:
void transVideoPixel(SwsContext *ctx, AVFrame *frame)
{
ctx = sws_getCachedContext(ctx,
frame->width, frame->height, (AVPixelFormat)frame->format, // 输入宽高、格式
frame->width, frame->height, AV_PIX_FMT_BGRA, // 输出宽高、格式
SWS_BILINEAR, // 临近差值
0, 0, 0);
if (nullptr != ctx) {
// 一个像素四个字节
unsigned char *rgb = new unsigned char[frame->width * frame->height * 4];
uint8_t *dstData[2] = {0};
dstData[0] = rgb;
int lines[2] = {0};
lines[0] = frame->width * 4;
int retHeight = sws_scale(ctx,
frame->data, frame->linesize, 0, frame->height,
dstData, lines);
cout << "sws scaled retHeight = " << retHeight << endl;
delete []rgb;
rgb = nullptr;
}
}
输出: