dotfiles/.local/bin/screenrec.sh
2025-05-28 18:33:04 +02:00

76 lines
1.9 KiB
Bash
Executable File

#!/bin/bash
wf-recorder_check() {
if pgrep -x "wf-recorder" > /dev/null; then
pkill -INT -x wf-recorder
pkill -RTMIN+11 waybar
exit 0
fi
record
}
record() {
pkill -RTMIN+11 waybar
screencast_dir="$HOME/Screenrecord"
mkdir -p "$screencast_dir"
timestamp=$(date +"%Y-%m-%d-%H-%M-%S")
raw_file="$screencast_dir/screencast_$timestamp.mkv"
final_file="${raw_file%.*}.mp4"
# Grabar con wf-recorder (usa GPU Intel o AMD con vaapi)
wf-recorder --audio=VirtualSink.monitor -c h264_vaapi -d /dev/dri/by-path/pci-0000:65:00.0-render -f "$raw_file"
pkill -RTMIN+11 waybar
# Verificar que el archivo se grabó
if [ ! -s "$raw_file" ]; then
notify-send "❌ Grabación fallida: archivo vacío"
exit 1
fi
# Verificar si tenemos nvh264enc disponible
if ! gst-inspect-1.0 nvh264enc &>/dev/null; then
notify-send "⚠️ nvh264enc no disponible, usando x264enc por software"
video_encoder="x264enc"
else
video_encoder="nvh264enc"
fi
# Verificar si el archivo tiene audio
has_audio=$(ffprobe -loglevel error -select_streams a -show_entries stream=codec_type -of csv=p=0 "$raw_file")
if [ "$has_audio" = "audio" ]; then
audio_pipeline='d. ! queue ! audioconvert ! fdkaacenc ! queue ! mux.'
else
audio_pipeline=""
fi
# Elegir opciones específicas para el encoder
if [ "$video_encoder" = "nvh264enc" ]; then
video_encoder_cmd="d. ! queue ! nvh264enc bitrate=1500 ! queue ! mux."
else
video_encoder_cmd="d. ! queue ! $video_encoder ! queue ! mux."
fi
# Ejecutar transcodificación
switcherooctl -g 1 gst-launch-1.0 -v \
filesrc location="$raw_file" ! decodebin name=d \
$video_encoder_cmd \
$audio_pipeline \
mp4mux name=mux ! filesink location="$final_file"
# Verificar resultado
if [ ! -s "$final_file" ]; then
notify-send "❌ Error al convertir a mp4"
exit 1
fi
notify-send "✅ Grabación procesada"
rm "$raw_file"
}
wf-recorder_check
wl-copy $(~/.local/bin/pastebin_client.sh upload "$final_file" yes no)