ffmpeg 与 NVENC - 延迟太高

ffmpeg 与 NVENC - 延迟太高

我有一个 2560x1440 的摄像头,通过以太网连接,我无法获得足够低的延迟来正常使用。使用 Quadro P2000 时,延迟约为 10 秒,但使用我的 Ryzen 3900X,我可以获得相同的质量,但延迟不到 1 秒。ffmpeg 版本 3.4.8-0ubuntu0.2我正在使用一款名为 Shinobi 的软件,这是触发的 ffmpeg 命令:

/usr/bin/ffmpeg
  -progress pipe:5
  -use_wallclock_as_timestamps 1
  -analyzeduration 1000000
  -probesize 1000000
  -fflags +igndts
  -rtsp_transport tcp
  -hwaccel cuvid
  -c:v hevc_cuvid
  -loglevel warning
  -i rtsp://cam:[email protected]:554/live
  -strict
  -2
  -an
  -c:v hevc_nvenc
  -crf 1
  -movflags +frag_keyframe+empty_moov+default_base_moof
  -metadata title=Shinobi H.265 Stream
  -reset_timestamps 1
  -f hevc pipe:1

我自己将预设设置为无损,将 crf 设置为 1。我认为 hls_time 和 hls_list_size 与延迟无关,但我也设置了它们。

我尝试了许多不同的预设和 crf 值,例如 llhq 和 llhp,这确实有帮助,但延迟仍然约为 3-4 秒。同样,太多了。

我基本上希望延迟尽可能低,同时获得最高质量的流媒体(我们不是都这样吗?)。通过使用 Shinobi 的 MJPEG 预设,我可以获得相同质量的延迟小于 1 秒。

我可以尝试改变哪些选项?

编辑:我的相机的编解码器Codec: H264 - MPEG-4 AVC (part 10) (h264)Codec: MPEG-H Part2/HEVC (H.265) (hevc)

答案1

-delay:v 0在ffmpeg的编码器包装器中添加参数hevc_nvenc如下所示,然后重新测试:

/usr/bin/ffmpeg
  -progress pipe:5
  -use_wallclock_as_timestamps 1
  -analyzeduration 1000000
  -probesize 1000000
  -fflags +igndts
  -rtsp_transport tcp
  -hwaccel cuvid
  -c:v hevc_cuvid
  -loglevel warning
  -i rtsp://cam:[email protected]:554/live
  -strict
  -2
  -an
  -c:v hevc_nvenc
  -delay:v 0 
  -crf 1
  -movflags +frag_keyframe+empty_moov+default_base_moof
  -metadata title=Shinobi H.265 Stream
  -reset_timestamps 1
  -f hevc pipe:1

文档:

延迟由传递给 FFmpeg 的 nvenc 的“delay”参数(内部称为async_depth)传播。FFmpeg 的nvenc.c 等待,直到缓冲了该数量的额外帧在发射任何帧之前,旨在支持并行和 1:N 编码场景。

分配的默认值是 INT_MAX,稍后会减少到初始化的 NVENC 表面的数量减一,当未设置/默认情况下,它本身的初始值为 4。

-delay:v 0可以通过设置修复输出延迟来覆盖此设置。

请参阅根据正在使用的 ffmpeg 构建版本,回答有关处理额外 NVENC 选项的问题。使用较新的 NVENC API(迄今为止)应该会提供较新的预设和可用性调整选项,并弃用较旧的速率控制方法。

相关内容