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"