Я отправил некоторое время, поддерживают старый сценарий удара MPV, который я нашел в сети, и я пытался изменить ее. Хорошо я все еще в нем. Проблема здесь, я пытаюсь использовать, если затем elif оператор для присвоения или файла =" $f", файл =" $filename", или повторяют ошибочный оператор и выход, при отсутствии файлов. файл =" $filename" и работа эха/выхода. однако файл =" $f" только циклично выполняет первый файл. предыдущие для действительно циклично выполняются, находит все файлы, поскольку это циклично выполняется через $dir, но это не передает новое имя файла к остальной части сценария, когда следующий цикл запускается.
"$f" является файлом, циклично выполненным в для, действительно циклично выполняют это, большая часть сценария находится в. но это, кажется, не влияет на файл =" $filename" всегда.
Я слушал дело оператор, но я не мог получить ту работу. код:
#!/bin/bash -x
while getopts ":d:f:s:i:n:g:v:" opt; do
case $opt in
d)
declare -r location="$OPTARG"
;;
f)
declare -r filename="$OPTARG"
;;
s)
declare -r startFrame="$OPTARG"
;;
i)
declare -r intervalScreenshots="$OPTARG"
;;
n)
declare -r numberScreenshots="$OPTARG"
;;
g)
declare -r videoHeight="$OPTARG"
;;
v)
declare -r verbose="TRUE"
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
if [[ -z "$location" ]] ; then
declare -r dir="."
else
declare -r dir="$location"
fi
for f in "$dir"/*.*
do
if [[ -z "$filename" ]] ;
then
declare -r file="$f"
elif [[ -f "$filename" ]] ;
then
declare -r file="$filename"
else
echo "No Files Found"
exit
fi
mkdir "$(basename "$file" | cut -d "." -f1)"
#start mpv
mpv --pause --quiet --no-osc --no-audio --osd-level=0 --no-border --vo=opengl --framedrop=no --scaler-lut-size=8 --scale=spline36 --cscale=spline36 --opengl-fbo-format=rgb16 --linear-scaling --geometry="$videoHeight" --screenshot-template=%F_%ws --screenshot-format=png --screenshot-png-compression=5 --screenshot-directory="$(basename "$file" | cut -d "." -f1)" "$file" --input-ipc-server=/tmp/mpvsocket > /dev/null 2>&1 &
# Informations grabbing
#declare -r filename="$(basename "${file}" )"
sleep 1
declare -r lastFrame="$(echo '{ "command": ["get_property", "estimated-frame-count"]}' | socat - /tmp/mpvsocket | cut -d":" -f2 | cut -d , -f1)"
sleep 1
declare -r fpsVideo="$(echo '{ "command": ["get_property", "estimated-vf-fps"]}' | socat - /tmp/mpvsocket | cut -d":" -f2 | cut -d , -f1)"
sleep 1
# Declare interval for each screenshot
if [[ -z "$intervalScreenshots" ]] ; then
declare diffFrame="$(awk "BEGIN {printf $lastFrame - $startFrame}")"
declare intervalFrame="$(awk "BEGIN {printf $diffFrame / $numberScreenshots}")"
else
declare -r intervalFrame="$intervalScreenshots"
fi
# Looping to take screenshots
declare currentFrame="$startFrame"
for i in $(seq 1 "$numberScreenshots") ; do
declare currentTime="$(awk "BEGIN {printf $currentFrame / $fpsVideo}")"
if [[ -n "$verbose" ]] ; then
printf 'Filename: %s\n\n' "$filename"
printf 'Current time: %.2f\n\n' "$currentTime"
printf 'Last frame: %s\n' "$lastFrame"
printf 'FPS: %s\n' "$fpsVideo"
printf 'Interval: %s\n' "$intervalFrame"
printf 'Screenshot: %02d\n\n\n' "$i"
fi
# Debug line
echo '{ "command": ["set_property", "pause", true] }' | socat - /tmp/mpvsocket
sleep 1
echo '{ "command": ["seek", '$currentTime', "absolute" ] }' | socat - /tmp/mpvsocket
sleep 1
echo '{ "command": ["screenshot", "window"] }' | socat - /tmp/mpvsocket
sleep 1
currentFrame="$(awk "BEGIN {printf $currentFrame+$intervalFrame}")"
done
echo '{ "command": ["quit"] }' | socat - /tmp/mpvsocket
done
Длинная история, короткая, мне не удалось понять, что объявляют, что-r сделал ее так, моя переменная не будет заменена в более поздних циклах. Благодаря steeldiver для указания, что наш. Не было действительно никакого смысла в создании его только для чтения во-первых. Я просто сделал это для непротиворечивости после использования для отладки некоторых старых (долго уводимый) до н.э математические функции.