You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NVIDIA SDK进行H265 HDR视频编码时的色彩映射问题

H265 HDR视频编码色彩传递异常问题

我正尝试使用NVIDIA SDK进行H265格式的HDR视频编码,但Windows Media Foundation目前暂不支持H265的10位输入,导致我无法向编码器正确传递色彩信息。

我做了一个测试:渲染包含三张单色彩画面的视频,分别对应RGB绿色值为1.0、2.0和3.0(最大值),对应D2D1_COLOR_F格式为{0,1,0,1}、{0,2,0,1}和{0,3,0,1}。

只有绿色值为3.0的画面显示正常(左侧为生成的视频画面,右侧为应显示的正确色彩):
绿色值3.0的编码结果

绿色值设为2.0时的结果:
绿色值2.0的编码结果

绿色值设为1.0时的结果偏差更明显:
绿色值1.0的编码结果

真实HDR图像的编码结果也存在色彩异常:
真实HDR图像编码结果

NVIDIA编码器接受AR30格式的色彩数据(即R、G、B各10位,Alpha通道2位且被忽略),而我的DirectX渲染器输出为GUID_WICPixelFormat128bppPRGBAFloat格式,我编写了如下转换代码:

struct fourx
{
    float r, g, b, a;
};

float*f = pointer_to_floats;
for (int x = 0; x < wi; x++)
{
    for (int y = 0; y < he; y++)
    {
        char* dx = (char*)f;
        dx += y * wi * 16;
        dx += x * 16;
        fourx* col = (fourx*)dx;
        DirectX::XMVECTOR v;
        DirectX::XMVECTORF32 floatingVector = { col->r,col->g,col->b,col->a };
        v = floatingVector;

        // float范围是0到max_lim
        float max_number = 3.0f; // 该值取自我的显示器白电平

        DirectX::PackedVector::XMUDECN4 u4 = {};
        col->r *= 1023.0f / max_number;
        col->g *= 1023.0f / max_number;
        col->b *= 1023.0f / max_number;

        u4.z = (int)col->r;
        u4.y = (int)col->g;
        u4.x = (int)col->b;

        u4.w = 0;
        DWORD* dy = output_pointer;
        dy += y * wi;
        dy += x;
        *dy = u4.operator unsigned int();
    }
}

我怀疑问题出在伽马校正或色彩映射环节,但不确定后续该如何排查解决。


内容的提问来源于stack exchange,提问作者Michael Chourdakis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 21:59:51