Плагин камеры Flutter записывает темные/черные видео на Android — предварительный просмотр в порядке, но записанное видеAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Плагин камеры Flutter записывает темные/черные видео на Android — предварительный просмотр в порядке, но записанное виде

Сообщение Anonymous »

Я разрабатываю приложение Flutter с функцией записи видео, используя официальный пакет камеры (версия ^0.10.6). Предварительный просмотр камеры выглядит идеально с правильной яркостью, но когда я записываю и воспроизвожу видео, оно значительно темнее (в некоторых случаях почти черное).
Окружающая среда
  • Flutter SDK: 3.8.1
  • пакет камеры: 0.10.6
  • Зависимости плагина камеры:

    Код: Выделить всё

    camera: ^0.10.6
    permission_handler: ^11.3.1
    video_player: ^2.7.0
    
Проблема
  • Предварительный просмотр камеры отображается с правильной яркостью
  • Записанное видео очень темное/черное
  • Проблема возникает как при нормальном, так и при слабом освещении условиях
  • Фотографии, сделанные одной и той же камерой, получаются нормально
Что я уже пробовал

1. Отключен механизм рендеринга крыльчатки

Добавлен в AndroidManifest.xml: Результат: улучшений нет

2. Проверенные разрешения

Все необходимые разрешения объявлены и предоставлены: Текущая реализация камеры
Инициализация камеры:

Код: Выделить всё

Future _initializeCamera() async {
if (!mounted) return;

setState(() {
_errorMessage = null;
_isInitializing = true;
});

try {
// Request camera permission
final hasPermission = await _mediaService.hasCameraPermission();
if (!hasPermission) {
final granted = await _mediaService.requestCameraPermission();
if (!granted) {
if (!mounted) return;
setState(() {
_errorMessage = 'Camera permission required';
_isInitializing = false;
});
return;
}
}

// Get available cameras
_cameras = await availableCameras();
if (_cameras.isEmpty) {
if (!mounted) return;
setState(() {
_errorMessage = 'No cameras found';
_isInitializing = false;
});
return;
}

// Select camera based on facing direction
final selectedCamera = _cameras.firstWhere(
(camera) => camera.lensDirection == _cameraFacing,
orElse: () => _cameras.first,
);

// Initialize camera controller
_cameraController = CameraController(
selectedCamera,
ResolutionPreset.high,
enableAudio: true,
);

await _cameraController!.initialize();
await _cameraController!.setFlashMode(_flashMode);

if (!mounted) return;
setState(() {
_isInitializing = false;
});
} catch (e) {
if (!mounted) return;
setState(() {
_errorMessage = 'Failed to initialize camera: $e';
_isInitializing = false;
});
}
}
Видеозапись:

Код: Выделить всё

Future _startVideoRecording() async {
if (_cameraController == null || !_cameraController!.value.isInitialized) return;

try {
// Enable torch mode if flash is on
if (_flashMode == FlashMode.always) {
await _cameraController!.setFlashMode(FlashMode.torch);
}

// Start recording
await _cameraController!.startVideoRecording();

if (!mounted) return;
setState(() {
_isRecording = true;
_recordingDuration = 0;
});

// Start timer for duration display
_recordingTimer = Timer.periodic(const Duration(seconds: 1), (timer) {
if (mounted) {
setState(() {
_recordingDuration++;
});
}
});
} catch (e) {
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Failed to start recording: $e')),
);
}
}

Future _stopVideoRecording() async {
if (_cameraController == null || !_isRecording) return;

try {
final video = await _cameraController!.stopVideoRecording();
_recordingTimer?.cancel();

// Reset flash mode
if (_flashMode == FlashMode.always) {
await _cameraController!.setFlashMode(FlashMode.off);
}

setState(() {
_isRecording = false;
_recordingDuration = 0;
});

if (!mounted) return;

// Navigate to preview screen
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>  CreatePostScreen(preSelectedMedia: [video]),
),
);
} catch (e) {
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Failed to stop recording: $e')),
);
}
}
Конфигурация камеры:

Код: Выделить всё

_cameraController = CameraController(
selectedCamera,
ResolutionPreset.high,  // Using high resolution
enableAudio: true,
);
Наблюдения
  • Предварительный просмотр показывает правильную яркость в режиме реального времени.
  • Отснятые фотографии работают идеально с правильной экспозицией.
  • Только видеозапись дает темный результат.
  • Темнота одинакова на протяжении всего видео (а не только в первых нескольких кадрах).
  • Увеличение яркости устройства не влияет на записываемое видео
Вопросы
  • Есть ли определенная настройка камеры или параметр инициализации, который мне не хватает для записи видео?
  • Должен ли я устанавливать значения экспозиции или ISO перед началом видеозаписи?
  • Известен ли Обход этой проблемы с помощью плагина камеры Flutter?
  • Существуют ли альтернативные пакеты камер, которые лучше справляются с записью видео?
Тестирование проводилось на модели телефона — Samsung M21 и Pixel 9


Подробнее здесь: https://stackoverflow.com/questions/797 ... s-fine-but
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»