193 lines
4.8 KiB
Bash
Executable File
193 lines
4.8 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
set -e
|
|
VIRTMON=virtmon
|
|
SC_FONT=${SC_FONT:-'WenQuanYi-Micro-Hei'}
|
|
PID_FILE="/tmp/recording.pid"
|
|
OUTPUT_DIR="/home/klesh/Videos"
|
|
|
|
_stop_recording() {
|
|
killall screenkey 2>/dev/null || true
|
|
if [ -f "$PID_FILE" ]; then
|
|
PID=$(cat "$PID_FILE")
|
|
[ -n "$PID" ] && kill -s 15 $PID || true
|
|
rm "$PID_FILE"
|
|
fi
|
|
}
|
|
|
|
_start_video_recording() {
|
|
_stop_recording
|
|
if [ "$#" -ne 5 ]; then
|
|
echo "expected x y w h fps , got $argv"
|
|
exit 1
|
|
fi
|
|
X=$1
|
|
Y=$2
|
|
W=$3
|
|
H=$4
|
|
FPS=${5:-30}
|
|
|
|
OUTPUT_FILE="$OUTPUT_DIR/screencast-$(date '+%y%m%d-%H%M-%S').mp4"
|
|
touch "$PID_FILE"
|
|
sleep 1
|
|
echo recording to $OUTPUT_FILE
|
|
# ffmpeg \
|
|
# -f x11grab -s $W'x'$H -i "$DISPLAY+$X,$Y" \
|
|
# -f alsa -i default \
|
|
# -r $FPS -c:v h264 -crf 0 -preset ultrafast \
|
|
# -c:a aac \
|
|
# $OUTPUT_FILE
|
|
ffmpeg \
|
|
-f x11grab -s $W'x'$H -i "$DISPLAY+$X,$Y" \
|
|
-f alsa -i default \
|
|
-r $FPS -c:v h264 -crf 0 -preset ultrafast \
|
|
-c:a aac \
|
|
$OUTPUT_FILE > /dev/null 2>&1 </dev/null &
|
|
echo "$!" > "$PID_FILE"
|
|
}
|
|
|
|
audio() {
|
|
_stop_recording
|
|
OUTPUT_FILE="$OUTPUT_DIR/audio-$(date '+%y%m%d-%H%M-%S').aac"
|
|
touch "$PID_FILE"
|
|
sleep 1
|
|
ffmpeg \
|
|
-f alsa -i default \
|
|
-c:a aac \
|
|
$OUTPUT_FILE > /dev/null 2>&1 </dev/null &
|
|
echo "$!" > "$PID_FILE"
|
|
echo $OUTPUT_FILE
|
|
}
|
|
|
|
theend() {
|
|
notify-send "recording ended"
|
|
_stop_recording
|
|
}
|
|
|
|
prepare() {
|
|
# wanted size
|
|
WW=${1:-1920}
|
|
WH=${2:-1080}
|
|
|
|
# actual size
|
|
# 0: +*DP-1 3440/797x1440/333+0+0 DP-1
|
|
# resolution / physical
|
|
WHXY=$(xrandr --listmonitors | awk '$2 ~ /\*/ {
|
|
split($3, WHXY, /x|+|\//)
|
|
match($2, /\*(.+)$/, name)
|
|
print WHXY[1] " " WHXY[2] " " WHXY[3] " " WHXY[4] " " WHXY[5] " " WHXY[6] " " name[1]
|
|
}')
|
|
W=$(echo "$WHXY" | awk '{print $1}')
|
|
PW=$(echo "$WHXY" | awk '{print $2}')
|
|
H=$(echo "$WHXY" | awk '{print $3}')
|
|
PH=$(echo "$WHXY" | awk '{print $4}')
|
|
X=$(echo "$WHXY" | awk '{print $5}')
|
|
Y=$(echo "$WHXY" | awk '{print $6}')
|
|
NAME=$(echo "$WHXY" | awk '{print $7}')
|
|
|
|
# rest size
|
|
RW=$(( $W - $WW ))
|
|
RH=$(( $H - $WH ))
|
|
if [ "$RW" -lt 0 ] && [ "$RH" -lt 0 ]; then
|
|
return 0
|
|
fi
|
|
|
|
# adjust rest size, either split horizontally or vertically
|
|
# physical size for wanted monitor
|
|
PWW=$(echo "scale=3; r = $WW / $W * $PW; scale=0; r / 1" | bc)
|
|
PWH=$(echo "scale=3; r = $WH / $H * $PH; scale=0; r / 1" | bc)
|
|
if [ "$RW" -gt 0 ]; then
|
|
# horizontally
|
|
PRW=$(( $PW - $PWW ))
|
|
PRH=$PH
|
|
RH=$H
|
|
RX=$WW
|
|
RY=0
|
|
fi
|
|
# echo WW $WW
|
|
# echo PWW $PWW
|
|
# echo WH $WH
|
|
# echo PWH $PWH
|
|
# echo X $X
|
|
# echo Y $Y
|
|
# echo RW $RW
|
|
# echo PRW $PRW
|
|
# echo RH $RH
|
|
# echo PRH $PRH
|
|
# echo RX $RX
|
|
# echo RY $RY
|
|
# exit
|
|
|
|
# create virtual monitors
|
|
echo xrandr --setmonitor $VIRTMON-1 "${WW}/${PWW}x${WH}/${PWH}+0+0" $NAME
|
|
echo xrandr --setmonitor $VIRTMON-2 "${RW}/${PRW}x${RH}/${PRH}+${RX}+${RY}" none
|
|
echo nitrogen --restore
|
|
}
|
|
|
|
finish() {
|
|
xrandr --delmonitor $VIRTMON-1
|
|
xrandr --delmonitor $VIRTMON-2
|
|
nitrogen --restore
|
|
}
|
|
|
|
window() {
|
|
FPS=${1:-5}
|
|
|
|
notify-send "Please click the window that you want to record"
|
|
WININFO=$(xwininfo)
|
|
X=$(echo "$WININFO" | awk -F: '$1 ~ /Absolute upper-left X/ { print $2 }')
|
|
Y=$(echo "$WININFO" | awk -F: '$1 ~ /Absolute upper-left Y/ { print $2 }')
|
|
W=$(echo "$WININFO" | awk -F: '$1 ~ /Width/ { print $2 }')
|
|
H=$(echo "$WININFO" | awk -F: '$1 ~ /Height/ { print $2 }')
|
|
_start_video_recording $X $Y $W $H $FPS
|
|
}
|
|
|
|
desktop() {
|
|
FPS=${1:-30}
|
|
# INPUT 0: +*DP-1 3440/797x1440/333+2560+80 DP-1
|
|
# OUTPUT 2560 80 3440 1440
|
|
XYWH=$(xrandr --listmonitors | awk '$2 ~ /\*/ {
|
|
split($3, pos, /\/|\+|x/)
|
|
print pos[5] " " pos[6] " " pos[1] " " pos[3]
|
|
}')
|
|
# pacmd set-source-volume noechosource 52000
|
|
_start_video_recording $XYWH $FPS
|
|
|
|
}
|
|
|
|
togif() {
|
|
IN_FILE=$1
|
|
OUTPUT_FILE=$1
|
|
convert -set delay 10 -layers Optimize $IN_FILE -ordered-dither o8x8,23 +map $OUTPUT_FILE
|
|
}
|
|
|
|
cover() {
|
|
IN_FILE=$1
|
|
TEXT=$2
|
|
OUTPUT=${3:-'cover.png'}
|
|
GRAVITY=${4:-'center'}
|
|
|
|
X=50
|
|
if [ "$GRAVITY" = "50" ]; then
|
|
X=0
|
|
fi
|
|
magick convert $IN_FILE -thumbnail 1146x -background black -gravity $gravity -extent 1146x717 resized.png
|
|
magick convert resized.png \
|
|
-blur 0x8 \
|
|
-gravity $GRAVITY \
|
|
-fill black \
|
|
-pointsize 120 -font $SC_FONT \
|
|
-interline-spacing 20 \
|
|
-stroke '#e1e1e1' -strokewidth 40 \
|
|
-annotate +$X+0 "$TEXT" \
|
|
-stroke '#000000' -strokewidth 5 \
|
|
-annotate +$X+0 "$TEXT"\
|
|
$OUTPUT_FILE
|
|
}
|
|
|
|
if [ "$#" -eq 0 ]; then
|
|
desktop
|
|
else
|
|
$@
|
|
fi
|