Вообще, под задержкой в zerolatency подразумевается разница между тем, когда кадр пришёл на вход энкодеру, и когда он его отдал. Задержка может быть вызвана, что декодер буферизует некоторое количество кадров. Насколько я помню, по умолчанию 40.
Без буферизации не получится кодировать B-кадры. Также, анализируя кадры из будущего, энкодер более точно распределяет битрейт между кадрами. Количество буферизуемых кадров контролируется параметром rc_lookahead.
Количество используемых по умолчанию B-кадров — 3, поэтому уменьшать их число или отключать стоит при необходимости в совсем малой задержке.
Также советую более подробно посмотреть на другие параметры, которые задаются через --tune zerolatency:
- zerolatency:
--bframes 0 --force-cfr --no-mbtree
--sync-lookahead 0 --sliced-threads
--rc-lookahead 0
Если же вам нужно уменьшить интервал между I-кадрами, насколько я понял, в ffmpeg это делается опцией -g. Но на задержке это не сказывается. Возможно, даже слегка её увеличивает, поскольку I-кадры сжимаются хуже.