dmenurecord.sh 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #!/bin/sh
  2. # Usage:
  3. # `$0`: Ask for recording type via dmenu
  4. # `$0 screencast`: Record both audio and screen
  5. # `$0 video`: Record only screen
  6. # `$0 audio`: Record only audio
  7. # `$0 kill`: Kill existing recording
  8. #
  9. # If there is already a running instance, user will be prompted to end it.
  10. #updateicon() { \
  11. # echo "$1" > /tmp/recordingicon
  12. #pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}"
  13. # }
  14. killrecording() {
  15. recpid="$(cat /tmp/recordingpid)"
  16. # kill with SIGTERM, allowing finishing touches.
  17. kill -15 "$recpid"
  18. rm -f /tmp/recordingpid
  19. #updateicon ""
  20. #pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}"
  21. # even after SIGTERM, ffmpeg may still run, so SIGKILL it.
  22. sleep 3
  23. kill -9 "$recpid"
  24. exit
  25. }
  26. screencast() { \
  27. ffmpeg -y \
  28. -f x11grab \
  29. -framerate 60 \
  30. -s "$(xdpyinfo | grep dimensions | awk '{print $2;}')" \
  31. -i "$DISPLAY" \
  32. -f alsa -i default \
  33. -r 30 \
  34. -c:v h264 -crf 0 -preset ultrafast -c:a aac \
  35. "$HOME/screencast-$(date '+%y%m%d-%H%M-%S').mp4" &
  36. echo $! > /tmp/recordingpid
  37. #updateicon "⏺️🎙️"
  38. }
  39. video() { ffmpeg \
  40. -f x11grab \
  41. -s "$(xdpyinfo | grep dimensions | awk '{print $2;}')" \
  42. -i "$DISPLAY" \
  43. -c:v libx264 -qp 0 -r 30 \
  44. "$HOME/video-$(date '+%y%m%d-%H%M-%S').mkv" &
  45. echo $! > /tmp/recordingpid
  46. #updateicon "⏺️"
  47. }
  48. webcamhidef() { ffmpeg \
  49. -f v4l2 \
  50. -i /dev/video0 \
  51. -video_size 1920x1080 \
  52. "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" &
  53. echo $! > /tmp/recordingpid
  54. #updateicon "🎥"
  55. }
  56. webcam() { ffmpeg \
  57. -f v4l2 \
  58. -i /dev/video0 \
  59. -video_size 640x480 \
  60. "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" &
  61. echo $! > /tmp/recordingpid
  62. #updateicon "🎥"
  63. }
  64. audio() { \
  65. ffmpeg \
  66. -f alsa -i default \
  67. -c:a flac \
  68. "$HOME/audio-$(date '+%y%m%d-%H%M-%S').flac" &
  69. echo $! > /tmp/recordingpid
  70. #updateicon "🎙️"
  71. }
  72. askrecording() { \
  73. choice=$(printf "screencast\\nvideo\\naudio\\nwebcam\\nwebcam (hi-def)" | dmenu -i -p "Select recording style:")
  74. case "$choice" in
  75. screencast) screencast;;
  76. audio) audio;;
  77. video) video;;
  78. webcam) webcam;;
  79. "webcam (hi-def)") webcamhidef;;
  80. esac
  81. }
  82. asktoend() { \
  83. response=$(printf "No\\nYes" | dmenu -i -p "Recording still active. End recording?") &&
  84. [ "$response" = "Yes" ] && killrecording
  85. }
  86. case "$1" in
  87. screencast) screencast;;
  88. audio) audio;;
  89. video) video;;
  90. kill) killrecording;;
  91. *) ([ -f /tmp/recordingpid ] && asktoend && exit) || askrecording;;
  92. esac