1、问题背景
在基于 RK3576
平台、Android 14 系统使用系统相机 RK3576-SDK/packages/apps/Camera2
测试 USB 摄像头用于拍照与录像功能。测试过程中发现:

【问题】USB 摄像头在拍照模式与录像模式下预览方向不一致,录像预览出现左右镜像。
2、 原因分析
在 Android Camera
系统中,镜像逻辑通常依赖于 LENS_FACING
元数据字段:
ANDROID_LENS_FACING_FRONT / BACK / EXTERNAL
LENS_FACING_EXTERNAL
类型的摄像头一般默认不进行镜像处理。但在实际使用中,某些相机 App 或旧系统逻辑可能完全按照前置摄像头处理 EXTERNAL,导致预览镜像错误。
3、解决方案
3.1、解决方案一:修改 HAL 层 Camera HAL
中的摄像头方向
在 RK 的 Camera HAL 实现中,USB 摄像头的默认 facing
设置为 ANDROID_LENS_FACING_EXTERNAL
:
位置:
hardware/rockchip/camera_aidl/device/ExternalCameraDevice.cpp
修改如下:
--- a/device/ExternalCameraDevice.cpp
+++ b/device/ExternalCameraDevice.cpp
@@ -482,7 +482,8 @@ status_t ExternalCameraDevice::initDefaultCharsKeys(
const uint8_t opticalStabilizationMode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF;
UPDATE(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, &opticalStabilizationMode, 1);
- const uint8_t facing = ANDROID_LENS_FACING_EXTERNAL;
+ //const uint8_t facing = ANDROID_LENS_FACING_EXTERNAL;
+ const uint8_t facing = ANDROID_LENS_FACING_BACK;
UPDATE(ANDROID_LENS_FACING, &facing, 1);
注意事项
- 该方式会影响其他识别摄像头类型的逻辑
- 不适用于需要根据 EXTERNAL 类型进行分类评估的场景
3.2、(推荐)解决方案二:保留 EXTERNAL 类型,App 层中针对 USB 摄像头禁用镜像逻辑
若希望保留 HAL 标准语义的场景,可以在相机应用层进行处理:
位置:
packages/apps/Camera2/src/com/android/camera/TextureViewHelper.java
修改如下:
--- a/src/com/android/camera/TextureViewHelper.java
+++ b/src/com/android/camera/TextureViewHelper.java
@@ -347,7 +347,6 @@ public class TextureViewHelper implements TextureView.SurfaceTextureListener,
Log.e(TAG, "TransformViewHelper does not support Camera API2");
}
// Only apply this fix when Current Active Module is Photo module AND
// Phone is Nexus4 The enhancement fix b/20694189 to original fix to
// b/19271661 ensures that the fix should only be applied when:
@@ -367,6 +366,21 @@ public class TextureViewHelper implements TextureView.SurfaceTextureListener,
CameraDeviceInfo.Characteristics info = mCameraProvider.getCharacteristics(cameraId);
matrix = info.getPreviewTransform(mOrientation, new RectF(0, 0, mWidth, mHeight),
mCaptureLayoutHelper.getPreviewRect());
+
+ int moduleIndex = mAppController.getCurrentModuleIndex();
+ boolean isRecordingModule = (moduleIndex == 1);
+ String cameraIdStr = cameraKey.toString().toLowerCase();
+ //boolean isUsbCamera = cameraIdStr.contains("usb") || cameraIdStr.contains("external");
+ boolean isUsbCamera = cameraIdStr.contains("api2='0'"); //此处需修改为正确的 usb摄像头 判断,api2='0'是 neardi 根据实际打印作为判断,仅供参考!
+ if (isUsbCamera && isRecordingModule) {
+ Log.v(TAG, "USB camera recording: remove mirror transform");
+ matrix.postScale(-1f, 1f, mWidth / 2f, mHeight / 2f);
+ }
优点
- 无需修改 HAL 层,系统兼容性更好
- 仅影响目标场景,逻辑精确