以YV12格式创建direct3d表面并以yuv420格式渲染视频帧会导致视频模糊。视频上似乎有烟雾。我认为这是因为yuv 420色彩空间格式的数据范围在Y平面为16-235,在U和V平面为16-240。它们不在0-255范围内。
我通过使用ffmpeg的sws_scale()函数将颜色格式更改为CPU中的BGRA,并以BGRA格式创建了Direct3d表面,然后显示的视频正常。但是由于色彩空间转换,CPU消耗非常高。有什么方法可以在GPU中进行颜色转换,或者还有另一种方法可以显示清晰的视频?
这就是我创建YV12表面的方式
m_pDirect3DDevice->CreateOffscreenPlainSurface(_srcWidth, _srcHeight, (D3DFORMAT)MAKEFOURCC('Y', 'V', '1', '2'), D3DPOOL_DEFAULT, &m_pDirect3DSurfaceRender, NULL);
在这里,我将摄像机视频帧数据的yuv平面复制到direct3d表面
BYTE* pict = (BYTE*)d3d_rect.pBits;
BYTE* Y = pY;
BYTE* V = pV;
BYTE* U = pU;
for (int y = 0; y < _srcHeight; y++)
{
memcpy(pict, Y, p1);
pict += d3d_rect.Pitch;
Y += p1;
}
for (int y = 0; y < _srcHeight >> 1; y++)
{
memcpy(pict, V, p3);
pict += d3d_rect.Pitch >> 1;
V += p3;
}
for (int y = 0; y < _srcHeight >> 1; y++)
{
memcpy(pict, U, p2);
pict += d3d_rect.Pitch >> 1;
U += p2;
}
感谢您的帮助,谢谢。