Krolyxon
Commit 547543a

Branches

Refs →

dotfiles-x11.localbindmenurecord

123 lines · 2.6 KB · Bourne Again Shell (bash)

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
12getdim() { xrandr | grep -oP '(?<=current ).*(?=,)' | tr -d ' ' ;}
13
14updateicon() { \
15 echo "$1" > /tmp/recordingicon
16 pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}"
17 }
18
19killrecording() {
20 recpid="$(cat /tmp/recordingpid)"
21 kill -15 "$recpid"
22 rm -f /tmp/recordingpid
23 updateicon ""
24 pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}"
25 }
26
27screencast() { \
28 ffmpeg -y \
29 -f x11grab \
30 -framerate 30 \
31 -s "$(getdim)" \
32 -i "$DISPLAY" \
33 -r 24 \
34 -use_wallclock_as_timestamps 1 \
35 -f alsa -thread_queue_size 1024 -i default \
36 -c:v h264 \
37 -crf 0 -preset ultrafast -c:a aac \
38 "$HOME/screencast-$(date '+%y%m%d-%H%M-%S').mp4" &
39 echo $! > /tmp/recordingpid
40 updateicon "⏺️🎙️"
41 }
42
43video() { ffmpeg \
44 -f x11grab \
45 -framerate 30 \
46 -s "$(getdim)" \
47 -i "$DISPLAY" \
48 -c:v libx264 -qp 0 -r 30 \
49 "$HOME/video-$(date '+%y%m%d-%H%M-%S').mkv" &
50 echo $! > /tmp/recordingpid
51 updateicon "⏺️"
52 }
53
54webcamhidef() { ffmpeg \
55 -f v4l2 \
56 -i /dev/video0 \
57 -video_size 1920x1080 \
58 "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" &
59 echo $! > /tmp/recordingpid
60 updateicon "🎥"
61 }
62
63webcam() { ffmpeg \
64 -f v4l2 \
65 -i /dev/video0 \
66 -video_size 640x480 \
67 "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" &
68 echo $! > /tmp/recordingpid
69 updateicon "🎥"
70 }
71
72
73audio() { \
74 ffmpeg \
75 -f alsa -i default \
76 -c:a flac \
77 "$HOME/audio-$(date '+%y%m%d-%H%M-%S').flac" &
78 echo $! > /tmp/recordingpid
79 updateicon "🎙️"
80 }
81
82askrecording() { \
83 choice=$(printf "screencast\\nvideo\\nvideo selected\\naudio\\nwebcam\\nwebcam (hi-def)" | dmenu -i -p "Select recording style:")
84 case "$choice" in
85 screencast) screencast;;
86 audio) audio;;
87 video) video;;
88 *selected) videoselected;;
89 webcam) webcam;;
90 "webcam (hi-def)") webcamhidef;;
91 esac
92 }
93
94asktoend() { \
95 response=$(printf "No\\nYes" | dmenu -i -p "Recording still active. End recording?") &&
96 [ "$response" = "Yes" ] && killrecording
97 }
98
99videoselected()
100{
101 slop -f "%x %y %w %h" > /tmp/slop
102 read -r X Y W H < /tmp/slop
103 rm /tmp/slop
104
105 ffmpeg \
106 -f x11grab \
107 -framerate 30 \
108 -video_size "$W"x"$H" \
109 -i :0.0+"$X,$Y" \
110 -c:v libx264 -qp 0 -r 30 \
111 "$HOME/box-$(date '+%y%m%d-%H%M-%S').mkv" &
112 echo $! > /tmp/recordingpid
113 updateicon "⏺️"
114}
115
116case "$1" in
117 screencast) screencast;;
118 audio) audio;;
119 video) video;;
120 *selected) videoselected;;
121 kill) killrecording;;
122 *) ([ -f /tmp/recordingpid ] && asktoend && exit) || askrecording;;
123esac