0

我想创建一个简单的视频播放器,可以在 HDR 电视上显示 HDR 视频。例如,这个“ LG Chess HDR ”视频。它采用 HEVC 编码,位深为 10 位,像素格式为 YUV420P10LE,具有 BT2020 颜色空间和 PQ 传递函数的元数据。

这篇 NVIDIA 文章中,我发现了下一篇:

显示驱动程序获取 scRGB 后台缓冲区,并将其转换为当前连接的显示器所期望的标准。一般来说,这意味着将颜色空间从 sRGB 原色转换为 BT。2020 初选,缩放到适当的水平,并使用 PQ 等机制进行编码。此外,如果显示连接需要,可能执行 RGB 到 YCC 之类的转换。

这意味着我的播放器应该在scRGB 颜色空间中渲染像素(线性编码,sRGB 原色,全范围是 -0.5 到刚好小于 +7.5)。所以我需要以某种方式从这个颜色空间中的源视频中获取帧,最好是 FP16 像素格式(半浮点,每个颜色通道 16 位)。我来到以下简单的管道将视频渲染为 HDR:

source HDR video in BT2020 color space with applied PQ -> [some video library] -> 
-> video frames with colors in scRGB color space -> [my program] ->
-> rendered video on HDR TV with applied conversions by display driver

我正在尝试使用 FFmpeg 作为这个库,但不明白如何从 scRGB 颜色空间中的源 HDR 视频中获取帧

我现在使用sws_scale FFmpeg 方法来获取帧并了解过滤器 API。但是我没有找到任何关于如何使用这些功能在不解析所有源视频的元数据并为它们创建自定义视频过滤器的情况下透明地获取 scRGB 帧的信息和帮助。

请告诉我如何使用 FFmpeg 在 scRGB 颜色空间中获取帧。有人可以告诉其他图书馆我可以做到吗?

4

1 回答 1

0

要么我错了,要么你钻研太多细节。据我所知,对于 UHD HDR 解码,过程与 SDR 相同 + 你应该发送metadata到 TV/Monitor。

如果是 PC,我相信您应该检查文档UHD MetadataNVAPI Functions部分。FP16 的东西可能来自 OpenGL 或 DirectX,可能与游戏和渲染有关,所以除非你重新发明轮子,否则你不应该使用这些格式(只有 10+bit yuv)。

希望有帮助。

于 2018-03-05T10:45:22.300 回答