我正在开发一个使用Media Foundation h264编码器对视频进行编码的应用。接收器编写器crashes on Windows 7在VRAM中具有RGB输入,说“0x8876086C D3DERR_INVALIDCALL”,因此我在GPU上实现了自己的RGB-> NV12转换,节省了60%以上的PCI Express带宽。
输入(NV12)和输出(h264)的媒体类型如下:
mt->SetUINT32( MF_MT_VIDEO_CHROMA_SITING, MFVideoChromaSubsampling_MPEG2 ); // Specifies the chroma encoding scheme for MPEG-2 video. Chroma samples are aligned horizontally with the luma samples, but are not aligned vertically. The U and V planes are aligned vertically.
mt->SetUINT32( MF_MT_YUV_MATRIX, MFVideoTransferMatrix_BT709 ); // ITU-R BT.709 transfer matrix.
mt->SetUINT32( MF_MT_VIDEO_NOMINAL_RANGE, MFNominalRange_0_255 ); // The normalized range [0...1] maps to [0...255] for 8-bit samples or [0...1023] for 10-bit samples.
mt->SetUINT32( MF_MT_TRANSFER_FUNCTION, MFVideoTransFunc_10 ); // Linear RGB (gamma = 1.0).
到目前为止,使用此公式可获得的最佳结果:
inline float3 yuvFromRgb(float3 rgba)
{
float3 res;
res.x = dot( rgba, float3( 0.182585880, 0.614230573, 0.0620070584 ) );
res.y = dot( rgba, float3( -0.121760942, -0.409611613, 0.531372547 ) );
res.z = dot( rgba, float3( 0.531372547, -0.482648790, -0.0487237722 ) );
res += float3( 0.0627451017, 0.500000000, 0.500000000 );
return saturate( res );
}
让我担心的是,该公式与我在互联网上阅读的所有内容,代码示例以及国际电联的正式规范相矛盾。
对于Y来说,公式很好,我采用了BT.709系数,并将其线性缩放以按照规范中的说明将[0..255]映射为[16..235]。亮度正常。
规范说我必须缩放U和V才能从[0..255]映射到[16..240]。但是,我的眼睛告诉我它不饱和。为了获得正确的颜色,我必须以另一种方式缩放U&V,从[0..255]缩放为[-8、255 + 8]。
为什么在h264编码和解码后,我需要缩放另一种方法以获得正确的颜色?此代码可以在其他人的计算机上工作吗?
最佳答案
问题是色度采样伪像。当我问这个问题时,我正在看彩色的控制台文本。
今天,我尝试编码更好的图像,即:使用该图像,很明显,这些标准中指定了正确的公式。
因此,这是正确的系数:
// Convert RGB color into ITU-R BT.709 YUV color
inline float3 yuvFromRgb( float3 rgb )
{
float3 res;
res.x = dot( rgb, float3( 0.18258588, 0.61423057, 0.06200706 ) );
res.y = dot( rgb, float3( -0.10064373, -0.33857197, 0.43921569 ) );
res.z = dot( rgb, float3( 0.43921569, -0.39894217, -0.04027352 ) );
res += float3( 0.06274510, 0.50196081, 0.50196081 );
return res;
}
他们仍然给我一个错误,但对于我的特定问题,可以接受0.39%的错误。
关于c++ - 将颜色从RGB转换为NV12,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52435591/