FFMPEG: возможно ли сместить выходные кадры из набора определенных кадров?

Я делаю некоторые перекодировки ffmpeg (4.1.3), извлекая определенные кадры из источника, в этом случае источником может быть либо фильм, либо последовательность изображений, и все работает нормально со следующей командой:

ffmpeg -i source.mov -vf select='eq(n\,2)+eq(n\,80)+eq(n\,150)' -vsync 0 -frame_pts 1 frames_%04d.jpeg

В случае исходной последовательности изображений мне нужно указать только начальный номер (поскольку мои кадры обычно начинаются со 100 или дальше):

ffmpeg -start_number 94 -i source.%04d.png -vf select='eq(n\,2)+eq(n\,80)+eq(n\,150)' -vsync 0 -frame_pts 1 frames_%04d.jpeg

Но проблема в том, что номера кадров, которые я получаю, совпадают с теми номерами, которые я запрашивал, которые требуются от фильтра выбора и начинаются с 0, в примере последовательности изображений вы можете видеть, что он фактически начинается с кадра 94, и технически фильмы воспроизводятся одинаково, их первый кадр такой же, как 94 в последовательности изображений, и мне бы хотелось иметь способ получить выходные числа, смещенные на определенное число, чтобы они соответствовали соответствующему «исходному» кадру. .

Я уже пытался добавить -start_number в конце перед выводом, который работает с обычными транскодами, но, похоже, не работает в сочетании с -frame_pts

Я хотел бы иметь возможность сделать что-то вроде этого:

ffmpeg -start_number 94 -i source.%04d.png -vf select='eq(n\,2)+eq(n\,80)+eq(n\,150)' -vsync 0 -start_number 94 -frame_pts 1 frames_%04d.jpeg

И получить кадр 96, 174 и 244 вместо 2, 80 и 150.

Есть ли способ сделать это ?

Заранее спасибо!

Ответы (2)

start_numberигнорируется с помощью frame_pts, поэтому требуется обходной путь. output_ts_offsetДоступна общая опция , но она требует метки времени, а не номера кадра, поэтому сначала мы устанавливаем частоту кадров входных изображений равной 1.

Использовать

ffmpeg -start_number 94 -framerate 1 -i source.%04d.png -vf select='eq(n\,2)+eq(n\,80)+eq(n\,150)' -vsync 0 -output_ts_offset 94 -frame_pts 1 frames_%04d.jpeg

Вероятно, вам просто нужно настроить точки с помощью: setpts=PTS+(94*TB). Вам нужно будет настроить это 94 для каждого другого стартового номера
Итак:

ffmpeg -start_number 94 -i source.%04d.png -filter_complex select='eq(n\,2)+eq(n\,80)+eq(n\,150)';setpts=PTS+(94*TB) frames_%04d.jpeg

Также vsyncнемного ненужно при выводе в jpg.

РЕДАКТИРОВАТЬ: Исправлено -Expression setpts, потому что я был глуп в первый раз. EDIT2: кажется, я даже не могу правильно прочитать вопрос... setptsСнова исправлено выражение -Expression

По умолчанию vsync для изображений — CFR, поэтому ffmpeg будет дублировать кадры, когда метки времени между выходными кадрами больше, чем ожидаемые для соседних кадров. vsync 0 необходим, чтобы отключить это.