138 lines
2.9 KiB
Bash
Executable File
138 lines
2.9 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 to record current terminal
|
|
|
|
Hit "q" when finished!
|
|
'
|
|
}
|
|
_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
|
|
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
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
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
|
|
x0=$( tput cols )
|
|
pre=$( qolop eval "_qPos save; _qPos abs 1 $x0; _qCol R;" )
|
|
post=$( qolop eval "_qCol Z; _qPos restore;" )
|
|
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
|
|
bash
|
|
kill -INT $ffpid
|
|
trap - EXIT SIGINT SIGTERM
|
|
kill $animpid > /dev/null 2>&1
|
|
#animate_clear
|
|
printf "%s %s" "$pre" "$post" >&2
|
|
|
|
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"
|