Basically I'm Try to edit a bash script. To goal of the Script is to allow me to take a bunch of screenshot of videos by Simply launching it from terminal with only having to specify the Filename and the Number screenshot desired. I've worked out a few bugs but I'm having issues with getting MPV to assign the filename I want.
Here's the script as it stands currently.
#!/bin/bash
### Global variables
filename="$1"
### Error handling
if [ -z ${filename} ];
then echo "ERROR: No video file supplied. Please enter a video file as argument." exit 1;
fi
NUM_OF_SCREENSHOTS=9
if [ ! -z $2 ];
then NUM_OF_SCREENSHOTS=$2 echo "WARNING: Overwrite default number of screenshots to ${NUM_OF_SCREENSHOTS}." sleep 3s
fi
# Get the total length of the video in seconds.
# Use mplayer to display the info of the video and then get the value of ID_LENGTH, the total number of seconds of the video.
total_length=$(mplayer -identify -frames 0 -vc null -vo null -ao null "$filename" | grep ID_LENGTH | sed 's/ID_LENGTH=//' | sed 's/\..*//')
# Reference
# Remove 4 seconds from the video so that it doesn't take screenshot at the ends.
let total_length-=4
# time_slice: At which time interval should mplayer take screenshots.
let time_slice=${total_length}/${NUM_OF_SCREENSHOTS}
# time_at: When should mplayer take screenshots.
time_at=${time_slice};
# Looping to take screenshots.
for ((i=1; i <= NUM_OF_SCREENSHOTS ; i++))
do # Take the screenshot. #mplayer -loop 1 -nosound -frames 1 -ss ${time_at} -vo png:z=9 ${filename} mpv --quiet --no-audio --vo=image --screenshot-template="%f %n" --start=${time_at} --frames=1 "$filename" # Increment to the next time slice. let time_at+=${time_slice}
done 5 1 Answer
The script can't work in this way. The script is mostly fine, although you should make minor improvements (Use ShellCheck for that.)
The problem is, mpv uses an internal counter for the naming of the screenshot file (%n). And the counter is reseted at each pass of the loop.
The modified script below renames the file.
#!/usr/bin/env bash
### Global variables
filename="$1"
### Error handling
if [ -z "${filename}" ];
then echo "ERROR: No video file supplied. Please enter a video file as argument." exit 1;
fi
NUM_OF_SCREENSHOTS=9
if [ ! -z "$2" ];
then NUM_OF_SCREENSHOTS=$2 echo "WARNING: Overwrite default number of screenshots to ${NUM_OF_SCREENSHOTS}." sleep 3s
fi
# Get the total length of the video in seconds.
# Use mplayer to display the info of the video and then get the value of ID_LENGTH, the total number of seconds of the video.
total_length=$(mplayer -identify -frames 0 -vc null -vo null -ao null "$filename" | grep ID_LENGTH | sed 's/ID_LENGTH=//' | sed 's/\..*//')
# Reference
# Remove 4 seconds from the video so that it doesn't take screenshot at the ends.
let total_length-=4
# time_slice: At which time interval should mplayer take screenshots.
let time_slice=${total_length}/${NUM_OF_SCREENSHOTS}
# time_at: When should mplayer take screenshots.
time_at=${time_slice};
# Looping to take screenshots.
for ((i=1; i <= NUM_OF_SCREENSHOTS ; i++))
do # Take the screenshot. #mplayer -loop 1 -nosound -frames 1 -ss ${time_at} -vo png:z=9 ${filename} mpv --quiet --no-audio --vo=image --start=${time_at} --frames=1 "$filename" rename 's/^[0-9]+/out'"${time_at}"'/' 00000001.jpg # Increment to the next time slice. let time_at+=${time_slice}
done
exit 0