视频监控 x264,rgb

本文分享了作者在视频监控编码过程中的实践经验,从初次接触视频监控的困惑到解决RGB到YUV转换的问题,再到使用x264编码RGB图像,详细记录了遇到的挑战及解决方案,包括图像失真和倒置问题的处理。

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

最近在做视频监控的时候,遇到了不少的问题。

由于第一次接触,像大家一样度娘上狂搜。度娘基本都是csdn,bitblt.

视频监控,当然要不断的截图,当时的想法比较简单,把图片保存后,用ffmpeg,进行压缩,遇到的问题是,图片非常的多。这个不符合要求。组长给我说,用x264,264是个什么东东,第一次听。脑子一阵乱,然后又一阵的乱搜,基本都是雷先生的demo, yuv格式的文件用x264编码,这里面不支持其它格式,坑啊,接下来的工作又是找rgb to yuv格式的转化。全是一头露水什么是yuv。整个流程基本就是 截图 ==>转化成bmp ==>转成yuv格式==> x264编码。这个过程是挺痛苦的,有很多细节要处理(bmp转yuv出现失真)。

在截图IDE窗口时,发现失真还挺严重的。所以决定找找是否x264支持对rgb的编码,让我高兴的是,宏中rgb的支持,感觉找到救星了。经度娘上确让,有2篇文章确认x264是对rgb编码的支持。剩下的就是动手一试,终于解决了rgbToYuv的缺陷。但是遇到一个问题,图像是倒置的。又一个坑。俗话说,万事开头难,第一个想法还是去度娘,这是我们开发一惯的思维,也是因为我懒的原因吧。

现在的度娘挺让我失望的。擦找不到。自己动手写吧。rgb的原理,存储结构。其实半天工作就ok了,主要的工作是在调试上。

这里贴上colorSpaceConver的代码。

DWORD ColorSpaceConver(LPBYTE byRGBdata, size_t RGBdatalen, DWORD dwWidth,DWORD dwHeight,DWORD dwBitCount)
{
	DWORD lLineBytes = (dwWidth * dwBitCount + 31) / 32 * 4;//字节对齐
	PTRGB rgbIn = NULL;
	PTRGB rgbOut = NULL;
	/*
	BITMAPFILEHEADER *bmpHeader =(BITMAPFILEHEADER*)byRGBdata;

	if (bmpHeader->bfType != 'MB')
	{
		return -1;
	}
	
	//BITMAPINFOHEADER *bmpinfo = (BITMAPINFOHEADER*)(byRGBdata + sizeof(BITMAPFILEHEADER));
	
	*/
	//图像数据首地址lpData
	size_t dwImageSize = dwWidth * dwHeight * 3;
	
	BYTE *pData =(BYTE *) new BYTE[dwImageSize];
	if (pData == nullptr)
	{
		return -1;
	}
	memset(pData, 0, dwImageSize);	
	memcpy_s(pData, dwImageSize, byRGBdata, dwImageSize);

	rgbIn = (PTRGB)pData;		
	rgbOut = (PTRGB)byRGBdata;

	DWORD dwLoopHeight = dwHeight - 1;
	DWORD dwOffset = 0;
	
	for (int i = 0; i < dwLoopHeight; ++i) {
		for (int j = 0; j < dwWidth; ++j)
		{
			TRGB rgbByte;
			rgbByte = rgbIn[(dwLoopHeight - i)*dwWidth + j]; //取得垂直方向上镜像的位置即可解决倒立问题
			
			dwOffset = i * lLineBytes + 3 * j;
			//memcpy_s(byRGBdata + dwOffset, dwImageSize, &rgbByte, sizeof(TRGB));
			rgbOut = (PTRGB)(byRGBdata + dwOffset);
			rgbOut->r = rgbByte.r;
			rgbOut->b = rgbByte.b;
			rgbOut->g = rgbByte.g;
			
		}
	}
	
	if (pData != NULL){
		
		delete[] pData;
		pData = nullptr;
	}
	
	return S_OK;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值