ffmpeg bash подстановка нескольких наборов чисел друг за другом
Есть такая команда для ffmpeg как замена цвета:
ffmpeg -y -i "/storage/emulated/0/Download/in.gif" -vf "yadif,format=rgb24,lutrgb=r='if(eq(val,0),3,val)':g='if(eq(val,0),223,val)':b='if(eq(val,0),3,val)'" "/storage/emulated/0/Download/out.gif"
где
r='if(eq(val,0),3,val)
красный канал значение 0 заменить на 3
g='if(eq(val,0),3,val)
зеленый канал значение 0 заменить на 3
b='if(eq(val,0),3,val)
синий канал значение 0 заменить на 3
В примере выше меняем цвет 0 0 0 на цвет 3 3 3
Нужно осуществить в пределах одного скрипта несколько последовательных замен цвета, каждый раз подставляя результирующий файл выполнения команды как исходный файл для выполнения следующей команды.
То есть мне надо в in.gif заменить пять цветов:
конвертация in.gif в tmp01.gif 0 0 0 на 3 3 3
конвертация tmp01.gif в tmp02.gif 50 240 0 на 0 0 65
конвертация tmp02.gif в tmp03.gif 66 66 90 на 200 200 0
конвертация tmp03.gif в tmp04.gif 60 60 90 на 200 200 70
конвертация tmp04.gif в out.gif 100 100 100 на 0 0 0
Удаление tmp01.gif tmp02.gif tmp03.gif tmp04.gif
Количество замен цвета не всегда будет именно пять, поэтому желательно рабочий скрипт для количества замен от 2-х и более.
Ответы (1 шт):
#Массив значений для замены: 1,2,3 цифры заменяемые значения 4,5,6 на что меняем
needRep=( '0 0 0 3 3 3'
'50 240 0 0 0 65'
'255 255 255 0 1 2'
#... и т.д.
)
#Массив имен файлов где будет производится замена:
fileRep=( "/var/image/123.gif"
"/tmp/pic.1.gif"
#... и т.д.
)
#Функция вызова ffmpeg с подстановкой данных r g b / new r g b
funcff() {
ffmpeg -y -i "${pic}" -vf "yadif,format=rgb24,lutrgb=r='if(eq(val,${1}),${4},val)':g='if(eq(val,${2}),${5},val)':b='if(eq(val,${3}),${6},val)'" "${newPic}"
}
#Цикл по файлам
for ((a=0; a<${#fileRep[@]}; a++)); do
#Имя будет использоваться в функции
count=1
pic="${fileRep[$a]}"
newPic="${pic%.*}.tmp_${count}.${pic##*.}"
#Проверка на существование файла
[[ -f ${pic} ]] || { echo "Файл $pic не найден"; continue; }
#Генератор количества файлов
#Цикл по замене цвета
for ((i=0; i<${#needRep[@]}; i++)); do
#Увеличение генератора
count=$(($count+1))
#Вызов функции с параметрами из массива
funcff ${needRep[$i]}
pic="${newPic}"
[[ $(($count)) -eq ${#needRep[@]} ]] && {
newPic=${newPic/tmp_$(($count - 1))\./out.}
} || {
newPic=${newPic/tmp_$(($count - 1))\./tmp_$count.}
}
done
done
В данном виде при выполнение будут запущены следующие команды по порядку:
ffmpeg -y -i /var/image/123.gif -vf yadif,format=rgb24,lutrgb=r='if(eq(val,0),3,val)':g='if(eq(val,0),3,val)':b='if(eq(val,0),3,val)' /var/image/123.tmp_1.gif
ffmpeg -y -i /var/image/123.tmp_1.gif -vf yadif,format=rgb24,lutrgb=r='if(eq(val,50),0,val)':g='if(eq(val,240),0,val)':b='if(eq(val,0),65,val)' /var/image/123.tmp_2.gif
ffmpeg -y -i /var/image/123.tmp_2.gif -vf yadif,format=rgb24,lutrgb=r='if(eq(val,255),0,val)':g='if(eq(val,255),1,val)':b='if(eq(val,255),2,val)' /var/image/123.out.gif
ffmpeg -y -i /tmp/pic.1.gif -vf yadif,format=rgb24,lutrgb=r='if(eq(val,0),3,val)':g='if(eq(val,0),3,val)':b='if(eq(val,0),3,val)' /tmp/pic.1.tmp_1.gif
ffmpeg -y -i /tmp/pic.1.tmp_1.gif -vf yadif,format=rgb24,lutrgb=r='if(eq(val,50),0,val)':g='if(eq(val,240),0,val)':b='if(eq(val,0),65,val)' /tmp/pic.1.tmp_2.gif
ffmpeg -y -i /tmp/pic.1.tmp_2.gif -vf yadif,format=rgb24,lutrgb=r='if(eq(val,255),0,val)':g='if(eq(val,255),1,val)':b='if(eq(val,255),2,val)' /tmp/pic.1.out.gif