Files
q-tools/av/ffmpeg-screencapture
2021-10-08 11:19:58 +03:00

156 lines
3.3 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
}
function animate() {
x0=$( tput cols )
pre=$( qolop eval "_qPos save; _qPos abs 1 $x0; _qCol R;" )
post=$( qolop eval "_qCol Z; _qPos restore;" )
while true; do
{
printf "%s*%s" "$pre" "$post"
sleep 1
printf "%s %s" "$pre" "$post"
sleep 1
} >&2
done
}
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 [[ $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
if [[ $delay -gt 0 ]]; then
echo Waiting.. for $delay seconds
sleep $delay
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;" )
animate &
animpid=$!
trap 'trap - SIGTERM && kill -- $animpid' EXIT SIGINT SIGTERM
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"