Я пытаюсь выполнить пакетную операцию, чтобы извлечь определенные кадры из нескольких видеофайлов и сохранить их в формате PNG, используя скрипт bash.Я надеюсь сделать это, используя ffmpeg в скрипте bash, дополненный файлом csv, который содержит имя входного видео, конкретный номер кадра, который будет извлечен из входного видео, и выходное имя файла PNG.
Все видеофайлы и файл csv будут размещены в одной папке.Сценарий также может быть помещен туда, если необходимо.
Мой CSV - называется "select.csv" - в настоящее время принимает следующий формат (вход, выход, кадр):
mad0.m4v,mad0_out1,9950
mad0.m4v,mad0_out2,4500
mad1.m4v,mad1_out1,3200
МойТекущий скрипт, называемый "frame.sh", принимает следующую форму:
#!/bin/bash
OLDIFS=$IFS
IFS=“,”
SDIR=/Users/myuser/Desktop/f-input/
cd $SDIR;
while read input output frame
do
echo "$input"
echo "$output"
echo "$frame"
input1=$input
output1=$output
frame1=$frame
ffmpeg -i "$input1" -vf select='eq(n\,'"$frame1"')' -vsync 0
"$output1".png
done < $1
IFS=$OLDIFS
Это должно позволить мне запустить ./frame.sh select.csv
, чтобы затем обработать все соответствующие файлы в папке "f-input" на моем рабочем столе.и извлекать указанные кадры.
Я закончил выводом переменных, считанных из csv, чтобы они могли фактически использоваться как переменные и передавались в цикле в команде ffmpeg, потому что выполнение команды ffmpeg с использованием $ input, $ frame и$ output непосредственно после операции чтения только когда-либо завершал процесс в первой строке csv, не продвигаясь дальше.
По сути, я хотел бы, чтобы следующее фактически выполняло цикл по каждой записи csv, а не только в первой строке:
#!/bin/bash
OLDIFS=$IFS
IFS=“,”
SDIR=/Users/myuser/Desktop/f-input/
cd $SDIR;
while read input output frame
do
ffmpeg -i "$input" -vf select='eq(n\,'"$frame"')' -vsync 0 "$output".png
done < $1
IFS=$OLDIFS
Любой и все советы приветствуются!
Большое спасибо