Возможно ли в FFMPEG изменять масштаб с течением времени?

Итак, используя фильтр наложения, можно изменить координаты x/y видео с течением времени, используя переменную «t». Например, overlay=x='if(gte(t,2), -w+(t-2)*20, NAN)':y=0можно использовать для начала скольжения наложенного элемента сверху слева направо вверх по прошествии 2 секунд.

Что я хочу сделать, так это использовать аналогичный принцип для масштабирования элементов. Я хотел бы иметь возможность изменять масштаб видео с течением времени, используя выражение (например scale=w=iw*t, или что-то в этом роде).

Это возможно?

когда я запускаю это выражение через -filter_complex, я получаю

Ошибка при вычислении выражения 'iw*t'.

Возможно, выражение для out_w:'iw*t' или для out_h:'-1' ссылается на самого себя.

Я чувствую, что есть большая вероятность, что мне нужно будет исправить FFMpeg, если я хочу получить эту функциональность, но я подумал, что сначала спрошу, чтобы узнать, знает ли кто-нибудь о таких вещах!

Кто-нибудь знает, как такая задача может быть выполнена?

Спасибо за помощь!

Сейчас это больше похоже на синтаксическую ошибку, но я не использовал эту функцию раньше, поэтому, к сожалению, я не могу здесь помочь.
Насколько я могу судить, мой синтаксис остается чистым и функциональным, пока я не введу переменную «t». Кроме того, он просто злится на меня и выдает ошибки, независимо от того, что я пытаюсь сделать: P
Так все работает, пока не добавишь *t?
*t, +t, все, что связано с «t». В любых других адаптируемых ко времени функциях в libavfilter вы делаете их динамическими, добавляя «t» к выражению. При этом введение «t» постоянно вызывает ошибки. Итак, мне интересно, есть ли лазейка, которую мне не хватает, или эта функция просто не существует :P
t не является определенной вещью, когда речь идет о наложенном фильтре.
Он определяется относительно координат x и y наложения. Вы можете эффективно использовать его в этих выражениях (см. документы). Однако у меня возникли проблемы с тем, чтобы заставить его работать со значениями шкалы.
Вы можете просто написать фильтр. wiki.multimedia.cx/index.php?title=FFmpeg_filter_howto
В прошлый раз, когда я просматривал выражения ffmpeg, мне было трудно найти, какие переменные доступны для выражений, в каком фильтре. Некоторые из них поддерживают t, некоторые нет. Повторное вычисление выражения и перенастройка фильтра для каждого кадра дорого обходятся некоторым фильтрам, поэтому я предполагаю, что они этого не делают.
@theophilus777, ты нашел ответ на свой вопрос?
@alexspeller масштабный фильтр не поддерживает редактирование временной шкалы, поэтому это невозможно напрямую. Я проверю, есть ли обходной путь.
@Mulvya Как насчет того, чтобы извлечь кадры, масштабировать их по мере необходимости и вернуть обратно?
Технически возможно с выходом H.264/5. Не знаю, как с этим справятся игроки/редакторы.
Честно говоря, это определенно может быть достигнуто путем написания внешнего приложения (скажем, на питоне), где коэффициенты масштабирования могут быть умножены на различные коэффициенты. Я посмотрю, что я могу сделать. Любые предложения приветствуются.
@Mulvya Нет, игроки не могут с этим справиться. Им нужен постоянный размер кадра. Кадры переменных должны быть дополнены , чтобы завершить кадр.
Не правда. Попробуйте следующее: закодируйте видео определенного размера, но сохраните его в формате .TS. Закодируйте другое видео с другим размером, но такими же настройками кодирования и сохраните его как .TS. Используйте демультиплексор или протокол concat FFmpeg для создания объединенного MP4. Играйте в VLC или Potplayer. Работает здесь. В Potplayer, если вы используете ярлык kbd для изменения размера окна проигрывателя до размера видео, он изменит размер в соответствии с новыми параметрами видео, если вы нажмете клавишу, когда воспроизведение переключится на 2-е видео. По сути, если ваш кодер/мультиплексор вставляет несколько SPS/PPS внутри полосы (т.е. в mdat), то некоторые проигрыватели поддерживают повторную инициализацию контекста.
@alexspeller Какова цель динамического масштабирования?

Ответы (1)

Насколько я понимаю, "t" оценивается один раз. Вы читали это: https://ffmpeg.org/ffmpeg-filters.html#zoompan ?

Документы ffmpeg:

9.170.1 Примеры

  • Увеличение до 1,5 и одновременное панорамирование в какое-то место рядом с центром изображения:

zoompan=z='min(zoom+0.0015,1.5)':d=700:x='if(gte(zoom,1.5),x,x+1/a)':y='if(gte(zoom, 1.5),у,у+1)':s=640x360

  • Увеличение до 1,5 и панорамирование всегда в центре изображения:

zoompan=z='min(zoom+0.0015,1.5)':d=700:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)'

  • То же, что и выше, но без паузы:

zoompan=z='min(max(zoom,pzoom)+0.0015,1.5)':d=1:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/ зум/2)'