#!/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"