Android Camera2录像开发全流程从参数优化到系统相册整合的工程实践在移动应用开发领域视频录制功能的需求日益增长从社交分享到专业拍摄Camera2 API为开发者提供了更底层的控制能力。不同于简单的调用系统相机应用直接使用Camera2实现录像功能可以让应用获得更精细的控制权和更好的用户体验但同时也带来了更高的复杂度。1. Camera2录像架构设计与初始化Camera2 API采用管道(Pipeline)架构设计将摄像头设备抽象为数据生产者而应用则作为消费者通过会话(Session)来管理数据流。这种设计相比传统的Camera API提供了更高效的资源利用和更精细的控制能力。关键初始化步骤相机权限检查确保在AndroidManifest.xml中声明了相机和录音权限uses-permission android:nameandroid.permission.CAMERA / uses-permission android:nameandroid.permission.RECORD_AUDIO / uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE /相机特性获取通过CameraManager获取设备支持的相机特性CameraManager manager (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); String[] cameraIds manager.getCameraIdList(); CameraCharacteristics characteristics manager.getCameraCharacteristics(cameraIds[0]);预览Surface准备为TextureView或SurfaceView创建SurfaceSurfaceTexture texture textureView.getSurfaceTexture(); texture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight()); Surface previewSurface new Surface(texture);注意现代Android设备通常支持多个摄像头开发者需要根据LENS_FACING特性选择合适的前置或后置摄像头。相机能力对比表特性Camera APICamera2 API控制粒度粗粒度细粒度性能一般更高效兼容性广泛Android 5.0功能支持基本功能高级功能(如手动控制)架构简单管道模式2. MediaRecorder配置与参数优化MediaRecorder是Android多媒体框架中的核心组件负责音视频的编码和封装。在Camera2架构中它作为数据消费者接收来自相机的视频流。推荐配置流程// 创建临时视频文件 File videoFile new File(context.getExternalCacheDir(), new SimpleDateFormat(yyyyMMdd_HHmmss).format(new Date()) .mp4); MediaRecorder recorder new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); recorder.setVideoEncodingBitRate(bitRate); recorder.setVideoFrameRate(frameRate); recorder.setVideoSize(width, height); recorder.setOrientationHint(orientation); recorder.setOutputFile(videoFile.getAbsolutePath()); // 获取MediaRecorder的Surface Surface recorderSurface recorder.getSurface();参数优化建议编码器选择视频编码优先选择H.264(兼容性最好)或H.265(更高效)音频编码推荐AAC比特率设置计算公式比特率 分辨率宽度 × 分辨率高度 × 帧率 × 0.1示例1080p(1920x1080)30fps建议比特率为6-8Mbps帧率控制人眼流畅体验需要至少24fps高动态场景建议30fps慢动作拍摄需要60fps或更高常见设备兼容性问题解决方案编码器不支持通过CameraCharacteristics获取设备支持的编码格式分辨率不匹配使用StreamConfigurationMap检查支持的分辨率方向错误根据设备旋转设置setOrientationHint音频视频不同步确保时间戳处理正确使用同步编码3. 录制会话管理与异常处理Camera2的录制会话管理是整个流程中最复杂的部分需要协调预览、录制和可能的其他数据流(如图像分析)。完整会话创建流程// 1. 停止预览 captureSession.stopRepeating(); // 2. 创建录制请求 previewRequestBuilder cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD); previewRequestBuilder.addTarget(previewSurface); previewRequestBuilder.addTarget(recorderSurface); // 3. 创建新的会话 cameraDevice.createCaptureSession(Arrays.asList(previewSurface, recorderSurface), new CameraCaptureSession.StateCallback() { Override public void onConfigured(NonNull CameraCaptureSession session) { captureSession session; try { // 4. 开始重复请求 captureSession.setRepeatingRequest( previewRequestBuilder.build(), null, backgroundHandler); // 5. 启动MediaRecorder mediaRecorder.start(); } catch (CameraAccessException e) { Log.e(TAG, Failed to start recording, e); } } }, backgroundHandler);关键异常处理场景相机访问冲突表现CameraAccessException解决方案实现适当的重试机制和资源释放MediaRecorder初始化失败表现IllegalStateException解决方案检查参数合法性确保正确的状态转换存储权限问题表现IOException解决方案动态权限检查和用户引导设备旋转处理表现画面方向错误解决方案监听设备方向变化并调整配置录制状态机示意图[预览状态] ↓ [停止预览] ↓ [配置MediaRecorder] ↓ [创建录制会话] ↓ [开始录制] → [异常] → [错误处理] ↓ [停止录制] ↓ [释放资源] ↓ [恢复预览]4. 视频保存与系统相册整合录制完成后正确处理视频文件并使其在系统相册中可见是提升用户体验的关键环节。视频保存最佳实践临时文件管理使用应用缓存目录存储临时视频文件考虑设置文件大小限制实现清理机制避免存储空间浪费永久保存到公共目录ContentValues values new ContentValues(); values.put(MediaStore.Video.Media.DISPLAY_NAME, my_video.mp4); values.put(MediaStore.Video.Media.MIME_TYPE, video/mp4); values.put(MediaStore.Video.Media.RELATIVE_PATH, Environment.DIRECTORY_MOVIES /MyApp); ContentResolver resolver context.getContentResolver(); Uri uri resolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values); try (OutputStream out resolver.openOutputStream(uri); FileInputStream in new FileInputStream(tempFile)) { byte[] buf new byte[4096]; int len; while ((len in.read(buf)) 0) { out.write(buf, 0, len); } }媒体扫描触发MediaScannerConnection.scanFile(context, new String[] { videoFile.getAbsolutePath() }, new String[] { video/mp4 }, (path, uri) - { // 扫描完成回调 });性能优化技巧使用后台线程处理文件操作实现进度反馈机制考虑使用ContentProviderOperation批量操作针对大文件实现流式传输用户体验增强建议提供视频缩略图预览实现保存进度指示器处理存储空间不足的优雅降级支持取消保存操作提供保存成功后的快速分享选项5. 高级功能实现与性能调优对于追求更高质量录制的应用Camera2提供了一系列高级功能和控制选项。手动控制参数曝光控制previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF); previewRequestBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, exposureTimeNs);对焦设置previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO);白平衡控制previewRequestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_AUTO);扩展功能实现视频防抖if (characteristics.get(CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES) .contains(CameraMetadata.CONTROL_VIDEO_STABILIZATION_MODE_ON)) { previewRequestBuilder.set(CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE, CameraMetadata.CONTROL_VIDEO_STABILIZATION_MODE_ON); }高帧率录制RangeInteger[] fpsRanges characteristics.get( CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); // 寻找支持的高帧率范围(如60fps)视频质量增强使用TEMPLATE_VIDEO_SNAPSHOT提高静态帧质量实现HDR视频录制(如果设备支持)应用电子防抖算法性能监控指标指标正常范围优化建议帧率≥目标帧率80%降低分辨率/比特率延迟100ms减少处理管道长度内存使用设备内存50%优化缓冲区管理CPU使用70%使用硬件加速编码温度45°C限制录制时长在实际项目中我们曾遇到录制长时间视频后出现内存泄漏的问题。通过分析发现是未正确释放MediaRecorder和CameraSession资源导致的。解决方案是建立严格的生命周期管理机制确保所有资源在Activity/Fragment销毁时被正确释放。