Доля растёт ровно: строка «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
10
README.md
10
README.md
|
|
@ -865,6 +865,16 @@ Wine с новой библиотекой не грузилось ничего.
|
|||
привычный RGB. Записанный по привычке код даёт цвет с переставленными
|
||||
красным и синим.
|
||||
|
||||
**Последняя строка блока о ходе работы обнуляет место.** ffmpeg шлёт ход
|
||||
блоками, и заканчивается блок строкой `progress=continue`, в которой
|
||||
места нет — она сообщает только, что работа продолжается. Разбор честно
|
||||
оставляет переданное число как было, поэтому передавать туда надо уже
|
||||
известное место, а не ноль. С нулём доля обнуляется в конце каждого
|
||||
блока: показатель стоит на месте и дёргается вверх лишь тогда, когда
|
||||
опрос попадёт между строкой со временем и этой — «висит на пяти
|
||||
процентах, потом скачет до семидесяти девяти». Сам ffmpeg при этом
|
||||
отдаёт ход безупречно ровно: блок каждые полсекунды, замерено.
|
||||
|
||||
**Разбор HEVC на процессоре — самое дорогое в сведении слоёв.** Не
|
||||
фильтры, как кажется: на десяти секундах 2688x1512 цепочка со сведением
|
||||
стоит 13.5 с, а без всяких фильтров — 12.7 с. Всё время уходит на разбор
|
||||
|
|
|
|||
|
|
@ -168,7 +168,17 @@ var
|
|||
begin
|
||||
if FStepSeconds <= 0 then
|
||||
Exit;
|
||||
Seconds := 0;
|
||||
{ Отсчёт начинается с уже известного места, а не с нуля.
|
||||
|
||||
ffmpeg шлёт ход работы блоками, и последняя строка блока —
|
||||
«progress=continue». Места в ней нет, она сообщает только, что работа
|
||||
продолжается, — и разбор оставляет переданное число как было. Начни
|
||||
мы с нуля, каждый блок заканчивался бы обнулением доли: показатель
|
||||
стоял бы на месте и дёргался вверх только в те мгновения, когда
|
||||
опрос попадал между строкой со временем и этой. Со стороны это
|
||||
выглядело как «висит на пяти процентах, потом скачет до
|
||||
семидесяти девяти». }
|
||||
Seconds := FStepFraction * FStepSeconds;
|
||||
AtEnd := False;
|
||||
if not ParseProgressLine(ALine, Seconds, AtEnd) then
|
||||
Exit;
|
||||
|
|
|
|||
|
|
@ -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