Анимированная обрезка FFmpeg создает артефакты

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] in sendcmd не позволяет мне использовать 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 как надежную альтернативу