首页 > 解决方案 > ffmpeg:4K RGB->YUV实时转换

问题描述

我正在尝试使用 Ffmpeg 从 Decklink 输入创建 hevc 实时流。目标是使用 10 位的高质量 HDR 流。Decklink SDI 输入输入 RGB 10 位,ffmpeg 使用 decklink 选项 -raw_format rgb10 很好地处理了这一点,ffmpeg 将其识别为“gbrp10le”。

我有一个基于 Nvidia pascal 的卡,它支持 yuv444 10 位(作为“yuv444p16le”),当使用“-c:v hevc_nvenc”时,auto_scaler 启动并转换为“yuv444p16le”,我猜这与转换相同给'-pix_fmt yuv444p16le'。

这在 1920x1080 分辨率下运行良好,但在 4096x2160 分辨率下,ffmpeg 无法保持实时 24 或 25 fps,并且我得到输入缓冲区溢出。罪魁祸首似乎是 ffmpeg swscale 中的 RGB->YUV 转换,因为;

有什么想法可以使用来自 Decklink 的 10 位 RGB 信号在 NVENC 中完成 4K hevc 吗?有没有办法让 NVENC 接受和使用 RGB 数据而无需先转换为 YUV?或者有没有办法用 cuda 或 scale_npp 过滤器转换 gbrp10le->yuv444p16le?我已经用 npp 和 cuda 编译了 ffmpeg,但我不知道我是否可以让它与 RGB 一起工作?每当我尝试执行 '-vf "hwupload_cuda"' 时,auto_scaler 就会启动并尝试在 cpu 上转换为 yuv,这又会造成欠载。

我想可能有帮助的另一件事是,是否有办法使 swscale cpu 过滤器(或者是否有另一个合适的过滤器?)使用多个线程?现在它似乎一次只使用一个线程,在我的 Ryzen 3950x(3.5GHz,32 个线程)上最高可达 99%。

ffmpeg 输出示例:

$ ffmpeg -loglevel verbose -f decklink -raw_format rgb10 -i "Blackmagic Card 1" -c:v hevc_nvenc -preset medium -profile:v main10 -cbr 1 -b:v 20M -f nut - > /dev/null
--
Stream #0:1: Video: r210, 1 reference frame, gbrp10le(progressive), 4096x2160, 6635520 kb/s, 25 tbr, 1000k tbn, 1000k tbc
--
[graph 0 input from stream 0:1 @ 0x4166180] w:4096 h:2160 pixfmt:gbrp10le tb:1/1000000 fr:25000/1000 sar:0/1
[auto_scaler_0 @ 0x4168480] w:iw h:ih flags:'bicubic' interl:0
[format @ 0x4166080] auto-inserting filter 'auto_scaler_0' between the filter 'Parsed_null_0' and the filter 'format'
[auto_scaler_0 @ 0x4168480] w:4096 h:2160 fmt:gbrp10le sar:0/1 -> w:4096 h:2160 fmt:yuv444p16le sar:0/1 flags:0x4
[hevc_nvenc @ 0x4139640] Loaded Nvenc version 11.0
--
Stream #0:0: Video: hevc (Rext), 1 reference frame (HEVC / 0x43564548), yuv444p16le(tv, progressive), 4096x2160 (0x0), q=2-31, 2000 kb/s, 25 fps, 51200 tbn
--
[decklink @ 0x40f0900] Decklink input buffer overrun!:02.52 bitrate= 30471.3kbits/s speed=0.627x

标签: ffmpeggpunvenc

解决方案


推荐阅读