ffmpeg - 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 转换,因为;
- 当使用 '-c:v copy' 将 Decklink 4K RGB 输入直接传输到 /dev/null 时,缓冲区欠载没有问题,
- 当输入 Decklink YUV 并给出“-raw_format yuv422p10”(在 ffmpeg 中似乎没有用于 decklink 的 YUV444 输入)时,我没有遇到欠载,并且在 4K 中一切正常。即使我设置了'-pix_fmt yuv444p16le'。
有什么想法可以使用来自 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
解决方案
推荐阅读
- c - 为什么我会从此结构中收到不兼容的指针类型警告?
- python - 你如何增加 matplotlib Line2D 艺术家的pickradius?
- java - 我正在尝试在 java 中打印一个链表数组,但出现“NullPointerException”错误
- azure - 集成 grafana 和 Azure 计费
- java - 如何使用变量来运行倒数计时器?
- ubuntu - 升级过程中无法重启 Ubuntu 18.04 中的 Samba
- quarkus - 忽略quarkus中的persistence.xml
- javascript - 如何将样式应用于 Material-Table 上的特定单元格?
- java - JSON 对象不正确并导致 HttpException
- python - 如何使用 sel 更改 xarray.DataArray 中的各个条目?