标签: android-camera2

在Landscape中,Android Camera2 Preview旋转90度

我正在关注youtube教程,试图学习Camera2 API.当然,我正在学习这个,同时我正在开发自己的应用程序.教程和我的应用程序之间的一个不一致之处在于,只有当我的应用程序必须处于横向状态时,教程才能使相机处于纵向模式.

我目前能够查看相机的预览,但是当我的应用程序是横向或水平时,相机预览看起来旋转了90度.这几乎感觉我可以旋转TextureView,但这看起来似乎不正确,就像我拍照时一样,它会被错误地旋转.

下面是与图像大小有关的代码(整个代码很长)

private void setupCamera(int width, int height) {
    CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    try {
        CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(camera_id);
        StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
        cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
        mPreviewSize = getPreferredPreviewSize(map.getOutputSizes(SurfaceTexture.class), width, height);
        mCameraId = camera_id;
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}


//TODO Look for a way to make this horizontal
private Size getPreferredPreviewSize(Size[] mapSizes, int width, int height) {
    List<Size> collectorSizes = new ArrayList<>();
    for (Size option : mapSizes) {
        if (width > height) { //If …
Run Code Online (Sandbox Code Playgroud)

android android-camera2

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

ImageReader使相机滞后

我遇到的问题是我使用ImageReader除了有一个SurfaceView用于显示相机的输出.我已经添加了SurfaceView本身和ImageReader的表面(并添加了ImageReader监听器以便在新图像上接收事件):

preview.addTarget(_surfaces.get(1)); //ImageReader surface
preview.addTarget(_surfaces.get(0)); //SurfaceView of the layout
Run Code Online (Sandbox Code Playgroud)

但是,如果我删除ImageReader,应用程序工作正常(没有滞后于相机).但是一旦ImageReader表面被添加,相机就会滞后很多.任何人都有任何想法,以使相机运行更顺畅?ImageReader的创建方式如下:

reader = ImageReader.newInstance(640, 480, ImageFormat.JPEG, 1);
Run Code Online (Sandbox Code Playgroud)

我猜测滞后可能是因为图像必须在布局的SurfaceView和ImageReader本身上呈现两次(?)

android android-camera android-camera2

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

Camera2 API设置自定义白平衡和温度颜色

我正在尝试在相机应用中为白平衡和温度颜色设置自定义值.我正在使用camera2 API,我正在尝试不同的方法来设置此值.我从excel文件中找到了一个方法,从白平衡值到100到100.000之间获得正确的RGB温度矩阵[红色,绿色,蓝色].

我将此方法附加到Seekbar并且其工作正常,当我尝试将某些东西聚焦时,我的问题出现,然后它变成粉红色.屏幕上任何一种灯都像粉红色的火炬.

在此输入图像描述

我正在以这种方式设置值:

mPreviewRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_MODE, CaptureRequest.COLOR_CORRECTION_MODE_TRANSFORM_MATRIX);

RggbChannelVector rggb = getTemperatureVector(seekBackSelectedTemperature);

mPreviewRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_GAINS, myRggbChannelVector);
Run Code Online (Sandbox Code Playgroud)

换句话说,我获取矩阵的方法是这样的:

 public static RggbChannelVector getTemperatureVector (int WhiteBalanceValue){


    float InsertTemperature = WhiteBalanceValue;
    float temperature = InsertTemperature / 100;
    float red;
    float green;
    float blue;

    //Calculate red

    if (temperature <= 66)
        red = 255;
    else {
        red = temperature - 60;
        red = (float) (329.698727446 * (Math.pow((double) red, -0.1332047592)));
        if (red < 0)
            red = 0;
        if (red > 255)
            red = 255;
    }


    //Calculate green
    if (temperature <= 66) …
Run Code Online (Sandbox Code Playgroud)

rgb camera android android-camera android-camera2

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

在Camera2 API中切换闪光灯

我的问题是当我在不同的闪存模式之间切换然后想要捕获图像时,我的captureBuilder将不会设置所选的闪存模式.它仅在我关闭并重新打开相机时才有效.

我以https://github.com/googlesamples/android-Camera2Basic为出发点.

我的方法:

   private void captureStillPicture() {
  try {
     final Activity activity = (Activity) context;
     if (null == activity || null == mCameraDevice) {
        return;
     }
     // This is the CaptureRequest.Builder that we use to take a picture.
     CaptureRequest.Builder captureBuilder =
           mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
     captureBuilder.addTarget(mImageReader.getSurface());

     // Use the same AE and AF modes as the preview.
     captureBuilder.set(CaptureRequest.CONTROL_AF_MODE,
           CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
     setCurrentFlash(captureBuilder);

     // Orientation
     int rotation = activity.getWindowManager()
           .getDefaultDisplay()
           .getRotation();
     captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation));

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

              @Override
              public void onCaptureCompleted(@NonNull CameraCaptureSession …
Run Code Online (Sandbox Code Playgroud)

android android-camera camera-flash android-camera2

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

使用Android camera2 API打开/关闭闪光灯无法正常工作

我正在创建一个带有自定义相机的Android应用程序,我正在切换到新的camera2 API.我有一个按钮,可以在后置摄像头开启时打开和关闭闪光灯(不停止摄像头,就像任何经典的相机应用程序一样).

当我点击闪存图标时,没有任何反应,这就是logcat返回的内容:

D/ViewRootImpl: ViewPostImeInputStage processPointer 0
D/ViewRootImpl: ViewPostImeInputStage processPointer 1
Run Code Online (Sandbox Code Playgroud)

我不知道为什么它不起作用.这是代码:

我有一个RecordVideoActivity使用RecordVideoFragment.这是片段的XML部分,其中包含flash按钮代码:

<ImageButton
    android:id="@+id/button_flash"
    android:src="@drawable/ic_flash_off"
    android:layout_alignParentLeft="true"
    style="@style/actions_icons_camera"
    android:onClick="actionFlash"/>
Run Code Online (Sandbox Code Playgroud)

和Java代码:

ImageButton flashButton;
private boolean hasFlash;
private boolean isFlashOn = false;
Run Code Online (Sandbox Code Playgroud)

随着onViewCreated:

@Override
public void onViewCreated(final View view, Bundle savedInstanceState) {
    ...
    [some code]
    ...
    // Flash on/off button
    flashButton = (ImageButton) view.findViewById(R.id.button_flash);
    // Listener for Flash on/off button
    flashButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            actionFlash();
        }
    });
Run Code Online (Sandbox Code Playgroud)

这是actionFlash()函数定义:

private …
Run Code Online (Sandbox Code Playgroud)

camera android camera2 android-camera2

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

处理程序postDelayed-每秒打印一些内容

我想使用来打印当前秒handler。我精确地录制了视频,10 seconds并且想要设置TextView每秒的文本。

录制10秒的工作原理如下:

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
           stopRecordingVideo();
    }
}, 11000);  // don't know why 11000 but it only works this way
Run Code Online (Sandbox Code Playgroud)

10秒钟后,该方法stopRecordingVideo()将执行。那么,如何每秒更改TextView的文本呢?

video android handler android-camera2

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

Android Camera2 API - 设置 AE 区域不起作用

在我的 Android Camera2 API 项目中,我想为我的曝光计算设置一个区域。不幸的是它不起作用。另一方面,焦点区域工作没有任何问题。

设备:三星 S7 / Nexus 5

1.) CONTROL_AF_MODE & CONTROL_AE_MODE 的初始值

mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
Run Code Online (Sandbox Code Playgroud)

2.) 创建 MeteringRectangle 列表

meteringFocusRectangleList = new MeteringRectangle[]{new MeteringRectangle(0,0,500,500,1000)};
Run Code Online (Sandbox Code Playgroud)

3.) 检查设备是否支持并设置 CONTROL_AE_REGIONS(与 CONTROL_AF_REGIONS 相同)

if (camera2SupportHandler.cameraCharacteristics.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AE) > 0) {
      camera2SupportHandler.mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS, meteringFocusRectangleList);
}
Run Code Online (Sandbox Code Playgroud)

4.) 告诉相机开始曝光控制

camera2SupportHandler.mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CameraMetadata.CONTROL_AE_PRECAPTURE_TRIGGER_START);
Run Code Online (Sandbox Code Playgroud)

CONTROL_AE_STATE 始终在 CONTROL_AE_STATE_SEARCHING 中,但不使用配置的区域...

android android-camera android-camera2

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

Camera2 API 和 java.lang.IllegalStateException

我正在创建一个支持已弃用和新相机 API 的应用程序。第一个很有魅力,但我正在努力使用 Camera2 API。在测试阶段,我注意到了奇怪的行为。测试设备是带有 android 6.0.1 的三星 Galaxy S5 当我按下电源/结束键然后返回应用程序时,这就是我得到的(不是每次都发生):

03-12 16:14:32.704 24117-24117/pl.tripper.tripper E/MainActivity: onPause
03-12 16:14:32.774 24117-24128/pl.tripper.tripper E/BufferQueueProducer: [SurfaceTexture-1-24117-2] dequeueBuffer: BufferQueue has been abandoned
03-12 16:14:32.784 24117-24145/pl.tripper.tripper E/BufferQueueProducer: [SurfaceTexture-1-24117-2] queueBuffer: BufferQueue has been abandoned
03-12 16:14:33.044 24117-24128/pl.tripper.tripper E/BufferQueueProducer: [SurfaceTexture-1-24117-2] cancelBuffer: BufferQueue has been abandoned
03-12 16:14:33.044 24117-24145/pl.tripper.tripper E/BufferQueueProducer: [SurfaceTexture-1-24117-2] cancelBuffer: BufferQueue has been abandoned
03-12 16:14:33.054 24117-24129/pl.tripper.tripper E/BufferQueueProducer: [SurfaceTexture-1-24117-2] cancelBuffer: BufferQueue has been abandoned
03-12 16:14:33.054 24117-24128/pl.tripper.tripper E/BufferQueueProducer: [SurfaceTexture-1-24117-2] cancelBuffer: BufferQueue has been abandoned
03-12 16:14:33.264 24117-24117/pl.tripper.tripper E/CameraNewApi: …
Run Code Online (Sandbox Code Playgroud)

android surfaceview android-camera android-camera2

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

Android Camera2 API设置了自定义亮度,对比度,伽玛

由于还没有明确的答案,并且stackoverflow还没有关于Camera 2 API Gamma的问题/答案,因此我寻求使用Android Camera 2 API修改亮度,对比度和Gamma的解决方案。
我的代码来获取范围步骤

Rational controlAECompensationStep = characteristics.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP);
if (controlAECompensationStep != null) {
    compensationStep = controlAECompensationStep.doubleValue();
}

Range<Integer> controlAECompensationRange = characteristics.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE);
if (controlAECompensationRange != null) {
    minCompensationRange = controlAECompensationRange.getLower();
    maxCompensationRange = controlAECompensationRange.getUpper();
}
Run Code Online (Sandbox Code Playgroud)

我的方法以百分比设置亮度

public void setBrightness(int value) {
    int brightness = (int) (minCompensationRange + (maxCompensationRange - minCompensationRange) * (value / 100f));
    previewRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, brightness);
    applySettings();
}
private void applySettings() {
    try {
        captureSession.setRepeatingRequest(previewRequestBuilder.build(), null, …
Run Code Online (Sandbox Code Playgroud)

android android-camera android-camera2

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

Android Camera2 vs NDK Native Camera API

Android 最近宣布了原生Camera API ,根据他们的说法,它相当于 Java android.hardware.camera2类。我们什么时候应该考虑使用 NDK/C++ API?如果我们使用 C++ 代码,是否有任何性能改进——比如预处理帧?他们的原生 API 是否允许您插入可以作为 HAL3 管道一部分的代码,例如图像处理/计算机视觉代码?

performance hal android-ndk android-camera android-camera2

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