Camera API 1 和API 2 设置获取实时预览的回调数据的格式

【cameraAPK】API-1 普通View都是共享一个Surface的,所有的绘制也都在UI线程中进行.因为UI线程还要处理其他逻辑.因此对View的更新速度和绘制帧率无法保证.这显然不适合相机实时预览这种情况.因而SurfaceView持有一个单独Surface.它负责管理这个Surface的格式.尺寸以及显示位置,它的Surface绘制也在单独的线程中进行,因而拥有更高的绘制效率和帧率。SurfaceHolder:用于控制Surface的一个抽象接口.它可以控制Surface的尺寸,格式与像素等.并可以监视Surface的变化. 阅读详情

名字有点拗口哈,本文想说的是在获得camera 实时预览的数据时,怎么设置需要的数据的格式。

API 1

设置预览格式和预览回调:

parameters.setPreviewFormat(ImageFormat.NV21);
mCamera.setParameters(parameters);
mCamera.setPreviewCallback(previewCallback);

默认NV21 格式,传入参数支持NV21 和YV12,也可以通过 getSupportedPreviewFormats 查询支持的格式。

         * @param pixel_format the desired preview picture format, defined by
         *   one of the {@link android.graphics.ImageFormat} constants.  (E.g.,
         *   <var>ImageFormat.NV21</var> (default), or
         *   <var>ImageFormat.YV12</var>)
         *
         * @see android.graphics.ImageFormat
         * @see android.hardware.Camera.Parameters#getSupportedPreviewFormats
         */
        public void setPreviewFormat(int pixel_format) {
            String s = cameraFormatForPixelFormat(pixel_format);
            if (s == null) {
                throw new IllegalArgumentException(
                        "Invalid pixel_format=" + pixel_format);
            }

            set(KEY_PREVIEW_FORMAT, s);
        }

如果getSupportedPreviewFormats 返回 [17, 842094169],可以查到这两种正是NV21 和YV12 格式的十进制表示:

    /**
     * YCrCb format used for images, which uses the NV21 encoding format.
     *
     * <p>This is the default format
     * for {@link android.hardware.Camera} preview images, when not otherwise set with
     * {@link android.hardware.Camera.Parameters#setPreviewFormat(int)}.</p>
     *
     * <p>For the {@link android.hardware.camera2} API, the {@link #YUV_420_888} format is
     * recommended for YUV output instead.</p>
     */
    public static final int NV21 = 0x11;

    /**
    ...
     * @see android.hardware.Camera.Parameters#setPreviewCallback
     * @see android.hardware.Camera.Parameters#setPreviewFormat
     * @see android.hardware.Camera.Parameters#getSupportedPreviewFormats
     * </p>
     */
    public static final int YV12 = 0x32315659;

另外 pixel format 和camera format 的转换如下

        private String cameraFormatForPixelFormat(int pixel_format) {
            switch(pixel_format) {
            case ImageFormat.NV16: return PIXEL_FORMAT_YUV422SP;
            case ImageFormat.NV21: return PIXEL_FORMAT_YUV420SP;
            case ImageFormat.YUY2: return PIXEL_FORMAT_YUV422I;
            case ImageFormat.YV12: return PIXEL_FORMAT_YUV420P;
            case ImageFormat.RGB_565: return PIXEL_FORMAT_RGB565;
            case ImageFormat.JPEG: return PIXEL_FORMAT_JPEG;
            default: return null;
            }
        }

可能有同学问了“这是设置的预览的格式啊,怎么保证回调回来的数据也是这个格式呢?”
因为 previewCallback 的作用就是 used to deliver copies of preview frames as they are displayed. 拷贝预览帧。

API 2

预览回调是通过增加一个ImageReader 实时获取预览数据,设置的格式不区分预览和拍照,因为拍照也是通过ImageReader 的onImageAvailable 回调获得数据。

previewReader = ImageReader.newInstance(previewSize.getWidth(), previewSize.getHeight
                    (), ImageFormat.YUV_420_888, 2);

这里点名不支持NV21

     * @param width The default width in pixels of the Images that this reader
     *            will produce.
     * @param height The default height in pixels of the Images that this reader
     *            will produce.
     * @param format The format of the Image that this reader will produce. This
     *            must be one of the {@link android.graphics.ImageFormat} or
     *            {@link android.graphics.PixelFormat} constants. Note that not
     *            all formats are supported, like ImageFormat.NV21.
     * @param maxImages The maximum number of images the user will want to
     *            access simultaneously. This should be as small as possible to
     *            limit memory use. Once maxImages Images are obtained by the
     *            user, one of them has to be released before a new Image will
     *            become available for access through
     *            {@link #acquireLatestImage()} or {@link #acquireNextImage()}.
     *            Must be greater than 0.
     * @see Image
     */
    public static ImageReader newInstance(int width, int height, int format, int maxImages) {
        return new ImageReader(width, height, format, maxImages, BUFFER_USAGE_UNKNOWN);
    }

那API 1 中通过setPreviewFormat() 设置的ImageFormat.NV21 预览格式,在API 2 中设置成哪个格式呢?
答案是 ImageFormat.YUV_420_888。至于为什么,源码跳到jni 里面去了,我没跟到后面的源码。
从dumpsys media.camera 的信息中看,preview-format 的值和API 1 中设置NV21 是一样的,都是 yuv420sp。

$ adb shell dumpsys media.camera | grep -E "preview-format|Latest set parameters|Device"
  Device 0 is open. Client instance dump:
Latest set parameters:
preview-format: yuv420sp
preview-format-values: yuv420sp,yuv420p,nv12-venus
  Device 1 is closed, no client instance
preview-format: yuv420sp
preview-format-values: yuv420sp,yuv420p,nv12-venus
  Device 2 is open. Client instance dump:
Latest set parameters:
preview-format: yuv420p
preview-format-values: yuv420sp,yuv420p,nv12-venus
  Device 3 is closed, no client instance

在API 2 上可以使用下面的方法查询支持输出的格式:

StreamConfigurationMap map = characteristics.get(
                CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Log.d(TAG, "get supported out put format: " + map.getOutputFormats());

通常来讲如果你设置一个不是getOutputFormats() 返回的格式,你是不能成功创建预览的(可以open),但不排除部分厂商在底层做了workaround(比如小米8)。

(一)Android camera2 实现相机预览及获取预览帧数据流 一、本文重点说明 本文基于 android camera2 实现视频预览,暂未兼容 camera1 API,基础实现可以参考 googlesample Camera2 例子 android-Camera2Basic ,本文以工具类形式实现一步调用。 谷歌例子中没有具体指明预览帧的获取,即 camera1 setPreviewCallback 类似功能实现,具体是通过 ImageReader 中... 阅读详情

相关推荐

使用Camera2实现预览功能

Camera2原生相机开发,预览功能

weixin_44752167的博客 9385

Android_Camera预览数据格式Nv21简介

Android Camera的预览数据格式Nv21简介 在Android中启用摄像头进行拍摄画面时,通常会涉及到预览的回调函数,参数一般是:byte[] data, Camera camera。不进行转换的话,这里的byte[] data就是Nv21格式的图像信息,而Nv21到底是什么样的图像格式呢? 1. 前置知识 熟悉的RGB和不那么熟悉的YUV都是一种人为定义的颜色空间,可以简单的认为是对图像的高度抽象后的系统,用来描述图像。就像人都可以抽象出这样一套系统:由眼、鼻、口、耳朵…等等器官组成的“对象”,

Teolih的博客 8074

Camera2 API 采集视频并SurfaceView、TextureView 预览

如今Android推荐使用Camera2采集视频,之前也学习并写了视频预览的demo,但是一直理不清里面的勾勾绕绕,借着写这篇记录的过程,重新熟悉和理解Camera2流程。

三木仔 4729

Android Camera开发入门

Android Camera开发入门:目录 第一篇: 前景  一、Android Camera开发前景;      1)camera相关应用的领域      2)相关岗位介绍;      3)市场招聘介绍;      4)发展前景介绍;  二、学习这门课的重要性;      1)适合的人群;      2)熟悉和了解Android Camera 应用开发流程的重要性 第二篇: 开发环境安装  一、jdk、sdk的配置;  二、android studio的安装介绍;  三、adb命令的使用; 第三篇: Camera 常用api和最新框架介绍  一、android camera api介绍      1)camera1、camera2 区别;      2)camera 1、camera2 常用api介绍;      3)android camerax;  二、android camera最新框架介绍 第四篇:Camera api1实现预览、拍照、录像功能  一、预览  二、拍照  三、录像  四、获取实时预览流 第五篇: Camera2相机 打开功能实现第六篇: Camera2相机 预览功能实现  1)surfaceview、textureview 第七篇: Camera2相机 拍照功能实现 1)单拍; 第八篇:Camera2相机 录像功能实现1)正常录像 第九篇:Camera2预览方向、拍照方向设置     1) 预览变形问题如何处理? 第十篇:YUV流处理  1)如何获取实时预览流?  2)  思考:双码流方案如何实现?一边本地录像,一边后台推流 第十一篇:dumpsys media.camera 第十二篇:Camera2 Zoom变焦第十三篇:人脸识别(android 原生 & 三方人脸识别算法)第十四篇:Uvc UsbCamera第十五篇:Android Camera2拍摄RAW图第十六篇: Android Camera2同时打开前后摄 并 录像第十七篇: Android Camera2 视频慢动作  附:1)提供android开发相关资源      软件工具、Android相关学习书籍、学习相关网站博客等链接2)提供课程讲解中设计到的App 源码    * Camera API1使用源码    * Camera API2使用源码    * 调用三方算法人脸识别源码    *  录像慢动作源码    * Uvc UsbCamera相关源码3)课件

camera api1 和api2

一 cameraapi概述 Android5.0之后,增加了Cameraapi2接口,api2和api1在调用流程上差异很大,功能上api2提供了更加细致的控制功能,api1子系统被设计为具备高级控制功能的黑盒,能够发出请求,但无法控制图像的缓冲区和元数据,无法再帧层面控制传感器的特性,无法通过访问和修改元数据信息(如3A信息)对捕获的帧应用任何增强功能,重新设计api2旨在大幅提高应用程序控制...

pakaco的专栏 1万+

Android Camera2-预览、拍照、录像流程

重复模式(Repeating):指的是不断重复执行指定的 Capture 操作,当有其他模式的 Capture 提交时会暂停该模式,转而执行其他被模式的 Capture,当其他模式的 Capture 执行完毕后又会自动恢复继续执行该模式的 Capture,例如显示预览画面就是不断 Capture 获取每一帧画面。在 Camera2 上,你可以在规定的曝光时长范围内配置拍照的曝光时间,从而实现拍摄长曝光图片,你甚至可以延长每一帧预览画面的曝光时间让整个预览画面在暗环境下也能保证一定的亮度。

闲暇部落 7870

Android音视频开发基础(三) : 在Android平台使用Camera API进行视频的采集,并且预览Camera数据,得到NV21数据进行回调

前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的第三篇, 对应的要学习的内容是:在Android平台使用Camera API进行视频的采集,分别使用SurfaceView、TextureView来预览Camera数据,取到NV21的数据回调(例如将获取的NV21数据进行处理之后显示在ImageView控件上面)。 音视频任务列表 音视频任务列表: 点击此处

分享计算机基础,android,C/C++,音视频等内容 2184

Camera1 调用摄像机预览+获取每一帧

使用camera1调试相机预览+获取每一帧数据, https://www.jianshu.com/p/3440d82545f6 https://www.jianshu.com/p/705d4792e836 主要学习代码,在这里 MainActivity public class MainActivity extends AppCompatActivity implements Hand...

果酱大师的博客 4141

Android Camera2 获取预览帧的回调数据(带demo)

一、前言 众所周知,在旧Camera接口中,我们通过 setPreviewCallback 或 setPreviewCallbackWithBuffer 接口来获取相机预览的帧数据。然而,在 Camera2 中,这些接口以及不复存在了,那么 Camera2 该如何获取预览帧数据呢? 在 Camera2 中,我们通过 ImageReader 类来间接的获取预览帧数据,并在 onImageAvaila...

阿飞的博客 2万+

Android使用Camera2获取预览数据

一、Camera2简介 Camera2是Google在Android 5.0后推出的一个全新的相机API,Camera2和Camera没有继承关系,是完全重新设计的,且Camera2支持的功能也更加丰富,但是提供了更丰富的功能的同时也增加了使用的难度。Google的官方Demo:https://github.com/googlesamples/android-Camera2Basic 二、Came...

qq_18757521的博客 1277

Camera app如何接收到callback消息

app获取callback

xierong1的博客 408

Android Camera2预览和实时帧数据获取

1、预览 2、角度旋转 3、实时帧数据获取ImageReader的参数设置 4、实时帧数据格式转换 package com.neatech.stface.tools; import android.Manifest; import android.app.Activity; import android.content.Context; import android.content.I...

chenhande1990chenhan的专栏 9713

Android Camera2 API实践:实现预览与图像数据捕获

本文还有配套的精品资源,点击获取 简介:介绍了在Android 5.0及以上版本中使用Camera2 API进行相机预览和图像数据捕获的方法。从基础概念到预览设置,再到图像数据的获取和处理,详细阐述了Camera2 API的核心组件和功能,以及如何通过实战示例学习和应用这些技术。 1. Camera2 API基础介绍 1.1 Camera2 API的作用与优...

weixin_42502089的博客 3667

Camera API1和API2对比

Android 5.0对拍照API进行了全新的设计,新增了全新设计的Camera v2 API,这些API不仅大幅提高了Android系统拍照的功能,还能支持RAW照片输出,甚至允许程序调整相机的对焦模式、曝光模式、快门等。 一、 api1主要类(包名android.hardware.Camera): Camera api1调用流程比较直观,也利于理解一些,应用程序实例化camera这一个类就可以...

yaoming168的专栏 8702

Unity3D Pico VR 手势交互实战:基于MRTK3实现抓握与射线控制

本文针对Pico VR原生手势交互功能不足的问题,提供了基于MRTK3实现高级手势交互的实战解决方案。通过将MRTK3成熟的交互框架与Pico的手势追踪能力相结合,详细讲解了从环境配置、SDK导入、核心适配到真机调试的全流程,帮助开发者高效实现抓握与射线控制等复杂交互,有效提升Pico VR应用的开发效率与体验。

weixin_29011667的博客 391

【可信数据空间-连接器技术架构设计方案】

一句话概括连接器是可信数据空间的“数据保镖”和“外交官”。连接器就是一个部署在你本地的软件代理,它代表你安全地对外提供数据服务,确保在共享数据价值的同时,牢牢守住数据的所有权和控制权。它是实现“数据可用不可见”这一理想的关键技术部件。一个生动的比喻:银行的金库和接待员想象一下,你的数据就是藏在银行金库里的黄金和钞票。金库(你的内部数据库): 绝对安全,外人绝对不能进。接待员(连接器): 坐在银行大厅里,负责与客户打交道。客户向接待员提出请求:“我想取1000元。

u014716614的博客 2267

十分钟实现 Android Camera2 相机预览

因为工作中要使用Android Camera2 API,但因为Camera2比较复杂,网上资料也比较乱,有一定入门门槛,所以花了几天时间系统研究了下,并在优快云上记录了下,希望能帮助到更多的小伙伴。

朱豪凯的博客 1万+

手把手教你用ObjectCRX进行Caxa二次开发:从零开始的环境搭建教程

本文是一份面向零基础初学者的Caxa二次开发实战指南,重点讲解如何使用ObjectCRX框架从零开始搭建开发环境。内容涵盖Visual Studio 2015版本锁定、ObjectCRX向导集成、项目创建、典型错误解决,并最终实现一个可在Caxa中运行的HelloWorld程序,帮助开发者快速入门并避开常见陷阱。

w3x4y的博客 511

Android Camera2在textureView中的预览和拍照

在布局文件加入TextureView控件,然后实现监听事件。然后在OnResume()方法设置监听SurfaceTexture的事件。当SurfaceTexture准备好会回调SurfaceTextureListener的onSurfaceTextureAvailable()方法。@Override//当SurefaceTexture可用的时候,设置相机参数并打开相机。

weixin_42504805的博客 2780

TRK-MPC5634M开发板实战:从硬件解析到CAN、ADC外设驱动调试

在嵌入式系统开发,尤其是汽车电子和工业控制领域,微控制器(MCU)是核心执行单元。其工作原理基于处理器内核、存储器和丰富的外设接口协同工作,通过软件编程实现对硬件的精确控制。这种技术价值在于能够为严苛环境提供可靠、实时的控制解决方案。典型的应用场景包括汽车车身控制、网关、电池管理系统以及工业自动化设备。本文聚焦于恩智浦(NXP)基于Power Architecture e200z0内核的汽车级MCU——MPC5634M,并以其官方评估板TRK-MPC5634M为平台,深入探讨其硬件设计逻辑、软件环境搭建及核

weixin_29997523的博客 288

RK3588 平台imx334 驱动调试记录

rk3588调试imx334

xiaoning132的专栏 1790

Camera Hal3在Framework架构(三):API1与API2区别篇

内容 Camera1.0 Camera2.0 权限 android.permission.CAMERA android.permission.CAMERA 布局 SurfaceView TextureView 实现接口 SurfaceHolder.Callback 1.surfaceCreated 2.surfaceChanged 3.surfaceDestroyed SurfaceTexture...

Flying snow 1万+

汽车IVI中控开发入门及进阶(三十八):手机投屏HiCar开发

为了兼容这部分手机,车机端在向手机端发送USB控制命令字的同时,需要启动mDNS Server,广播车机端IP地址和HiCar SDK侦听的Server Socket端口(IP地址和端口在HiCar SDK初始化USB driver时,告知车机),在检测到手机断开USB连接时关闭mDNS Server。厂商在集成HiCar SDK开发HMI应用时,不可避免会使用到智能座舱的敏感权限,例如位置权限、摄像头权限、麦克风权限等,SDK初始化时,厂商HMI应用需要设置必要的车机参数供SDK使用。

码农17年的博客 1075
上一篇: Camera_API2_notes
下一篇: Ubuntu 18.04 配置android 源码开发/编译环境
十橙
博客等级 码龄24年 312粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值