ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

FFmpeg学习:视频重采样

2022-07-30 14:02:09  阅读:184  来源: 互联网

标签:采样 视频 const FFmpeg int frame 像素 格式 转换


视频重采样

视频重采样参数

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);

【参数含义】

  • int srcW, int srcH, enum AVPixelFormat srcFormat定义输入图像信息(宽、高、颜色空间(像素格式))
  • int dstW, int dstH, enum AVPixelFormat dstFormat定义输出图像信息宽、高、颜色空间(像素格式))。
  • int flags选择缩放算法(只有当输入输出图像大小不同时有效)
  • SwsFilter *srcFilter, SwsFilter *dstFilter分别定义输入/输出图像滤波器信息,如果不做前后图像滤波,输入NULL
  • const double *param定义特定缩放算法需要的参数(?),默认为NULL
【第三】格式转换函数 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有