移动开发音视频【免费下载链接】CameraView A well documented, high-level Android interface that makes capturing pictures and videos easy, addressing all of the common issues and needs. Real-time filters, gestures, watermarks, frame processing, RAW, output of any size.项目地址https://gitcode.com/gh_mirrors/ca/CameraView点击查看免费下载在 CameraView 中除了核心的拍照与录像 API还有一组用于精细控制拍摄体验的扩展控制预览网格线含黄金分割网格、系统提示音开关、是否根据设备倾斜旋转输出媒体、UI 元素的方向同步回调以及为照片和视频写入地理位置元数据。本文基于 CameraView 官方文档docs/_docs/more-features.md结合cameraview模块源码逐一讲解这些特性的 XML 属性、Java API、默认值、平台限制如 API 16、Camera1 引擎的特殊行为以及底层实现链路帮助你在相机应用中正确配置和定制这些功能。一、扩展控制属性总览以下 XML 展示了CameraView提供的一组额外控制属性它们对应文档中Extra controls一节的全部内容com.otaliastudios.cameraview.CameraView app:cameraPlaySoundstrue|false app:cameraGridoff|draw3x3|draw4x4|drawPhi app:cameraGridColorcolor/black app:cameraAutoFocusResetDelay0 app:cameraUseDeviceOrientationtrue/这些属性在 attrs.xml 中以declare-styleable形式声明其中cameraGrid是一个枚举属性其取值与内部整数值映射关系为XML 取值整数值对应枚举off0Grid.OFFdraw3x31Grid.DRAW_3X3draw4x42Grid.DRAW_4X4drawPhi3Grid.DRAW_PHIcameraPlaySounds与cameraUseDeviceOrientation均为boolean格式cameraGridColor接受color|referencecameraAutoFocusResetDelay接受integer|reference。XML 属性解析后最终会落到CameraView构造路径中的setPlaySounds/setGrid/setGridColor/setUseDeviceOrientation/setAutoFocusResetDelay调用上因此 XML 配置与代码 API 是完全等价的两条入口。二、cameraPlaySounds系统提示音控制cameraPlaySounds控制相机在特定事件快门、对焦完成时是否播放平台自带的提示音默认值为truecameraView.setPlaySounds(true); cameraView.setPlaySounds(false);文档明确了两条平台限制在 API 16 的设备上该标志永远被强制为falseCamera1 引擎在拍照时总会播放快门声与这个标志无关。这两条限制在源码中可以直接得到印证。CameraView.java 的 setter 中标志落地时就做了 API 级别裁剪public void setPlaySounds(boolean playSounds) { mPlaySounds playSounds Build.VERSION.SDK_INT 16; mCameraEngine.setPlaySounds(playSounds); }即本地MediaActionSound播放playSound方法CameraView.java在低版本上直接失效但引擎侧仍会收到该设置。播放时机在onDeviceOrientationChanged相邻的回调逻辑中可见对焦成功且mPlaySounds为真时触发MediaActionSound.FOCUS_COMPLETECameraView.java。两条引擎的差异体现在各自的setPlaySounds实现中Camera1Camera1Engine.applyPlaySounds 会查询CameraInfo.canDisableShutterSound仅当设备允许关闭快门声时才调用mCamera.enableShutterSound(...)如果设备不允许关闭canDisableShutterSound false代码会回滚mPlaySounds为旧值并返回false——这就是Camera1 引擎总会播放快门声这一说法的源码级解释。Camera2Camera2Engine.setPlaySounds 仅记录mPlaySounds状态快门提示音由CameraView层用MediaActionSound统一播放。三、cameraGrid预览网格线cameraGrid让你能够在预览上绘制构图辅助网格支持的取值为off、draw3x3、draw4x4常规网格与drawPhi基于黄金分割常数、摄影构图中常用的网格默认为offcameraView.setGrid(Grid.OFF); cameraView.setGrid(Grid.DRAW_3X3); cameraView.setGrid(Grid.DRAW_4X4); cameraView.setGrid(Grid.DRAW_PHI);取值定义在 Grid.java它实现Control接口DEFAULT OFF并提供fromValue(int)反解析方法以支持 XML 枚举映射。网格绘制原理setGrid并不触碰相机而是直接驱动一个覆盖在预览之上的专用视图——GridLinesLayout。CameraView.setGrid 的实现只有一行public void setGrid(NonNull Grid gridMode) { mGridLinesLayout.setGridMode(gridMode); }GridLinesLayout内部的关键逻辑线数getLineCount()按模式返回OFF→0、DRAW_3X3→2、DRAW_PHI→2、DRAW_4X4→3即在水平和垂直方向各画 N 条线线位常规网格使用等分公式(1f / (lineCount 1)) * (lineNumber 1)DRAW_PHI模式使用黄金分割倒数常量GOLDEN_RATIO_INV 0.61803398874989f通过delta 1f / (2 GOLDEN_RATIO_INV)计算两条非对称线的位置GridLinesLayout.java渲染onDraw中用两个ColorDrawable分别平移绘制水平线与垂直线线宽为 0.9dpTypedValue.applyDimension(..., 0.9f, ...)。这套行为的正确性由仪表测试 GridLinesLayoutTest.java 守护testOff断言 0 条线、test3x3断言 2 条、testPhi断言 2 条、test4x4断言 3 条通过DrawCallback.onDraw(lines)捕获实际绘制结果。四、cameraGridColor网格线颜色cameraGridColor用于指定网格线的颜色文档描述默认值是一种灰色调cameraView.setGridColor(Color.WHITE); cameraView.setGridColor(Color.BLACK);从源码看默认颜色常量定义在 GridLinesLayout.javapublic final static int DEFAULT_COLOR Color.argb(160, 255, 255, 255);即 alpha 为 160约 63% 不透明度的白色——叠加在相机预览画面之上时呈现为文档所说的灰色调。setGridColor会把颜色同时应用到水平和垂直两个ColorDrawable并postInvalidate()触发重绘GridLinesLayout.java因此颜色修改与网格模式切换一样是纯 UI 操作即时生效、无需重新打开相机。CameraView侧还提供getGrid()/getGridColor()读取当前状态且CameraView的通用setControl分发机制会将Grid类型的 Control 转发到setGridCameraView.java。五、cameraAutoFocusResetDelay自动对焦重置延迟XML 片段中的cameraAutoFocusResetDelay0对应 APIsetAutoFocusResetDelay(long)用于控制相机在一段时间未触发对焦后自动将焦点重置为无穷远无限对焦的延迟毫秒数默认0表示不自动重置cameraView.setAutoFocusResetDelay(3000); // 3 秒后重置焦点实现位于引擎层CameraView.java 直接委托给mCameraEngine。值得注意的是CameraView在切换引擎时会用setAutoFocusResetDelay(oldEngine.getAutoFocusResetDelay())显式迁移该状态CameraView.java说明它属于跨引擎保留的会话级设置。六、cameraUseDeviceOrientation设备方向与输出旋转cameraUseDeviceOrientation控制拍照和录像输出是否考虑设备方向默认truecameraView.setUseDeviceOrientation(true); // rotate media cameraView.setUseDeviceOrientation(false); // dont文档指出可以将其设为false以应对那些不希望输出媒体在拍摄瞬间随设备旋转而旋转的特殊场景例如固定支架设备、嵌入式场景。源码揭示了它的一个巧妙实现在onDeviceOrientationChanged回调中CameraView.java如果mUseDeviceOrientation falseCameraView并不会忽略传感器数据而是给引擎喂一个伪造的方向值if (!mUseDeviceOrientation) { // To fool the engine to return outputs in the VIEW reference system, // The device orientation should be set to -displayOffset. int fakeDeviceOrientation (360 - displayOffset) % 360; mCameraEngine.getAngles().setDeviceOrientation(fakeDeviceOrientation); } else { mCameraEngine.getAngles().setDeviceOrientation(deviceOrientation); }从注释和源码结构看这个fakeDeviceOrientation -displayOffset的取法让引擎以为设备始终正对着当前视图方向从而把输出锁定在 View 参考系下。另一个与方向系统相关的细节当显示偏移如分屏、折叠屏导致的窗口角度变化改变时onDisplayOffsetChanged会直接close()open()重启相机CameraView.java因为方向参数无法在会话中热切换。七、UI Orientation让按钮与预览同步旋转相机应用里屏幕旋转被锁定为固定方向后用户倾斜手持设备时预览画面会歪此时通常希望快门按钮等 UI 元素跟着旋转。CameraView提供了onOrientationChanged回调返回应施加给 View 的逆时针旋转角度使其与用户当前握持方式及 Activity 原生方向保持一致cameraView.addCameraListener(new CameraListener() { Override public void onOrientationChanged(int orientation) { // orientation is the counter-clockwise rotation that a View should have // based on current device tilting and native activity orientation. } });该回调定义在 CameraListener.javaJavadoc 明确参数为0、90、180、270之一且标注UiThread。其触发路径在CameraView内部回调中CameraView.javafinal int value (deviceOrientation displayOffset) % 360; mUiHandler.post(new Runnable() { Override public void run() { for (CameraListener listener : mListeners) { listener.onOrientationChanged(value); } } });即value (设备方向 显示偏移) % 360通过mUiHandler投递到 UI 线程后广播给所有已注册的CameraListener。典型用法是拿到该值后调用view.setRotation(orientation)让取景框外的按钮组与预览保持视觉一致。八、Location APIs照片 EXIF 与视频元数据setLocation可以把地理位置标签写入照片的 EXIFJPEG和视频元数据。位置数据可以来自任何位置 Provider需先取得相应定位权限。文档特别强调这不保证会被写入 snapshot预览截图类输出。MethodDescriptionsetLocation(Location)Sets location data to be appended to picture/video metadata.setLocation(double, double)Sets latitude and longitude to be appended to picture/video metadata.getLocation()Retrieves location data previously applied with setLocation().三个 API 在 CameraView.java 中实现其中双参数重载内部构造一个 provider 名为Unknown的Location对象时间戳取当前系统时间、海拔置 0然后统一委托给mCameraEngine.setLocation(location)public void setLocation(double latitude, double longitude) { Location location new Location(Unknown); location.setTime(System.currentTimeMillis()); location.setAltitude(0); location.setLatitude(latitude); location.setLongitude(longitude); mCameraEngine.setLocation(location); }底层写入链路位置数据随拍摄任务被钉在结果 Stub 上CameraBaseEngine 的takePicture/takePictureSnapshot/takeVideo/takeVideoSnapshot都会执行stub.location mLocation。之后的分岔点Camera2 高质量拍照Camera2Engine 在构造CaptureRequest时直接设置builder.set(CaptureRequest.JPEG_GPS_LOCATION, mLocation)由硬件管线把 GPS 信息写入 JPEG EXIFCamera1 高质量拍照Camera1Engine 则调用params.setGpsLatitude / setGpsLongitude / setGpsAltitude / setGpsTimestamp / setGpsProcessingMethod五个参数provider 名会作为GpsProcessingMethod写入DNG 格式Full2PictureRecorder 中mDngCreator.setLocation(mResult.location)即 DNG 侧车文件也会带上位置视频FullVideoRecorder 在prepareMediaRecorder阶段执行mMediaRecorder.setLocation((float) lat, (float) lon)坐标以float精度写入视频元数据。这也解释了文档中snapshot 不保证附加位置的说明snapshot 走的是预览帧捕获路径引擎侧虽然同样填充了stub.location但各快照录制器如 GL 快照并未像高质量拍照和视频那样消费该字段。引擎重启时的位置迁移setLocation在引擎层是一个有状态任务scheduleStateful(location, ...)会在相机打开/重启后重新应用。切换引擎时CameraView同样会用旧引擎的getLocation()恢复新引擎的位置设置保证跨引擎不丢失。九、未单独成篇的能力CameraUtils 与 CameraOptions文档最后一节指出部分功能与 API 未在主文档中展开主要包括CameraUtilsCameraUtils.java 提供与具体CameraView实例无关的静态工具方法如尺寸转换、预览尺寸计算等辅助能力CameraOptionsCameraOptions.java 封装当前相机会话的全部可查询能力支持的尺寸、闪光能力、最大缩放比等并在onCameraOpened回调中交给使用者。按文档建议这两部分的细节请直接阅读对应源码或 Javadoc。十、小结与验证要点特性默认值生效层级关键限制cameraPlaySoundstrueMediaActionSound 引擎API 16 恒为falseCamera1 快门声不可禁用时强制播放cameraGridoff纯 UIGridLinesLayout即时重绘不重启相机cameraGridColorargb(160, 255, 255, 255)纯 UI半透明白色预览上呈灰色cameraAutoFocusResetDelay0禁用引擎层切引擎时状态自动迁移cameraUseDeviceOrientationtrue引擎方向系统false时以-displayOffset锁定 View 参考系显示偏移变化会重启相机setLocation无EXIF / DNG / 视频元数据snapshot 不保证写入这些扩展控制覆盖了相机应用中最常见的三类定制需求构图辅助网格、拍摄反馈提示音、方向同步的 UI 旋转、以及媒体合规地理元数据。所有行为均可在本文引用的源码与 GridLinesLayoutTest 等测试用例中逐条核对demo 应用Option.kt 中的Grid、GridColor、UseDeviceOrientation选项也提供了这些控制项的完整交互示例。赞分享移动开发音视频【免费下载链接】CameraView A well documented, high-level Android interface that makes capturing pictures and videos easy, addressing all of the common issues and needs. Real-time filters, gestures, watermarks, frame processing, RAW, output of any size.项目地址https://gitcode.com/gh_mirrors/ca/CameraView点击查看免费下载相关推荐CameraView项目预览尺寸控制技术详解CameraView项目预览尺寸控制技术详解 前言 在移动应用开发中相机功能的实现往往需要处理复杂的预览尺寸适配问题。CameraView作为一个功能强大的相移动开发音视频frontend-slides Mat 模板预览卡解析材质触感演示设计系统的选择元数据与预览落地规则frontend slides Mat 模板预览卡解析材质触感演示设计系统的选择元数据与预览落地规则 Mat 是 frontend slides 项目 BolAI 技能AI 插件前端CameraView终极指南如何完美处理Exif数据中的地理位置和方向信息 CameraView终极指南如何完美处理Exif数据中的地理位置和方向信息 CameraView是一个功能强大的Android相机库专门用于简化图片和移动开发音视频上一篇LevelDB dumpfile工具深度解析揭秘Google高性能键值存储的底层数据格式下一篇Sea.js中的依赖图谱可视化模块关系创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考