19,468
社区成员
发帖
与我相关
我的任务
分享
BOOL CLibAvNormalDraw::Draw(HWND hWnd,BYTE * pY,BYTE * pU,BYTE * pV,int yWrap,int uWrap,int vWrap)
{
if(!threadIsRun)
g_event.SetEvent();
BYTE * dataY;
BYTE * dataU;
BYTE * dataV;
int i = 0;
int width = m_bDraw.Width(),height = m_bDraw.Height();
int height_half = height / 2, width_half = width / 2;
dataY = new BYTE[width * height];
dataU = new BYTE[width / 2 * height /2];
dataV = new BYTE[width / 2 * height /2];
//下面注释的代码是在网上找的,但是不对,执行到framesQ.push(av);就异常
////copy y
//for (i = 0; i < height; i++)
// memcpy(dataY + i * yWrap , pY + i * yWrap , width);
////copy u
//for (i = 0; i < height_half; i++)
// memcpy(dataU +i * uWrap , pU + i * uWrap , width_half);
////copy v
//for (i = 0; i < height_half; i++)
// memcpy(dataV + i * vWrap , pV + i * vWrap, width_half);
//这个也会出现异常
/*for (i=0; i<height; i++)
{
memcpy(dataY,pY + i * yWrap, width);
}
for (i=0; i<height_half; i++)
{
memcpy(dataU,pU + i * uWrap, width_half);
}
for (i=0; i<height_half; i++)
{
memcpy(dataV,pV + i * vWrap, width_half);
}*/
//拷贝YUV420数据到另外一个位置,这里前面可以播放大约1秒左右,然后就出现异常了
memcpy(dataY,pY,width * height);
memcpy(dataU,pU,width_half*height_half);
memcpy(dataV,pV,width_half*height_half);
AVFrameEx av;
av.outPutHWnd = hWnd;
av.pdataY = dataY;
av.pdataU = dataU;
av.pdataV = dataV;
mutex.Lock();
//加入到queue带渲染队列中
framesQ.push(av);
mutex.UnLock();
return true;
}
AVFrameEx av;
av.outPutHWnd = hWnd;
av.pdataY = dataY;
av.pdataU = dataU;
av.pdataV = dataV;
mutex.Lock();
//加入到queue带渲染队列中
framesQ.push(av);
mutex.UnLock();
,这种没问题,但是机器性能不够,播放720*1080P,因为屏幕是1920*1080的分辨率,所以输出的时候拉伸过,会有很明显的画面撕裂,怀疑是解码过快,在显示器渲染的时候,把该数据给覆盖了,导致的。