Files
cam_control_android/FIX_VIDEO_STREAMING.md
2025-12-09 21:21:26 +09:00

4.1 KiB
Raw Permalink Blame History

ИСПРАВЛЕНЕи ВИДЕОПОТОКА - ВЫПОЛНЕНО

Проблема

На сервере логи показывали:

[VideoProcessor Process] ⚠️ NO FRAMES YET (waiting for 30.0s)

Приложение подключалось, но видео не отправлялось на сервер.

В logcat был видеть:

ImageAnalysisAnalyzer: Failed to acquire image
java.lang.IllegalStateException: maxImages (4) has already been acquired

Корневая причина

  • ImageAnalysis пытается обрабатывать каждый кадр в фоновом потоке
  • Конвертирует YUV → RGBA (слишком медленно!)
  • Переполняется буфер ImageReader (максимум 4 одновременно)
  • Останавливает весь видеопоток

Решение ( УЖЕ РЕАЛИЗОВАНО)

Удалена ImageAnalysis из bindToLifecycle() в CameraManager.kt

ДО ( неправильно):

cameraProvider?.bindToLifecycle(
    lifecycleOwner,
    cameraSelector,
    preview,
    imageCapture,
    imageAnalysis  // ❌ ПРОБЛЕМА!
)

ПОСЛЕ ( правильно):

cameraProvider?.bindToLifecycle(
    lifecycleOwner,
    cameraSelector,
    preview,       // ✅ Отправляет видео
    imageCapture   // ✅ Опционально захватывает кадры
)

Почему это работает

Preview напрямую отправляет видеокадры в процесс видеотрансляции:

📹 Камера
    ↓
🔄 Preview (автоматически отправляет в фоновый процесс)
    ↓
✅ Видеопоток на сервер

ImageAnalysis просто замедляет и блокирует этот процесс.

Что изменилось в коде

Файл: app/src/main/java/com/example/camcontrol/CameraManager.kt

  1. Строки 49-53: Комментарий объясняющий почему ImageAnalysis отключена
  2. Строки 60-67: bindToLifecycle теперь содержит только Preview + ImageCapture
  3. Строка 113: Удалена ссылка на несуществующий analysisExecutor

Установка исправления

Если код уже обновлен:

./gradlew assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apk

Или через Android Studio:

  1. Run → Run 'app' (Shift + F10)
  2. Выберите устройство
  3. Приложение переустановится с новым кодом

Проверка на устройстве

В приложении:

  1. Введите URL сервера
  2. Нажмите "Подключиться"
  3. На экране должна появиться камера
  4. На сервере должно появиться видео!

В logcat:

adb logcat | grep -i "camera\|streaming\|image"

Ищите:

✅ CameraManager: Camera started successfully with video streaming
✅ BLASTBufferQueue: onFrameAvailable the first frame is available
✅ [VideoProcessor] ✓ Started process for client

НЕ должно быть:

❌ ImageAnalysisAnalyzer: Failed to acquire image
❌ maxImages (4) has already been acquired
❌ [VideoProcessor] ⚠️ NO FRAMES YET

Результат ожидается

После установки исправления:

До После
Сервер: NO FRAMES YET Сервер: видео работает
logcat: Failed to acquire image logcat: нет ошибок
Видео не идёт Видео отправляется в реальном времени

Время фикса: ~5 минут
Сложность: Простая (удаление, а не добавление)
Статус: ЗАВЕРШЕНО И ГОТОВО К ИСПОЛЬЗОВАНИЮ