Доля растёт ровно: строка «progress=continue» больше не обнуляет место

Показатель висел на пяти процентах, потом прыгал к семидесяти девяти,
потом сразу готово. Виноват не ffmpeg: замерено, что он отдаёт ход
безупречно ровно — блок каждые полсекунды, 7%, 14%, 20%, 27% и дальше
без единого скачка.

Блок заканчивается строкой «progress=continue», в которой места нет:
она сообщает только, что работа продолжается, и разбор честно оставляет
переданное число как было. Я передавал туда ноль, поэтому каждый блок
заканчивался обнулением доли. Показатель стоял и дёргался вверх лишь
тогда, когда опрос попадал между строкой со временем и этой.

Теперь отсчёт начинается с уже известного места — как это давно делает
сборка ролика. Проверено глазами на невидимом экране: шесть снимков
подряд через полторы секунды дают 54, 65, 74, 82, 91, 99 процентов,
полоса растёт вместе с числом.

Ловушку закрепляет проверка в tests/lfmcheck: «progress=continue» и
«progress=end» узнаются, но времени не трогают.
This commit is contained in:
4aiman 2026-10-01 16:24:59 +03:00
commit d75596bca3
3 changed files with 61 additions and 1 deletions

View file

@ -851,6 +851,45 @@ end;
ключ входной: ffmpeg принимает его только перед тем входом, к которому
он относится. Забыть его легко и незаметно — команда останется рабочей,
просто медленной. }
{ Разбор строк о ходе работы ffmpeg.
Ход приходит блоками, и последняя строка блока — «progress=continue».
Места в ней нет: она сообщает только, что работа продолжается. Разбор
обязан оставить переданное число как было, а вызывающий — передавать
туда уже известное место, а не ноль. Иначе каждый блок заканчивается
обнулением доли, и показатель стоит на месте, дёргаясь вверх лишь
тогда, когда опрос попадёт между строкой со временем и этой. }
procedure CheckProgressParsing;
var
Seconds: Double;
AtEnd: Boolean;
begin
WriteLn;
WriteLn('Разбор хода работы ffmpeg');
WriteLn;
Seconds := 0;
AtEnd := False;
CheckTrue('время узнаётся', ParseProgressLine('out_time_us=2500000',
Seconds, AtEnd));
CheckTrue('и разбирается верно: ' + FloatToStrF(Seconds, ffFixed, 8, 3),
Abs(Seconds - 2.5) < 0.001);
CheckTrue('«продолжается» — тоже знакомая строка',
ParseProgressLine('progress=continue', Seconds, AtEnd));
CheckTrue('и она не трогает время: ' + FloatToStrF(Seconds, ffFixed, 8, 3),
Abs(Seconds - 2.5) < 0.001);
CheckTrue('и не объявляет конец', not AtEnd);
CheckTrue('конец узнаётся', ParseProgressLine('progress=end',
Seconds, AtEnd) and AtEnd);
CheckTrue('время и тут осталось прежним',
Abs(Seconds - 2.5) < 0.001);
CheckTrue('незнакомая строка не узнаётся',
not ParseProgressLine('bitrate= 12.3kbits/s', Seconds, AtEnd));
end;
procedure CheckLayerHwDecode;
var
Layers: array[0..0] of TSegmentLayer;
@ -958,6 +997,7 @@ begin
CheckSplitAllTracks;
CheckGapTolerance;
CheckSourceRect;
CheckProgressParsing;
CheckLayerHwDecode;
CheckButtonClicks;