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

5.0 KiB
Raw Permalink Blame History

🎯 Краткое резюме исправлений

Проблема

Приложение подключается к серверу, показывает превью камеры, но видео НЕ отправляется на сервер.

Корень проблемы

В цепи обработки видео была разорванная связь между камерой и отправкой на сервер:

Camera → (capture frames?) → ViewModel → Server
                    ↑
                 РАЗОРВАНО!

Решение: 5 файлов исправлены

1. CameraManager.kt

  • Добавлено: ImageAnalysis для захвата видеофреймов
  • Метод: processFrame(imageProxy) преобразует фреймы в ByteArray
  • Callback: onFrameAvailable отправляет фреймы наружу

Строка кода:

// Добавлен ImageAnalysis к камере
val imageAnalysis = ImageAnalysis.Builder()
    .setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888)
    .build()
    .apply {
        setAnalyzer(analysisExecutor) { imageProxy ->
            processFrame(imageProxy)  // ← Обработка каждого фрейма
        }
    }

2. MainActivity.kt

  • Добавлено: Callback onFrame в startCamera()
  • Действие: Передает фреймы в ViewModel

Строка кода:

cameraManager.startCamera(
    lifecycleOwner,
    pv.surfaceProvider,
    onError = { err -> Log.e("CameraManager", "Camera error: $err") },
    onFrame = { frameData ->
        viewModel.sendVideoFrame(frameData)  // ← КЛЮЧЕВАЯ СТРОКА!
    }
)

3. WebSocketManager.kt

  • Заменено: Рефлексия → okio.ByteString API
  • Результат: Надежная отправка бинарных данных

Было (плохо):

val byteStringClass = Class.forName("okhttp3.ByteString")
val ofMethod = byteStringClass.getMethod("of", ByteArray::class.java)
val byteString = ofMethod.invoke(null, data)

Стало (хорошо):

import okio.ByteString.Companion.toByteString
val byteString = data.toByteString()
webSocket?.send(byteString)

4. StreamViewModel.kt

  • Улучшено: Логирование FPS и объема данных
  • Добавлены: Логи для отслеживания отправки видео

5. AndroidManifest.xml

  • Удалены: Ненужные разрешения (SMS, Audio, Location)
  • Результат: Проект компилируется без ошибок lint

Поток видео (ПОСЛЕ исправлений)

📷 Камера
  ↓
📊 CameraManager
  - ImageAnalysis захватывает фреймы
  - processFrame() → ByteArray
  - Callback onFrameAvailable
  ↓
📱 MainActivity
  - onFrame callback получает ByteArray
  - viewModel.sendVideoFrame(frameData)
  ↓
🔗 StreamViewModel
  - sendVideoFrame() → wsManager.sendBinary()
  - Логирует FPS и объем
  ↓
🌐 WebSocketManager
  - ByteString.toByteString()
  - webSocket.send()
  ↓
🖥️ Сервер (192.168.0.112:8000)
  - Получает видеофреймы
  - Отображает в браузере

Компиляция

BUILD SUCCESSFUL in 6s

97 actionable tasks: 15 executed, 82 up-to-date

Проверка в logcat

Ожидаемые логи при подключении:

CameraManager: Camera started successfully with video streaming
StreamViewModel: Connected to server
CameraManager: Processing 25 frames/5s, sending to server
WebSocket: Binary data sent: 12345 bytes
StreamViewModel: FPS: 25, Total bytes sent: 308640

Если видео не отправляется:

adb logcat | grep "Binary data sent"
# Если ничего нет → видео не отправляется

Что дальше?

Немедленно

  1. Запустите: ./gradlew installDebug
  2. Откройте приложение
  3. Введите параметры подключения
  4. Проверьте logcat

Для оптимизации (когда будет время)

  • Добавить H.264 видеокодирование (сейчас raw RGBA = 3МБ/сек)
  • Масштабирование фреймов перед отправкой
  • Переподключение при разрыве соединения

Файлы документации

  • 📄 VIDEO_STREAMING_FIX.md - Детальное объяснение проблемы
  • 📄 DEBUGGING_SUMMARY.md - Полный анализ и решение
  • 📄 TESTING_GUIDE.md - Инструкции для тестирования

Статус: Готово к тестированию
Дата: 2025-12-03
Проект: CamControl (Android Video Streaming)