You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Camera2前置摄像头编码画面倾斜翻倍:原因及解决问询

前置摄像头倾斜角度翻倍问题排查

背景

我正在开发一款基于Flutter/Kotlin的Android应用,通过Camera2调用前置摄像头拍摄,将H.264 NAL单元直接传入MediaCodec解码器实时显示,同时将编码帧保存为MP4文件。

问题现象

前置摄像头工作异常:当设备倾斜(如3°)时,实时画面应像后置摄像头那样反向倾斜以保持直立,但实际画面与摄像头倾斜方向相同,且倾斜角度翻倍(达6°)。该翻倍问题已在保存的MP4文件中确认,说明问题出现在编码阶段而非显示流水线。

已确认信息

  • 画面几何形态始终正确(比例正常、无畸变)
  • 仅倾斜角度数值错误——所有角度均翻倍
  • 与KEY_ROTATION无关,该参数仅处理90°步进旋转
  • 前置摄像头sensorOrientation=270,后置为90
  • 倾斜翻倍问题已固化在编码像素数据中(MP4文件可验证)
  • 切换TEMPLATE_RECORD与TEMPLATE_PREVIEW无差异
  • setFixedTransformHint(ROTATION_0)仅改变横屏表现,无法修复翻倍问题
  • 在Camera2与编码器Surface间插入GLES X翻转预处理无效果

编码器配置

val format = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, 1280, 720).apply {
    setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface)
    setInteger(MediaFormat.KEY_BIT_RATE, 4_000_000)
    setInteger(MediaFormat.KEY_FRAME_RATE, 30)
    setInteger(MediaFormat.KEY_LATENCY, 1)
    setInteger(MediaFormat.KEY_MAX_B_FRAMES, 0)
    setInteger(MediaFormat.KEY_BITRATE_MODE, MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_VBR)
}
val codec = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC)
codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)
encoderSurface = codec.createInputSurface()

Camera2捕获会话配置

val requestBuilder = cameraDevice!!.createCaptureRequest(CameraDevice.TEMPLATE_RECORD)
requestBuilder.addTarget(encoderSurface)
requestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO)
requestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, Range(fps, fps))
captureSession?.setRepeatingRequest(requestBuilder.build(), null, backgroundHandler)

解码器配置

val format = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, 1280, 720).apply {
    setInteger(MediaFormat.KEY_ROTATION, 270) // front camera portrait
}
codec.configure(format, holder.surface, null, 0)

Logcat配置确认

W/#####ENC: setupEncoderSession: cameraId=1 physical=null 1280x720@30 isFront=true sensorOrientation=270
W/#####ENC: startEncoderCapture: cameraId=1 isFront=true passedSensorOrientation=270 cam2SensorOrientation=270 fps=30
W/#####ROT: startLiveDecoder: KEY_ROTATION=270 isFront=true sensorOrientation=270 localCamStreamCorrection=270
W/#####DEC: INFO_OUTPUT_FORMAT_CHANGED: 1280x720 rotation=270 isLocal=true isFront=true

核心疑问

  1. 为何Camera2向MediaCodec编码器Surface写入的前置摄像头帧存在物理倾斜翻倍问题?
  2. 其他相机应用(如三星原生相机、Open Camera)如何规避该问题?
  3. 是否存在特定的捕获请求参数、会话配置或Surface属性可控制该转换逻辑?

测试设备

  • 三星Galaxy Tab A9+、Tab S11、Galaxy S24(均为Android 16)
  • 三星Galaxy S9(Android 10)

注:同硬件上的三星原生相机、Open Camera等应用可正常工作,画面随设备倾斜反向旋转以保持直立。

内容的提问来源于stack exchange,提问作者user2605793

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.10 08:04:53