标签: android-camera2

Camera2 API 使预览填充整个视图

我正在使用 Google Samples ( https://github.com/googlesamples/android-Camera2Basic )中的 Camera2Basic 示例来显示片段内的相机预览。该片段包含一个RelativeLayout 和一个自定义的AutoFitTextureView。后者可以在上面的链接中找到。我调整了布局以将预览居中并删除控制按钮:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/camera_rel">

    <uk.co.deluxe_digital.messngr.AutoFitTextureView
    android:id="@+id/texture"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true" />

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

我在 ViewPager 中显示了总共三个片段。我确实对 Camera2BasicFragment 做了一些小更改,使其成为 android.support.v4.app.Fragment 来与我的 ViewPager 配合使用并删除按钮。

我想要的是让相机预览充满整个屏幕。这可以通过拉伸预览图像来实现。那不是我想要的。有谁知道放大预览或TextureView的方法,以便预览的高度与容器匹配,即使侧面被裁剪掉。我希望它能够填充视图并保持纵横比。这意味着两侧的一些预览都会丢失,但这没关系。

这就是我目前所拥有的: 当前相机预览显示不正确

FloatingActionButton 负责捕获图像。这是主要的家长活动。

即使你能为我指明解决这个问题的正确方向,那也会是一个巨大的帮助!

java android android-layout android-fragments android-camera2

4
推荐指数
1
解决办法
2386
查看次数

Android Camera2 RAW 流媒体

我对 Android 很陌生,并试图:

  • 从相机流式传输原始数据 (ImageFormat RAW_SENSOR)
  • 处理原始数据
  • 以交互方式显示处理结果

似乎原始数据捕获仅在静态捕获模式下可用。这样对吗 ?

如果是这样,是否可以对 RAW 图像执行重复的 CaptureRequests ?使用 13MP 传感器可以获得什么样的性能?任何参考代码?

提前谢谢了,

纪尧姆

编辑

这是我到目前为止所做的:

  • 创建渲染到 SurfaceTexture 的预览捕获
  • 在 onSurfaceTextureUpdated() 中计算/更新帧率

    问题:

    • 在 onSurfaceTextureUpdated() 中计算帧率可以吗?
    • 我试图为 texture.setDefaultBufferSize() 设置不同的尺寸,但它对帧率没有影响。这正常吗?
  • 将原始 ImageReader 的表面添加到 cameraDevice.createCaptureSession()

  • 向 cameraCaptureSessions.setRepeatingRequest() 添加回调
  • 在回调的 onCaptureCompleted() 中,每 N 帧添加一个 captureRawImage() 调用。
  • captureRawImage() 创建静态图像捕获。
  • 将 setOnImageAvailableListener() 添加到原始 ImageReader 以对原始图像做一些有用的事情。

原始分辨率为 4208x3120

最小帧持续时间为 33ms

停顿时间为 200 毫秒

我仅为预览获得的帧速率约为 25-30 fps。

我在预览和启用每帧原始捕获时获得的帧速率约为 15 fps。

我收到一些“ImageReader_JNI:无法获取缓冲区项,很可能客户端试图获取超过 maxImages 个缓冲区”的消息,即使我每 100 帧进行一次原始捕获。

我很想得到一些反馈:

  • 这是否是做我想做的事情的正确方法。
  • 如果效率更高,我如何切换到突发捕获而不是每 N 帧静止图像。
  • 这些初始数字是否有意义。 …

performance android android-camera2

4
推荐指数
1
解决办法
4165
查看次数

CameraX 相当于 Camera2 的 CaptureRequest

我想ImageAnalysis与 CameraX一起使用,但要调整一些相机设置,例如自动对焦或自动白平衡、曝光和帧持续时间。

这是我需要的设置示例以及我如何使用 Camera2 设置它们:

    captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_OFF)
    captureRequestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CameraMetadata.CONTROL_AWB_MODE_OFF)
    captureRequestBuilder.set(CaptureRequest.SENSOR_FRAME_DURATION, FRAME_DURATION_NS)
    captureRequestBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, EXPOSURE_TIME_LIMIT_NS)
Run Code Online (Sandbox Code Playgroud)

如何将其“翻译”到 CameraX?

android android-camera android-camera2 android-camerax

4
推荐指数
1
解决办法
1512
查看次数

androidcamera2createCaptureSession 已弃用

CameraDevice.createCaptureSession 大部分已被弃用。有关如何将剩余版本方法与 SessionConfiguration 参数(尤其是执行程序参数)一起使用的任何示例都会很好。

目前我有:

cameraDevice.createCaptureSession(surfaceList, mCameraSessionListener, mCameraHandler);
Run Code Online (Sandbox Code Playgroud)

android android-camera2

4
推荐指数
1
解决办法
5521
查看次数

Camera2:设置光学稳定不起作用(OIS)

我有三星 S10,它具有视频稳定功能。使用系统默认的相机应用程序,我可以看到启用和未启用时的区别:首先,如果启用,则会出现一些缩放预览,其次,在设备移动期间会很明显。

在此输入图像描述

我尝试使用 Camera2 API、全高清和后置摄像头(与默认系统应用程序相同)在自己的应用程序中启用稳定性。

我测试了characteristics.get(CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES)仅返回CONTROL_VIDEO_STABILIZATION_MODE_OFF,因此不支持此操作。

characteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION)CameraMetadata.LENS_OPTICAL_STABILIZATION_MODE_ON

因此,据我所知,这正是启用视频稳定(光学)的选项,应该与默认系统应用程序中的相同。

但是,当我对相机捕获会话配置进行下一步时,它不会改变任何内容,没有缩放预览(与默认系统相机应用程序一样),并且在移动过程中没有变化,因此视频在我的应用程序中与它应该有的相同使用默认相机应用程序并禁用视频稳定功能

captureRequestBuilder.set(
    CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE,
    CameraMetadata.LENS_OPTICAL_STABILIZATION_MODE_ON
)
Run Code Online (Sandbox Code Playgroud)

所以设置这个参数不会改变任何东西。

为什么视频稳定功能在默认系统相机应用程序中有效,但在我自己使用 Camera2 API 的应用程序中无效?

android android-camera android-camera2

4
推荐指数
1
解决办法
2516
查看次数

如何在Android中正确使用camera2中的新createCaptureSession()?

已弃用的createCaptureSession()方法在旧代码中按以下方式使用:

cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
     @Override
     public void onConfigured(@NonNull CameraCaptureSession session) {
         if (mycameraDevice == null){
             return;
         }
         cameraCaptureSession = session;
         if (cameraDevice == null){
             return;
         }
         captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
         try {
             cameraCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, mBackgroundHandler);
         } catch (CameraAccessException e) {
             e.printStackTrace();
         }
     }
     @Override
     public void onConfigureFailed(@NonNull CameraCaptureSession session) {
         Toast.makeText(MainActivity.this, "Configuration Failed! :(", Toast.LENGTH_SHORT).show();
     }
 }, null); 
Run Code Online (Sandbox Code Playgroud)

我还在 StackOverflow 上发现了这个问题,其中我们必须执行以下操作:

SessionConfiguration sessionConfiguration = new SessionConfiguration(SessionConfiguration.SESSION_REGULAR, Collections.singletonList(outputConfiguration), new HandlerExecutor(mCameraHandler.getLooper()), mCameraSessionListener);
cameraDevice.createCaptureSession(sessionConfiguration);
Run Code Online (Sandbox Code Playgroud)

首先,这是正确的使用方法吗?如果是,那么outputConfiguration是什么以及如何正确声明它?在 Youtube 教程中,从未创建任何输出配置!

那么我需要进行哪些更改才能再次使用该代码?

camera android android-camera2

4
推荐指数
1
解决办法
4634
查看次数

Android使用Camera2以编程方式打开/关闭相机闪光灯

我正在制作一个充当手电筒的简单应用程序.我需要能够使用Camera2 API从应用程序中的按钮打开和关闭闪存,因为我使用旧的相机API出错了.我想使用"手电筒"手电筒,相机无需打开即可开启闪光灯.我知道这是可能的,因为很多手机在快速设置菜单中都有闪光灯开/关,但我找不到任何关于如何操作的代码或教程.

码:

Camera cam = Camera.open();     
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.startPreview();
Run Code Online (Sandbox Code Playgroud)

我在使用Android 6.0.1的Nexus 6P上运行.

编辑:我需要使用Camera2 API.我还没有找到一个很好的教程,在得到答案之后,我将在这里创建一个Q/A格式.

android android-camera android-camera2

3
推荐指数
1
解决办法
2万
查看次数

Android Camera2 API JPEG_QUALITY不可用

我正在尝试使用Android处理我的Nexus 5x Camera2 APIs并使用googlesamples android-Camera2Basic

我的问题是JPEG图像的质量太低,而且它的尺寸远小于我用手机相机应用拍摄的常规图像.

根据谷歌文档JPEG_QUALITY,CaptureRequest和CaptureResult中都应该有一个键:

JPEG_QUALITY

在API级别21中添加

密钥JPEG_QUALITY

最终JPEG图像的压缩质量.

85-95是典型的使用范围.

有效值范围:

1-100; 越大越高质量

此密钥适用于所有设备.

但是,当我要求可用的密钥时,JPEG_QUALITY密钥不可用,所以我不知道如何知道我目前使用的JPEG压缩质量是什么以及如何更改它.

我在里面做的代码:

CameraCaptureSession.CaptureCallback CaptureCallback
                = new CameraCaptureSession.CaptureCallback() {

            @Override
            public void onCaptureCompleted(@NonNull CameraCaptureSession session,
                                           @NonNull CaptureRequest request,
                                           @NonNull TotalCaptureResult result) {


                //_TEST_DEBUG
                List<CaptureRequest.Key<?>> requestKeys = request.getKeys();
                List<CaptureResult.Key<?>> resultKeys = result.getKeys();
Run Code Online (Sandbox Code Playgroud)

requestKeys&resultKeys有许多键,包括JPEG_ORIENTATION但不是JPEG_QUALITY键.

知道我做错了什么吗?为什么我找不到如何改变JPEG压缩质量?

谢了,兄弟们

android android-camera2

3
推荐指数
1
解决办法
2307
查看次数

Android NDK Camera2 API

有人可以提供一个简短的示例,说明如何使用NDK,C ++ Camera 2 API捕捉相机框架吗?

我找不到任何有意义的资源,因为它是一种全新的API,但是感谢您的帮助。

谢谢!

c++ android-ndk android-camera2

3
推荐指数
1
解决办法
1653
查看次数

在Android camera2下将YUV_420_888转换为位图的图像不正确

我正在尝试将YUV_420_888图像转换为来自camera2预览的位图。但是输出图像的颜色不正确。

接下来是我正在运行的用于生成位图的测试代码。仅是测试代码,因此请不要对不相关的因素进行任何代码审查,例如,位图将被回收,或者将连续创建RenderScript。该代码仅用于测试从YUV到RGB的转换,仅此而已。

其他因素是,该代码应从API 22及更高版本运行,因此使用RenderScript特定的ScriptIntrinsicYuvToRGB应该足够,而不必使用旧的手动转换,由于缺乏适当的YUV_420_888支持,因此仅在以前的Android版本中才需要使用。

由于RenderScript已经提供了专用于处理所有类型的YUV转换的ScriptIntrinsicYuvToRGB,我认为问题可能出在如何从Image对象获取YUV字节数据,但我无法弄清楚问题出在哪里。

要在Android Studio中查看输出位图,请在bitmap.recycle()中放置一个断点,因此在回收之前,可以使用“查看位图”选项在“变量调试”窗口中对其进行查看。

请让我知道是否有人可以发现转换的问题:

@Override
public void onImageAvailable(ImageReader reader)
{
    RenderScript rs = RenderScript.create(this.mContext);

    final Image image = reader.acquireLatestImage();

    final Image.Plane[] planes = image.getPlanes();
    final ByteBuffer planeY = planes[0].getBuffer();
    final ByteBuffer planeU = planes[1].getBuffer();
    final ByteBuffer planeV = planes[2].getBuffer();

    // Get the YUV planes data

    final int Yb = planeY.rewind().remaining();
    final int Ub = planeU.rewind().remaining();
    final int Vb = planeV.rewind().remaining();

    final ByteBuffer yuvData = ByteBuffer.allocateDirect(Yb + Ub + Vb);

    planeY.get(yuvData.array(), 0, Yb);
    planeU.get(yuvData.array(), Yb, …
Run Code Online (Sandbox Code Playgroud)

android bitmap yuv android-camera2

3
推荐指数
1
解决办法
1692
查看次数