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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...