RGB24转成YV12,然后进行x264编码,图像失真解决思路
RGB24转成YV12,然后进行x264编码,图像失真
将采集到的RGB24转成YV12,然后进行x264编码,图像失真,图像为相册内的"失真"。
void HotRGB24_2_YV12(unsigned char* yv12,unsigned char* rgb24,int w,int h)
{
int iBufLen = w * h;
int i,j,vay,vau,vav;
unsigned char* cv; // 当前坐标的v(current v);
unsigned char* nv; // 在cv下一行的对应位置的 v;
unsigned char* cu; // 当前坐标的u(current u);
unsigned char* nu; // 在cu下一行的对应位置的 u;
unsigned char v01,v02,v11,v12,u01,u02,u11,u12; // 需要整合的相邻的4个象素 如下
unsigned char* vv = new unsigned char[iBufLen]; // 每个RGB单位对应的V!
unsigned char* uu = new unsigned char[iBufLen]; // 每个RGB单位对应的U!
// 按标准算法从RGB24计算出所有YUV
RGB24 * pRGB = (RGB24*)rgb24;
unsigned char* y = yv12; // 这里直接用 yuv 缓冲。。省了copy了。
unsigned char* v = vv;
unsigned char* u = uu;
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
//Y = 0.299R + 0.587G + 0.114B
//U = -0.147R - 0.289G + 0.436B
//V = 0.615R - 0.515G - 0.100B
//Y = round( 0.256788 * R + 0.504129 * G + 0.097906 * B) + 16
//U = round(-0.148223 * R - 0.290993 * G + 0.439216 * B) + 128
//V = round( 0.439216 * R - 0.367788 * G - 0.071427 * B) + 128
// 好象这个算法颜色正,而且是MSDN中列出的算法
vay = int(0.256788 * pRGB->r + 0.504129 * pRGB->g + 0.097906 * pRGB->b) + 16;
vau = int(-0.148223 * pRGB->r - 0.290993 * pRGB->g + 0.439216 * pRGB->b) + 128;
将采集到的RGB24转成YV12,然后进行x264编码,图像失真,图像为相册内的"失真"。
void HotRGB24_2_YV12(unsigned char* yv12,unsigned char* rgb24,int w,int h)
{
int iBufLen = w * h;
int i,j,vay,vau,vav;
unsigned char* cv; // 当前坐标的v(current v);
unsigned char* nv; // 在cv下一行的对应位置的 v;
unsigned char* cu; // 当前坐标的u(current u);
unsigned char* nu; // 在cu下一行的对应位置的 u;
unsigned char v01,v02,v11,v12,u01,u02,u11,u12; // 需要整合的相邻的4个象素 如下
unsigned char* vv = new unsigned char[iBufLen]; // 每个RGB单位对应的V!
unsigned char* uu = new unsigned char[iBufLen]; // 每个RGB单位对应的U!
// 按标准算法从RGB24计算出所有YUV
RGB24 * pRGB = (RGB24*)rgb24;
unsigned char* y = yv12; // 这里直接用 yuv 缓冲。。省了copy了。
unsigned char* v = vv;
unsigned char* u = uu;
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
//Y = 0.299R + 0.587G + 0.114B
//U = -0.147R - 0.289G + 0.436B
//V = 0.615R - 0.515G - 0.100B
//Y = round( 0.256788 * R + 0.504129 * G + 0.097906 * B) + 16
//U = round(-0.148223 * R - 0.290993 * G + 0.439216 * B) + 128
//V = round( 0.439216 * R - 0.367788 * G - 0.071427 * B) + 128
// 好象这个算法颜色正,而且是MSDN中列出的算法
vay = int(0.256788 * pRGB->r + 0.504129 * pRGB->g + 0.097906 * pRGB->b) + 16;
vau = int(-0.148223 * pRGB->r - 0.290993 * pRGB->g + 0.439216 * pRGB->b) + 128;