其他分享
首页 > 其他分享> > FFmpeg学习:视频重采样

FFmpeg学习:视频重采样

作者:互联网

视频重采样

视频重采样参数

1.图像色彩空间转换;
2.分辨率缩放;
3.前后图像滤波处理

图像宽高、像素格式、尺寸转换算法

视频像素和尺寸转换api

【第一】创建格式转换上下文
SwsContext* video_swscontext = NULL;
【第二】格式变换上下文初始化

【函数原型】

struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat,
                                  int dstW, int dstH, enum AVPixelFormat dstFormat,
                                  int flags,
                                  SwsFilter *srcFilter, SwsFilter *dstFilter, const double *param);

【参数含义】

【第三】格式转换函数 sws_scale

【函数原型】

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[]);
const uint8_t *const srcSlice[];原数据存放的地址,一个数组至于取几个要看前面像素格式决定的,如果是YUV平面格式的就要取3位分别对应YUV,如果是RGB打包格式的那么就只取一位。
const int srcStride[], 一行字节数的大小,就是之前frame里面的linesize。
int srcSliceY  不用的
int srcSliceH 高度,不用宽度,因为使用的是内存对齐后的linesize了。
uint8_t *const dst[];转换后的目的数据存放的空间,是一个指针数组,因此要提前分配空间,
const int dstStride[] 输出的一行的大小
【第四】释放上下文
void sws_freeContext(struct SwsContext *swsContext);
使用举例
	//像素格式和尺寸转换上下文
	SwsContext *vctx = NULL;
	unsigned char *rgb = NULL;
//在解码后得到解码帧后进行转换的,注意内存的申请和格式转换
	//视频
	if (cc == vc)
	{
		vctx = sws_getCachedContext(
			vctx,	//传NULL会新创建
			frame->width, frame->height,		//输入的宽高
			(AVPixelFormat)frame->format,	//输入格式 YUV420p
			frame->width, frame->height,	//输出的宽高
			AV_PIX_FMT_RGBA,				//输入格式RGBA
			SWS_BILINEAR,					//尺寸变化的算法
			0, 0, 0);
		//if(vctx)
		//cout << "像素格式尺寸转换上下文创建或者获取成功!" << endl;
		//else
		//	cout << "像素格式尺寸转换上下文创建或者获取失败!" << endl;
		if (vctx)
		{
			//申请转换后数据存放的内存
			if (!rgb) rgb = new unsigned char[frame->width*frame->height * 4];
			//转换为对应存放格式,因为是要转换为打包的RGBA格式因此只需要一维,如果是YUV420P的则需要三维都需要内存地址的,否则会奔溃
			uint8_t *data[2] = { 0 };
			data[0] = rgb;
			int lines[2] = { 0 };
			lines[0] = frame->width * 4;//存放一行数据大小,
			re = sws_scale(vctx,
				frame->data,		//输入数据
				frame->linesize,	//输入行大小
				0,
				frame->height,		//输入高度
				data,				//输出数据和大小
				lines				//一行的大小
			);
			cout << "sws_scale = " << re << endl;
		}
	}

参考

封装格式api
FFmpeg-2、编解码及视频像素格式尺寸转换和音频重采样

标签:采样,视频,const,FFmpeg,int,frame,像素,格式,转换
来源: https://www.cnblogs.com/zjacky/p/16534816.html