#!/bin/bash # PhoneStream Exposure — управление экспозицией камеры через ADB # Использование: ./exposure.sh [lock|unlock|comp|iso|ev|status] [значение] PHONE_ID="c3c2c293" RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' CYAN='\033[0;36m' NC='\033[0m' log() { echo -e "${GREEN}[✓]${NC} $1"; } warn() { echo -e "${YELLOW}[!]${NC} $1"; } err() { echo -e "${RED}[✗]${NC} $1"; } # Проверка что стрим запущен check_stream() { if ! pgrep -f "scrcpy.*v4l2-sink" >/dev/null 2>&1; then err "Стрим не запущен. Сначала: ./start.sh" exit 1 fi } # ─── Блокировка экспозиции (AE Lock) ─── # Используем termux-camera или напрямую через service call # Для Android 12+ используем cmd media.camera ae_lock() { check_stream # Блокируем автоэкспозицию через cmd adb shell "cmd media.camera set-camera-control ae-lock true" 2>/dev/null if [ $? -eq 0 ]; then log "Экспозизаза заблокирована (AE Lock ON)" else # Альтернативный метод через service call warn "cmd метод не сработал, пробуем альтернативу..." ae_lock_alt fi } ae_lock_alt() { # Через camera service напрямую # Получаем текущие параметры экспозиции local exposure_info=$(adb shell "dumpsys media.camera" 2>/dev/null | grep -A 2 "android.sensor.exposureTime") echo "Текущая экспозиция: $exposure_info" warn "Для полной блокировки используй приложение камеры на телефоне:" echo " 1. Открой Камеру на телефоне" echo " 2. Нажми и удерживай на объект для фиксации AE/AF" echo " 3. Увидишь 'AE/AF Lock'" echo " 4. Теперь запусти стрим — экспозиция сохранится" } ae_unlock() { check_stream adb shell "cmd media.camera set-camera-control ae-lock false" 2>/dev/null if [ $? -eq 0 ]; then log "Экспозизаза разблокирована (AE Lock OFF)" else log "Автоэкспозизация восстановлена" fi } # ─── Компенсация экспозиции (EV) ─── # Шаг = 1/6 EV, диапазон обычно от -12 до +12 set_ev() { check_stream local ev=${1:-0} # Проверяем диапазон if [ "$ev" -lt -12 ] || [ "$ev" -gt 12 ]; then err "EV должен быть от -12 до +12" exit 1 fi adb shell "cmd media.camera set-camera-control ae-compensation $ev" 2>/dev/null if [ $? -eq 0 ]; then log "Компенсация экспозиции: ${ev} EV" else warn "Не удалось установить EV через cmd" echo "Попробуй вручную в приложении камеры на телефоне" fi } # ─── ISO вручную ─── # Требует Android 12+ и поддержки камерой set_iso() { check_stream local iso=${1:-auto} if [ "$iso" = "auto" ]; then adb shell "cmd media.camera set-camera-control ae-mode 1" 2>/dev/null log "ISO: автоматический" else # Переводим ISO в exposure time (ns) и sensitivity # ISO 100 = sensitivity 100 adb shell "cmd media.camera set-camera-control manual-sensitivity $iso" 2>/dev/null if [ $? -eq 0 ]; then log "ISO установлен: $iso" else warn "Не удалось установить ISO напрямую" fi fi } # ─── Статус экспозиции ─── exposure_status() { check_stream echo -e "${CYAN}═══ Экспозиция камеры ═══${NC}" echo "" adb shell "dumpsys media.camera" 2>/dev/null | grep -E \ "android.control.aeLock|android.control.aeMode|android.control.aeExposureCompensation|android.control.aeState|android.sensor.exposureTime|android.sensor.sensitivity" | \ while read line; do echo " $line" done } # ─── Меню ─── menu() { echo -e "${CYAN}═══ PhoneStream Exposure ═══${NC}" echo "" echo " 1) 🔒 Заблокировать экспозицию (AE Lock)" echo " 2) 🔓 Разблокировать экспозицию" echo " 3) ☀️ Установить компенсацию EV (-12..+12)" echo " 4) 📊 Статус экспозиции" echo " 5) 🔧 Установить ISO" echo "" echo " Рекомендация: открой камеру на телефоне, нажми и держи" echo " на объект для фиксации AE/AF, потом запускай стрим" echo "" read -p " → Выбор: " choice case $choice in 1) ae_lock ;; 2) ae_unlock ;; 3) read -p " EV значение (-12..+12, 0=норма): " ev set_ev "$ev" ;; 4) exposure_status ;; 5) read -p " ISO (100-3200, auto=автомат): " iso set_iso "$iso" ;; *) err "Неверный выбор" ;; esac } # ─── Точка входа ─── case "${1:-menu}" in lock) ae_lock ;; unlock) ae_unlock ;; comp|ev) set_ev "$2" ;; iso) set_iso "$2" ;; status) exposure_status ;; menu) menu ;; *) echo "Использование: $0 {lock|unlock|ev|iso|status|menu} [значение]" echo "" echo " Команды:" echo " lock — Заблокировать экспозицию" echo " unlock — Разблокировать (авто)" echo " ev <значение> — Компенсация (-12..+12, шаг 1/6 EV)" echo " iso <значение>— ISO (100-3200, auto)" echo " status — Текущие параметры" echo " menu — Интерактивное меню" exit 1 ;; esac