Flutter Camera插件在Android端录制视频画面过暗/黑屏,但预览正常
Flutter Camera插件在Android端录制视频画面过暗/黑屏,但预览正常
我之前在使用Flutter官方camera插件做视频录制功能时,也碰到过预览亮度正常但录制视频画面过暗的问题,尤其是在中低端Android设备上更明显。结合你提供的代码和排查步骤,给你几个针对性的解决方案,你可以逐一尝试:
一、强制同步相机曝光/对焦参数(最可能解决的方案)
camera插件的预览和视频录制在底层可能使用不同的会话配置,导致预览时的自动曝光参数没有同步到录制会话里。你可以在初始化相机后,手动设置曝光模式为自动,并在开始录制前触发一次曝光锁定,让相机先完成曝光调整再开始录制:
修改相机初始化代码:
在_initializeCamera方法中,相机初始化完成后添加以下代码:
await _cameraController!.setExposureMode(ExposureMode.auto); await _cameraController!.setFocusMode(FocusMode.auto); // 锁定拍摄方向,避免参数错乱 await _cameraController!.lockCaptureOrientation();
修改_startVideoRecording方法:
在调用startVideoRecording前,先等待相机完成曝光适配:
Future<void> _startVideoRecording() async { if (_cameraController == null || !_cameraController!.value.isInitialized) return; try { // 先让相机自动调整曝光,再锁定参数 await _cameraController!.setExposureMode(ExposureMode.auto); await Future.delayed(const Duration(milliseconds: 500)); // 给相机留足调整时间 await _cameraController!.setExposureMode(ExposureMode.locked); // 你的原有代码:开启torch等 if (_flashMode == FlashMode.always) { await _cameraController!.setFlashMode(FlashMode.torch); } // 开始录制 await _cameraController!.startVideoRecording(); // ... 后续代码不变 } catch (e) { // 异常处理不变 } }
二、调整分辨率预设(避免设备不兼容的分辨率)
你当前使用的ResolutionPreset.high,有些设备对这个预设的支持度不好,可能导致录制时的画面参数异常。可以尝试换成更具体的、设备兼容的分辨率:
_cameraController = CameraController( selectedCamera, ResolutionPreset.medium, // 先换成medium测试,或直接指定1080p enableAudio: true, videoQuality: VideoQuality.high, // 显式指定视频质量 );
如果还是不行,可以通过_cameraController!.availableResolutions获取设备支持的所有分辨率,手动选择一个1080p或720p的分辨率初始化相机。
三、升级camera插件版本
你当前使用的camera: ^0.10.6是2023年的旧版本,后续版本修复了很多Android端的视频录制bug。可以尝试升级到最新稳定版(比如camera: ^0.13.0+1),注意升级时同步调整依赖版本(比如permission_handler需要兼容),同时检查代码中的API变化(比如availableCameras的返回逻辑)。
四、针对三星/Pixel设备的特殊处理
- 三星设备:部分三星机型的相机硬件对第三方APP的录制权限有特殊限制,可在
AndroidManifest.xml中添加以下配置:<uses-feature android:name="android.hardware.camera.full" android:required="false" /> <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" /> - Pixel设备:Pixel的相机API对曝光参数的锁定逻辑不同,可在开始录制前重置曝光补偿:
await _cameraController!.setExposureOffset(0); // 重置曝光补偿 await _cameraController!.setExposureMode(ExposureMode.auto);
最后排查步骤
如果以上方法都无效,可以尝试:
- 用原生Android相机APP录制视频,对比亮度,排除硬件问题;
- 用camera插件官方的example代码测试视频录制,若官方示例正常,说明你的代码中某个逻辑干扰了录制参数。
希望这些方法能帮你解决问题,有任何进展可以随时反馈~




