Доля растёт ровно: строка «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:
parent
e8cb3cc392
commit
d75596bca3
3 changed files with 61 additions and 1 deletions
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue