#!/bin/sh # Quick video capture with dmenu # # dependencies: # - ffmpeg # - hacksaw: part # - xdotool: active # - xdg-user-dir # - dmenu # - clipp # # Usage: # vrec [command] [dir] # - if you do not provide a command it will launch dmenu. # - if you provide command and dir it will save the recording in dir # Commands: # - active: capture the active window # - part: select a part of the screen to record # - stop: stop an active recording # - full: record your full screen # - last: copy the latest recording's path to the clipboard # - audio: one of the prior recording commands but with sound # Recording: # there is a lock file # $1: x # $2: y # $3: width # $4: height # $5: output dir # $6: output name record_cmd() { if [ -f "$lock" ] then >&2 printf 'already recording, please stop recording first\n' exit 1 else touch "$lock" fi printf '%s\n' "$5/$6.mp4" herbe "vrec" "started recording." # use notification to know when recording started w=$(($3 + $3 % 2)) h=$(($4 + $4 % 2)) ffmpeg $audio \ -v 16 \ -r 30 \ -f x11grab \ -s "${w}x${h}" \ -i ":0.0+$1,$2" \ -preset slow \ -c:v h264 \ -pix_fmt yuv420p \ -crf 20 \ "$5/$6.mp4" rm -f "$lock" herbe "vrec" "stopped recording." & } lock="/tmp/record.lock" # Get recording directory if [ -d "$1" ] then dir="$1" shift else dir="$(xdg-user-dir VIDEOS)" [ -d "$dir" ] && dir="$dir/records" || dir="$HOME" fi # Set audio variable if [ "$1" = "-a" ] then ## Mic # audio="-f pulse -ac 2 -i default" ## Desktop audio="-f pulse -i alsa_output.pci-0000_00_1f.3.analog-stereo.monitor -ac 1" shift fi output="$(date +%F_%H-%M-%S)" if [ -z "${option:="$1"}" ]; then option="$(printf 'active\npart\nstop\nfull\naudio\nlast\n' | dmenu -c)" fi [ "$option" ] || exit 1 case "$option" in active) record_cmd $(xwininfo -id "$(xdotool getactivewindow)" | sed '/Absolute\|Width:\|Height:/!d;s/.*:\s*//' | tr '\n' ' ') "$dir" "$output" ;; part) hacksaw | { IFS=+x read -r w h x y [ "$x" ] || exit 1 # quit on ESC record_cmd $x $y $w $h "$dir" "$output" } ;; stop) pid="$(pgrep ffmpeg | xargs ps | grep 'x11grab' | awk '{print $1}')" [ "$pid" ] && kill "$pid" rm -f "$lock" herbe "vrec" "stopped recording." & ;; last) file="$(find "$dir" -type f -iname '*.mp4' -printf '%Ts %p\n' | sort -n -r | head -n 1 | cut -f 2- -d' ')" printf '%s' "$file" | clipp ;; full) record_cmd 0 0 1920 1080 "$dir" "$output" ;; audio) $0 -a; exit ;; help|*) >&2 printf 'record [dir] (active|part|stop|full|last|audio)\n' ;; esac