Long ago, I posted the simple way to get a frame of a video using ffmpeg. I’ve been using that technique for a long time.
It can be a bit unwieldy for iteratively finding a specific frame, as when using a terminal you have to move the cursor to the time specification. So I wrote a very small wrapper script to put the time part at or towards the end:
#!/bin/bash
# f.sh - single frame
USAGE="f.sh infile timecode [outfile]"
if [ "$#" == "0" ]; then
echo "$USAGE"
exit 1
fi
if [ -e "$1" ]; then
video="$1"
else
echo "file not found: $1"
exit 1
fi
if [ ! -z "$2" ]; then
time="$2"
else
echo "Need timecode!"
exit 1
fi
# if we have a filename write to that, else imagemagick display
if [ ! -z "$3" ]; then
echo "ffmpeg -i \"$video\" -ss $time -vframes 1 -f image2 \"$3\""
ffmpeg -loglevel quiet -hide_banner -ss $time -i "$video" -vframes 1 -f image2 "$3"
else
echo "ffmpeg -i \"$video\" -ss $3 -vframes 1 -f image2 - | display"
ffmpeg -hide_banner -loglevel quiet -ss $time -i "$video" -vframes 1 -f image2 - | display
fi
Most of that is usage explanation, but broadly it has two modes:
- display an image (
f.sh video time
) - write an image (
f.sh video time image
)
It’s more convenient to use it, hit ? and amend the time than to move the cursor into the depth of an ffmpeg
command.
Pingback: Extract A Single Image From A Video Using FFMPEG – Bertie Baggio's Wonderland