我有一个 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(迄今为止)应该会提供较新的预设和可用性调整选项,并弃用较旧的速率控制方法。