Android CameraX前置摄像头录制视频如何实现水平镜像?
前置摄像头视频水平镜像实现方案
不能直接像ImageCapture那样通过设置元数据实现视频水平翻转——图片的EXIF元数据可以标记镜像状态让系统渲染时翻转,但视频录制的元数据体系(不管是CameraX的VideoCapture还是原生MediaRecorder)都没有类似的标记项,必须通过采集/编码阶段的变换或者后期处理来实现。
下面是几种实用的实现方式:
1. CameraX 实时录制时镜像
如果用CameraX框架,直接给VideoCapture设置目标变换矩阵即可:
// 初始化VideoCapture val videoCapture = VideoCapture.Builder() .setTargetRotation(activity.windowManager.defaultDisplay.rotation) .build() // 判断是否为前置摄像头 val isFrontCamera = cameraSelector == CameraSelector.DEFAULT_FRONT_CAMERA if (isFrontCamera) { // 创建水平镜像变换矩阵:x轴方向缩放-1实现翻转,以预览视图中心为原点 val mirrorTransform = Matrix().apply { postScale(-1f, 1f, viewFinder.width / 2f, viewFinder.height / 2f) } videoCapture.setTargetTransform(mirrorTransform) } // 绑定UseCases开始录制 cameraProvider.bindToLifecycle(this, cameraSelector, videoCapture)
这种方式会让录制的视频直接是水平镜像后的内容,不需要额外后期处理。
2. Camera2 + MediaRecorder 实现
用Camera2 API时,需要在配置录制会话时对采集帧应用变换:
// 配置MediaRecorder MediaRecorder mediaRecorder = new MediaRecorder(); // ... 常规配置(输出路径、编码格式等) if (isFrontCamera) { // 前置摄像头配合方向调整,再通过Surface变换实现镜像 mediaRecorder.setOrientationHint(180); } // 创建CaptureRequest时,设置变换参数 CaptureRequest.Builder captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD); captureRequestBuilder.addTarget(mediaRecorder.getSurface()); // 针对前置摄像头添加水平镜像的裁剪区域变换 if (isFrontCamera) { Rect cropRegion = new Rect(0, 0, sensorSize.getWidth(), sensorSize.getHeight()); captureRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, new Rect(cropRegion.right, cropRegion.top, cropRegion.left, cropRegion.bottom)); }
如果需要更灵活的处理,也可以用OpenGL ES对摄像头采集的每一帧做水平翻转后再送入MediaRecorder编码。
3. 后期处理已录制的视频
如果已经录制好视频再处理,最简单的方式是用FFmpeg命令:
ffmpeg -i input.mp4 -vf hflip output.mp4
也可以用Android原生的MediaCodec API,读取视频帧后做水平翻转再重新编码输出。
内容的提问来源于stack exchange,提问作者BestFromAbove
相关产品推荐
相关产品推荐

