ffmpeg #crop #visual-artifacts
#ffmpeg #обрезка #визуальные артефакты
Вопрос:
Используя ffmpeg 4.4, я пытаюсь обрезать видео и фактически анимировать ширину во времени, используя sendcmd
crop
. Однако при этом артефакты (либо зеленый цвет, либо многократное перерисовывание видео по горизонтали / вертикали) отображаются за пределами обрезанной области.
Команды для репликации:
ffmpeg -f lavfi -i color=color=0xff0000:size=1280x720:rate=25 -filter_complex_script filter.txt -map [v] -t 4 out.mp4 -y
filter.txt
movie=video.mp4,sendcmd=c='0 [expr] crop w (N*10) 10',crop[v];
[0][v]overlay=x=n:eof_action=pass:eval=frame[v]
Есть идеи, как избавиться от этих артефактов?
Или, может быть, есть какой-то альтернативный фильтр ffmpeg, который выполнял бы обрезку с помощью eval=frame вместо sendcmd?
Комментарии:
1. Не могу протестировать сейчас, но поскольку ваше
w
выражение не ограничено, оно превышает ширину ввода. Измените его наmin((N*10) 10,iw)
2. привет, @Gyan, спасибо за предложение. К сожалению, iw / ih недоступен в sendcmd, но это все равно не решит проблему, поскольку она кажется неправильной еще раньше, до превышения ширины. Я действительно думаю, что sendcmd.w для обрезки сломан и сообщается о trac.ffmpeg.org/ticket/9454 на данный момент я использую альтернативу наложения — см. Мой собственный ответ
3. re: sendcmd, оставьте ‘[expr]` и используйте константы в фильтре обрезки.
4. Исключение
[expr]
insendcmd
не позволяет мне использовать iw в 4.4
Ответ №1:
В итоге я использовал небольшой взлом наложения для имитации обрезки:
ffmpeg -f lavfi -i color=color=0xff0000:size=1280x720:rate=25 -filter_complex_script overlay-filter.txt -map [v] -t 4 output/overlay.mp4 -y
fiter.txt
movie=input/video.mp4[v];
color=c=#000000:s=2x2:rate=25[c];
[c][v]scale2ref=flags=neighbor:eval=frame[c][v];
[c]scale=flags=neighbor:w=n*10 10:h=ih:eval=frame[c];
[c][v]overlay=x=(main_w-overlay_w)/2:eval=frame:eof_action=endall[v];
[0][v]overlay=x=n:eof_action=pass:eval=frame[v]
Сообщается о проблеме с обрезкой https://trac.ffmpeg.org/ticket/9454
Ответ №2:
Пока я отлаживаю происходящее, используйте этот график фильтрации.
movie=video.mp4,sendcmd=c='0 [expr] crop w (N*10) 10',crop,scale=eval=frame[v];
[0][v]overlay=x=n:eof_action=pass:eval=frame[v]
Комментарии:
1. Привет, Гьян, спасибо за ваши предложения. Я только что попытался добавить
scale=eval=frame
, что на моей стороне все еще появляются те же артефакты. Видите ли вы разницу при использовании 4.4 или другой версии?2. Кстати. Я только что исследовал
fillborders
как надежную альтернативу