ffmpeg bash подстановка нескольких наборов чисел друг за другом

Рейтинг: -1Ответов: 1Опубликовано: 14.01.2023

Есть такая команда для 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-х и более.

Ответы

▲ 0Принят
#Массив значений для замены: 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