dotfiles

Repositório dotfiles
git clone git://git.sivaldodavi.com/dotfiles.git
Log | Files | Refs | README

recorder (1959B)


      1 #!/bin/sh
      2 
      3 NAME="${1:-rec_$(date +%Y%m%d_%H%M%S)}"
      4 OUT="${NAME%.mkv}.mkv"
      5 
      6 cleanup() {
      7     printf "\nEncerrando...\n"
      8     wpctl set-mute @DEFAULT_AUDIO_SINK@ 0
      9     kill "$SCRCPY_PID" 2>/dev/null
     10     wait "$SCRCPY_PID" 2>/dev/null
     11     printf "Arquivo salvo com sucesso: %s\n" "$OUT"
     12 }
     13 
     14 trap cleanup EXIT INT TERM
     15 
     16 # Verifica/Instala apenas o scrcpy
     17 if ! command -v scrcpy >/dev/null 2>&1; then
     18     printf "📦 'scrcpy' não encontrado. Instalando...\n"
     19     doas apk add scrcpy || { printf "ERRO: Falha ao instalar scrcpy.\n" >&2; exit 1; }
     20 fi
     21 
     22 if ! adb devices | grep -q "device$"; then
     23     printf "ERRO: Nenhum celular detectado via ADB.\n"
     24     exit 1
     25 fi
     26 
     27 # Detecta resolução da tela principal automaticamente
     28 RESOLUTION=$(xrandr 2>/dev/null \
     29     | awk '/\*/ {print $1; exit}')
     30 
     31 if [ -z "$RESOLUTION" ]; then
     32     printf "Aviso: resolução não detectada, usando 1366x768.\n" >&2
     33     RESOLUTION="1366x768"
     34 fi
     35 
     36 printf "Resolução detectada: %s\n" "$RESOLUTION"
     37 printf "Iniciando microfone do celular...\n"
     38 
     39 scrcpy --no-video --no-control \
     40     --audio-codec=opus \
     41     --audio-buffer=200 \
     42     --audio-source=voice-performance \
     43     > /tmp/scrcpy.log 2>&1 &
     44 
     45 SCRCPY_PID=$!
     46 sleep 3
     47 
     48 if ! kill -0 "$SCRCPY_PID" 2>/dev/null; then
     49     printf "ERRO: Falha na inicialização do scrcpy. Log:\n" >&2
     50     cat /tmp/scrcpy.log >&2
     51     exit 1
     52 fi
     53 
     54 wpctl set-mute @DEFAULT_AUDIO_SINK@ 1
     55 printf "Alto-falante mutado (proteção contra microfonia ativada).\n"
     56 
     57 AUDIO_SINK=$(pactl get-default-sink 2>/dev/null)
     58 SINK_MONITOR="${AUDIO_SINK}.monitor"
     59 
     60 printf "Gravando (%s a 30fps) e áudio (%s)...\n" "$RESOLUTION" "$SINK_MONITOR"
     61 printf "Pressione 'q' para parar a gravação.\n\n"
     62 
     63 ffmpeg -hide_banner \
     64     -f x11grab -video_size "$RESOLUTION" -framerate 30 -i :0.0 \
     65     -f pulse -fragment_size 4096 \
     66     -i "$SINK_MONITOR" \
     67     -c:v libx264 -preset ultrafast -crf 23 \
     68     -c:a aac -b:a 192k \
     69     -af "aresample=async=1000" \
     70     -map 0:v:0 -map 1:a:0 \
     71     "$OUT"