blob: 6af8d584906c6b2f4ab0fa1a493d8ad347ae6529 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
#!/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
|