dmenurecord (2348B)
1 #!/bin/sh 2 3 # Usage: 4 # `$0`: Ask for recording type via dmenu 5 # `$0 screencast`: Record both audio and screen 6 # `$0 video`: Record only screen 7 # `$0 audio`: Record only audio 8 # `$0 kill`: Kill existing recording 9 # 10 # If there is already a running instance, user will be prompted to end it. 11 12 dir="$HOME/rec" 13 14 updateicon() { \ 15 echo "$1" > /tmp/recordingicon 16 pkill -RTMIN+11 i3blocks 17 } 18 19 killrecording() { 20 recpid="$(cat /tmp/recordingpid)" 21 # kill with SIGTERM, allowing finishing touches. 22 kill -15 "$recpid" 23 rm -f /tmp/recordingpid 24 updateicon "" 25 pkill -RTMIN+11 i3blocks 26 # even after SIGTERM, ffmpeg may still run, so SIGKILL it. 27 sleep 3 28 kill -9 "$recpid" 29 exit 30 } 31 32 screencast() { \ 33 ffmpeg -y \ 34 -f x11grab \ 35 -framerate 30 \ 36 -s $(xdpyinfo | grep dimensions | awk '{print $2;}') \ 37 -i $DISPLAY \ 38 -f alsa -i default \ 39 -r 30 \ 40 -c:v libx264rgb -crf 0 -preset ultrafast -c:a flac \ 41 "$dir/screencast-$(date '+%y%m%d-%H%M-%S').mkv" & 42 echo $! > /tmp/recordingpid 43 updateicon "⏺️🎙️" 44 } 45 46 video() { ffmpeg \ 47 -f x11grab \ 48 -s $(xdpyinfo | grep dimensions | awk '{print $2;}') \ 49 -i $DISPLAY \ 50 -c:v libx264 -qp 0 -r 30 \ 51 "$dir/video-$(date '+%y%m%d-%H%M-%S').mkv" & 52 echo $! > /tmp/recordingpid 53 updateicon "⏺️" 54 } 55 56 webcamhidef() { ffmpeg \ 57 -f v4l2 \ 58 -i /dev/video0 \ 59 -video_size 1920x1080 \ 60 "$dir/webcam-$(date '+%y%m%d-%H%M-%S').mkv" & 61 echo $! > /tmp/recordingpid 62 updateicon "🎥" 63 } 64 65 webcam() { ffmpeg \ 66 -f v4l2 \ 67 -i /dev/video0 \ 68 -video_size 640x480 \ 69 "$dir/webcam-$(date '+%y%m%d-%H%M-%S').mkv" & 70 echo $! > /tmp/recordingpid 71 updateicon "🎥" 72 } 73 74 75 audio() { \ 76 ffmpeg \ 77 -f alsa -i default \ 78 -c:a flac \ 79 "$dir/audio-$(date '+%y%m%d-%H%M-%S').flac" & 80 echo $! > /tmp/recordingpid 81 updateicon "🎙️" 82 } 83 84 askrecording() { \ 85 choice=$(printf "screencast\\nvideo\\naudio\\nwebcam\\nwebcam (hi-def)" | dmenu -i -p "Select recording style:") 86 case "$choice" in 87 screencast) screencast;; 88 audio) audio;; 89 video) video;; 90 webcam) webcam;; 91 "webcam (hi-def)") webcamhidef;; 92 esac 93 } 94 95 asktoend() { \ 96 response=$(printf "No\\nYes" | dmenu -i -p "Recording still active. End recording?") && 97 [ "$response" = "Yes" ] && killrecording 98 } 99 100 101 case "$1" in 102 screencast) screencast;; 103 audio) audio;; 104 video) video;; 105 kill) killrecording;; 106 *) ([ -f /tmp/recordingpid ] && asktoend && exit) || askrecording;; 107 esac