ffmpeg / avconv - масштабированный вывод, делимый на 2


10

Я записываю свой рабочий стол с помощью avconv (он же ffmpeg), а затем масштабирую его до 720p.

Я недавно добавил в свой сценарий, чтобы они могли выбрать окно с xwininfo, и оно будет записывать это специально.

Однако, если выходной формат не делится на 2, кодер выходит из строя, и я не получаю свое видео.

Есть ли способ исправить это внутри ffmpeg, так что мне не нужно делать кучу ручной математики в bash для установки значений шкалы?

Можно ли заставить фильтр масштаба вычитать / добавлять один к ширине / высоте, если они неравномерны? (круглый?)

Можно ли применить другой фильтр после исходного масштаба, который мог бы достичь этого? (Это будет округлять видео с неравным входным размером и без масштабирования)

#!/bin/bash
avconv \
-f x11grab -r $fps -s $capturesize -i :0.0$offset \
-vcodec libx264 \
-vf scale=-1:720 \
-pre:v lossless_ultrafast \
-threads 4 \
-y $@

Некоторые старые списки рассылки предлагают round()функцию, которую вы можете использовать в фильтре, но я не могу понять синтаксис правильно. Если это scale=round(iw,2):round(ih,2)сработает, фильтр, примененный в конце, решит все мои проблемы одновременно. iwи ihне похоже на работу.

Ответы:


9

Поскольку деление на 2 иногда происходит в нечетных числах, оно должно быть:

-vf scale="trunc(oh*a/2)*2:720"

Это выполняет то, что нужно с -1:720синтаксисом (сохранить исходное соотношение сторон)


ceilВместо этого я использую, truncчтобы получить более высокий номер пары в случае 16: 9 480p
Фелипе Алькасибар

8

На самом деле фильтр может справиться с этим напрямую. Вам нужно только перейти -2вместо -1фильтра: например

-vf scale="-2:720"

Я был удивлен, узнав об этом в сообщении об ошибке 3 года назад .


У меня не сработало, какая минимальная версия поддерживает это?
letmaik

3
-2 у меня работает в ffmpeg версии 2.3.3
Ланс Нанек

7

После долгих экспериментов похоже, что следующий фильтр применяется после того, как другие фильтры масштаба округляют ширину и высоту до 2.

scale=trunc(in_w/2)*2:trunc(in_h/2)*2

Это в основном деление, округление, умножение, у меня просто не было правильного синтаксиса.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.