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
核心疑问
- 为何Camera2向MediaCodec编码器Surface写入的前置摄像头帧存在物理倾斜翻倍问题?
- 其他相机应用(如三星原生相机、Open Camera)如何规避该问题?
- 是否存在特定的捕获请求参数、会话配置或Surface属性可控制该转换逻辑?
测试设备
- 三星Galaxy Tab A9+、Tab S11、Galaxy S24(均为Android 16)
- 三星Galaxy S9(Android 10)
注:同硬件上的三星原生相机、Open Camera等应用可正常工作,画面随设备倾斜反向旋转以保持直立。
内容的提问来源于stack exchange,提问作者user2605793
相关产品推荐
相关产品推荐

