You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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代码测试视频录制,若官方示例正常,说明你的代码中某个逻辑干扰了录制参数。

希望这些方法能帮你解决问题,有任何进展可以随时反馈~

火山引擎 最新活动