Files
q-tools/av/ffmpeg-screencapture
2022-11-14 17:50:42 +02:00

135 lines
3.0 KiB
Bash
Executable File

#!/bin/bash
_help() {
echo 'Commands:
-o [filename] -s [size] -p [pos] -r [framerate] -d [delay] -i
default filename: '$filename'
default size: '$size'
default pos: '$pos'
default framerate: '$framerate'
default delay: '$delay'
-i for interactive selection using "slop"
--shell "[cmd]" to record current terminal, default cmd: bash
Hit "q" when finished (or exit shell in --shell)!
'
}
_helpexit(){
_help
exit
}
printf -v filename "grab-%(%FT%H-%M)T.mp4"
size=$( xdpyinfo | awk "/dimensions/{print \$2}" )
pos="0,0"
framerate=15
delay=0
interact=0
new_shell=0
shell_command=bash
for (( i=1; i<=$#; i++ )); do
[[ ${!i} = "-h"* ]] && _helpexit
[[ ${!i} = "--h"* ]] && _helpexit
[[ ${!i} = "help" ]] && _helpexit
done
for (( i=1; i<=$#; i++ )); do
j=$(( $i + 1 ))
if [[ ${!i} = "-o" ]]; then
filename="${!j}"
shift
fi
if [[ ${!i} = "-s" ]]; then
size="${!j}"
shift
fi
if [[ ${!i} = "-p" ]]; then
pos="${!j}"
shift
fi
if [[ ${!i} = "-r" ]]; then
framerate="${!j}"
shift
fi
if [[ ${!i} = "-d" ]]; then
delay="${!j}"
shift
fi
if [[ ${!i} = "-i" ]]; then
interact=1
fi
if [[ ${!i} = "--shell" ]]; then
new_shell=1
shell_command="${!j}"
shift
fi
done
shell_command="${shell_command:-bash}"
if [[ $delay -gt 0 ]]; then
echo Waiting.. for $delay seconds
sleep $delay
fi
if [[ $new_shell -eq 0 ]]; then
if [[ $interact -eq 1 ]]; then
slop=$( slop -b 10 -c 1.0,0.8,0.1,0.8 )
size=$( echo $slop | cut -d+ -f1 )
pos=$( echo $slop | cut -d+ -f2-3 )
pos=${pos/+/,}
else
convert -size 256x256 xc:red PNG8:- | timeout 5 feh --geometry $size+${pos//,/+} -
fi
else
eval $(xwininfo -id $(xdotool getactivewindow) |
sed -n -e "s/^ \+Absolute upper-left X: \+\([0-9]\+\).*/x=\1/p" \
-e "s/^ \+Absolute upper-left Y: \+\([0-9]\+\).*/y=\1/p" \
-e "s/^ \+Width: \+\([0-9]\+\).*/w=\1/p" \
-e "s/^ \+Height: \+\([0-9]\+\).*/h=\1/p" )
size="${w}x${h}"
pos="${x},${y}"
fi
echo Grabbing: $filename ${size}+$pos
rm -f "$filename"
if [[ $new_shell -eq 1 ]]; then
echo Starting to record in 5 seconds, or press enter
read -t 5 foo || true
ffmpeg \
-video_size $size \
-framerate $framerate \
-f x11grab \
-i $DISPLAY+${pos} \
-vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" \
-c:v libx264 -crf 23 -profile:v baseline -level 3.0 -pix_fmt yuv420p \
-an \
-movflags faststart \
-loglevel panic \
-hide_banner \
"$filename" &
ffpid=$!
clear
eval "$shell_command"
kill -INT $ffpid
trap - EXIT SIGINT SIGTERM
tput init
echo ""
else
ffmpeg \
-video_size $size \
-framerate $framerate \
-f x11grab \
-i $DISPLAY+${pos} \
-vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" \
-c:v libx264 -crf 23 -profile:v baseline -level 3.0 -pix_fmt yuv420p \
-an \
-movflags faststart \
-loglevel panic \
-hide_banner \
"$filename"
fi
echo "Saved to: $filename"