diff options
author | tsxv478 <atci39@rambler.ru> | 2023-10-11 11:12:45 +0300 |
---|---|---|
committer | tsxv478 <atci39@rambler.ru> | 2023-10-11 11:12:45 +0300 |
commit | 67f16773001a0718fc7ad3a6e6caf2671e0134a8 (patch) | |
tree | 28c756a80d4466e8419d3b744028ad9428c7a474 | |
parent | 449a74c79edfdc9d8ff12e052f2d2ae19c428888 (diff) |
rec script
-rwxr-xr-x | ffrec | 111 |
1 files changed, 111 insertions, 0 deletions
@@ -0,0 +1,111 @@ +#!/bin/sh + +# Usage: +# `$0`: Ask for recording type via dmenu +# `$0 screencast`: Record both audio and screen +# `$0 video`: Record only screen +# `$0 audio`: Record only audio +# `$0 kill`: Kill existing recording +# +# If there is already a running instance, user will be prompted to end it. + +getdim() { xrandr | sed -n "s/\s*\([0-9]\+x[0-9]\+\).*\*.*/\1/p" ;} + +killrecording() { + recpid="$(cat /tmp/recordingpid)" + kill -15 "$recpid" + rm -f /tmp/recordingpid + notify-send "ffrec" "Stopped recording." + } + +screencast() { \ + ffmpeg -y \ + -f x11grab \ + -framerate 30 \ + -s "$(getdim)" \ + -i "$DISPLAY" \ + -r 24 \ + -use_wallclock_as_timestamps 1 \ + -f alsa -thread_queue_size 1024 -i default \ + -c:v h264 \ + -crf 0 -preset ultrafast -c:a aac \ + "$HOME/screencast-$(date '+%y%m%d-%H%M-%S').mp4" & + echo $! > /tmp/recordingpid + } + +video() { ffmpeg \ + -f x11grab \ + -framerate 30 \ + -s "$(getdim)" \ + -i "$DISPLAY" \ + -c:v libx264 -qp 0 -r 30 \ + "$HOME/video-$(date '+%y%m%d-%H%M-%S').mkv" & + echo $! > /tmp/recordingpid + } + +webcamhidef() { ffmpeg \ + -f v4l2 \ + -i /dev/video0 \ + -video_size 1920x1080 \ + "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" & + echo $! > /tmp/recordingpid + } + +webcam() { ffmpeg \ + -f v4l2 \ + -i /dev/video0 \ + -video_size 640x480 \ + "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" & + echo $! > /tmp/recordingpid + } + + +audio() { \ + ffmpeg \ + -f alsa -i default \ + -c:a flac \ + "$HOME/audio-$(date '+%y%m%d-%H%M-%S').flac" & + echo $! > /tmp/recordingpid + } + +askrecording() { \ + choice=$(printf "video\\nvideo selected\\naudio\\nscreencast\\nwebcam\\nwebcam (hi-def)" | dmenu -i -p "Select recording style:") + case "$choice" in + video) video;; + *selected) videoselected;; + audio) audio;; + screencast) screencast;; + webcam) webcam;; + "webcam (hi-def)") webcamhidef;; + esac + } + +asktoend() { \ + response=$(printf "No\\nYes" | dmenu -i -p "Recording still active. End recording?") && + [ "$response" = "Yes" ] && killrecording + } + +videoselected() +{ + slop -f "%x %y %w %h" > /tmp/slop + read -r X Y W H < /tmp/slop + rm /tmp/slop + + ffmpeg \ + -f x11grab \ + -framerate 30 \ + -video_size "$W"x"$H" \ + -i :0.0+"$X,$Y" \ + -c:v libx264 -qp 0 -r 30 \ + "$HOME/box-$(date '+%y%m%d-%H%M-%S').mkv" & + echo $! > /tmp/recordingpid +} + +case "$1" in + video) video;; + *selected) videoselected;; + audio) audio;; + screencast) screencast;; + kill) killrecording;; + *) ([ -f /tmp/recordingpid ] && asktoend && exit) || askrecording;; +esac |