dotfiles/.scripts/screen-record.sh
foo-dogsquared 0ea18e3e9c Update the screen recording script
Since I'm more familiar with ffmpeg now, I thought of adding the option to follow the mouse and disabling it.

At this point, the notification for starting the recording has been moved into an option since it can be annoying at times.
2019-10-27 23:25:43 +08:00

122 lines
3.2 KiB
Bash

#!/bin/sh
# Records a part of the screen.
# Note this is a toggle command.
# There could only have one recording instance running at a time.
# Minimum requirements:
# awk - GNU Awk v5.0.1
# date - v8.31 GNU implentation
# ffmpeg - version n4.2.1; built with GCC; based from the Arch Linux repo
# slop - v7.4
# xwininfo - v1.1.5
# Having used `xwininfo`, it needs to have the legacy graphics stack (X11-based) on Linux
function error_cleanup() {
# rm "$pic_filepath"
echo "$red An error occurred on line $1\n $reset"
}
help_section="
Simply captures a recording with ffmpeg.
This is more reliable than OBS Studio (since I don't how to fully utilize it yet).
Usage: $0 [-o/--output <OUTPUT_PATH>]
Options:
-h, --help - show the help section
-o, --output <string> - the path of the output (default: '~/Videos')
--disable-cursor - disable rendering of the mouse cursor in the recording
--follow-mouse - enable following of the mouse in the center of the recording
--enable-notification - disable success notification
"
# setting up a exit trap in case of error
trap 'error_cleanup $LINENO' ERR
OUTPUT=${VIDEOS:-"$HOME/Videos"}
MOUSELESS=0
FOLLOW_MOUSE=0
ENABLE_NOTIFICATION=0
while [[ $# -gt 0 ]]
do
case $1 in
-h|--help)
echo "$help_section"
exit 0;;
-o|--output)
OUTPUT="$2"
shift
shift;;
--disable-cursor)
MOUSELESS=1
shift;;
--follow-mouse)
FOLLOW_MOUSE=1
shift;;
--enable-notification)
ENABLE_NOTIFICATION=1
shift;;
*)
shift;;
esac
done
# Constants
RECORDING_FILE="/tmp/fds-ffmpeg-currently-recording";
if [[ ! -f $RECORDING_FILE ]]; then
notify-send --expire-time=1500 "Screen capture selection" "Select a region to record.";
dimensions=$(slop -f "%x %y %w %h %g %i") || {
notify-send --expire-time=1500 "Screen capture failed" "Selection mode has been exited. Cancelling the recording.";
exit 1;
};
read -r pos_x pos_y width height grid id <<< $dimensions
date_format=$(date +%F-%H-%M-%S)
recording_command="ffmpeg -y -f x11grab "
if [[ $MOUSELESS == 1 ]]; then
recording_command+="-draw_mouse 0 ";
fi
if [[ $FOLLOW_MOUSE == 1 ]]; then
recording_command+="-follow_mouse centered ";
fi
recording_command+="-s ${width}x${height} -i :0.0+${pos_x},$pos_y ${OUTPUT}/$date_format.mkv -nostdin"
$recording_command &
PROCESS_ID="$!"
RETURN_CODE="$?"
sleep 1;
if [[ "$RETURN_CODE" != 0 ]]; then
notify-send "Recording start has failed";
exit 1;
fi
if [[ $ENABLE_NOTIFICATION == 1 ]]; then
notify-send --expire-time=1000 "Recording started successfully" "Process ID is at "$PROCESS_ID"";
fi
touch "$RECORDING_FILE";
echo "$PROCESS_ID" >> $RECORDING_FILE;
else
PROCESS_ID=$(<"$RECORDING_FILE")
kill $PROCESS_ID
if [[ $? != 0 ]]; then
notify-send "Recording stop failed" "There's a problem while trying to kill the process. Process ID is at $WINDOW_ID";
exit 1;
fi
notify-send "Recording stop successful"
rm "$RECORDING_FILE"
fi