mirror of
https://github.com/foo-dogsquared/dotfiles.git
synced 2025-01-31 04:57:57 +00:00
0ea18e3e9c
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.
122 lines
3.2 KiB
Bash
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 |