Я вполне уверен, что вы получаете точные значения. Это может помочь, если вы считаете поток MPEG потоком. В этом случае перед IBBPBB, который вы видите, обычно будет другая GOP. Может быть, что-то вроде этого (используя ту же запись, что и в оригинальном вопросе):
P(-3,-2) B(-2,-1) B(-1,0)
В основном B-кадры после I-кадров основаны на I-кадре и последнем P-кадре из предыдущего GOP.
Хотя логично начинать видео с этого:
Start GOP: IPBBPBBPBB...
Позже это должно быть
Start GOP: IBBPBBPBBPBB
Start GOP: IBBPBBPBBPBB
Start GOP: IBB...
Помните, что для декодирования любого B-кадра требуется полный кадр до и после него. Таким образом, каждая пара кадров B должна отображаться перед кадром I или P непосредственно перед ним в файле.
FFMPEG мог просто отказаться от «особого случая» первой GOP.
Поскольку первые два B-кадра не имеют предшествующего кадра для манипулирования, вы должны быть в состоянии безопасно отбросить их. Просто сдвиньте временные метки с первого I-кадра и настройте аудиопоток на ту же величину.
Будет ли это фактически приводить к потере кадров, будет зависеть от реализации FFMPEG, но в худшем случае вы теряете 83 миллисекунды (2 кадра при 24 кадрах в секунду).