标签: android-camera2

会话已关闭;进一步的更改是非法的

我正在阅读有关此的许多报告,但仍然找不到适合我的答案。有时,在使用camera2捕获后,会引发异常:java.lang.IllegalStateException:会话已关闭;进一步的更改是非法的。我尝试检查所有会话在执行某项操作时是否不为空,但仍然可以得到。有什么建议吗?我还应该处理其他什么?=,我不知道吗?

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

        private void process(CaptureResult result) {
            switch (mState) {
                case STATE_PREVIEW: {

                    if(touchFocusEnabled) {
                        letSetCaptureSessionOnce = true;
                        mState = STATE_WAITING_LOCK;
                        try {
                            // Reset the auto-focus trigger
                            mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
                                    CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
                            mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
                                    CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE);

                            mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback,
                                    mHandler);
                        } catch (CameraAccessException e) {
                            L.e("CameraLolipop --- CameraCaptureSession.CaptureCallback " + e);
                        }
                    } else {
                        if(letSetCaptureSessionOnce) {
                            try {
                                if ((null != mCaptureSession) && (isCameraOpen)) {
                                    mState = STATE_PREVIEW;
                                    mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback,
                                            mHandler);
                                    letSetCaptureSessionOnce = true;
                                }

                            } catch (CameraAccessException …
Run Code Online (Sandbox Code Playgroud)

camera android android-camera2

6
推荐指数
1
解决办法
5314
查看次数

使用APL(Android编程语言)为Android虚幻引擎4制作Android插件

我正在尝试为Android相机API 2开发虚幻引擎4插件.

正如我可以在虚幻引擎论坛上看到的那样,有两种可能为Android制作插件.

第一,包括修改UE Android基础项目(GameActivity).

第二个是独立的插件,它带来了在任何项目中添加插件的可移植性.

根据这篇文章,有可能制作一个相机Api1独立插件,它使用APL.xml文件添加java代码.

但我认为它非常局限于游戏活动,如下面的代码.

<?xml version="1.0" encoding="utf-8"?>
<!--ARToolKit plugin additions-->
<root xmlns:android="http://schemas.android.com/apk/res/android">
 <!-- init section is always evaluated once per architecture -->
 <init>
   <log text="AndroidCamera init"/>
 </init>

 <androidManifestUpdates>
   <addPermission android:name="android.permission.CAMERA"/>
   <addFeature android:name="android.hardware.camera"/>
   <addFeature android:name="android.hardware.camera.autofocus"/>
 </androidManifestUpdates>

 <!-- optional additions to the GameActivity imports in GameActivity.java -->
 <gameActivityImportAdditions>
   <insert>
import android.widget.Toast;
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PreviewCallback;
import android.graphics.SurfaceTexture;
import android.graphics.ImageFormat;
import android.graphics.PixelFormat;
import java.util.List; 
import java.io.IOException;
import android.util.Log;
   </insert>
 </gameActivityImportAdditions>

 <gameActivityClassAdditions>
   <insert>
     static …
Run Code Online (Sandbox Code Playgroud)

android unreal-engine4 android-camera2

6
推荐指数
1
解决办法
1681
查看次数

Android camera2 api触控焦点的例子?

嗨,我正在使用camera2basic示例来实现我的camera2应用程序.我找不到任何好的例子来实现触摸以使用camera2 api进行聚焦.目前我用于触控的代码是:

    private void setFocusArea(MotionEvent event) {
    if (mCameraId == null) return;
    CameraManager cm = (CameraManager)getActivity().getSystemService(Context.CAMERA_SERVICE);
    CameraCharacteristics cc = null;
    try {
        cc = cm.getCameraCharacteristics(mCameraId);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }

    int myX = (int)event.getX();
    int myY = (int)event.getY();
    MeteringRectangle focusArea = new MeteringRectangle(myX-100,myY-100,200,200,MeteringRectangle.METERING_WEIGHT_DONT_CARE);
    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
    try {
        mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback,
                mBackgroundHandler);
        // After this, the camera will go back to the normal state of preview.
        mState = STATE_PREVIEW;
    } catch (CameraAccessException e){
        // log
    }

    if (isMeteringAreaAESupported(cc)) {
        mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS, …
Run Code Online (Sandbox Code Playgroud)

android autofocus camera2 android-camera2

6
推荐指数
1
解决办法
2827
查看次数

使用 android camera2 API 手动对焦

我想为自己开发一个Android相机应用程序(如果有兴趣的人可以分享它),它在视频录制时具有手动对焦。

我已经在谷歌示例Camera2 应用程序中添加了一个 SeekBar,但我找不到实现手动对焦的方法。

在 camera2, android 中找到了手动对焦,但它在我的 LG G4 上不起作用。库存相机应用程序几乎是完美的,因为它不允许在视频模式下手动对焦。

你们中有人有想法吗?

编辑:这是 SeekBar 侦听器的代码:

@Override
public void onStopTrackingTouch(SeekBar seekBar) {}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
    mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_OFF);
}

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    float minimumLens = characteristics.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE);
    float num = (((float)progress) * minimumLens / 100);
    mPreviewBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, num);
}
Run Code Online (Sandbox Code Playgroud)

api android focus lg android-camera2

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

Camera2 api Imageformat.yuv_420_888 旋转图像的结果

关于camera2 api和RAW图像格式有很多问题,但在网上搜索我仍然没有找到答案(这就是我在这里的原因顺便说一句)。

我正在尝试使用ImageReader和 setRepeatingRequest 与前置摄像头对摄像头捕获的帧进行一些实时图像处理。正如之前的一些帖子所建议的,我正在以 RAW 格式(特别是 Imageformat.yuv_420_888)获取图像,以便获得大约 30fps 的帧速率:

  imageReader = ImageReader.newInstance(width, height, ImageFormat.YUV_420_888, 2); 
Run Code Online (Sandbox Code Playgroud)

我的图像处理算法需要 RGB 图像作为输入,所以我需要从 YUV 转换为 RGB。为此,我使用ScriptIntrinsicYuvToRGB

  private static Bitmap YUV_420_888_toRGBIntrinsics(Image image) {

    if (image == null) return null;

    int W = image.getWidth();
    int H = image.getHeight();

    Image.Plane Y = image.getPlanes()[0];
    Image.Plane U = image.getPlanes()[1];
    Image.Plane V = image.getPlanes()[2];

    int Yb = Y.getBuffer().remaining();
    int Ub = U.getBuffer().remaining();
    int Vb = V.getBuffer().remaining();

    byte[] data = new byte[Yb + Ub + Vb];


    Y.getBuffer().get(data, 0, …
Run Code Online (Sandbox Code Playgroud)

android image-processing yuv renderscript android-camera2

6
推荐指数
1
解决办法
2567
查看次数

Camera2Basic app前置摄像头拍摄照片

我试过谷歌的android-Camera2Basic示例应用程序.对于前置摄像头,我在Camera2BasicFragment中更改了一些代码.变化如下.

要切换到的前置摄像头我已经改变mCameraId = cameraId;mCameraId = "1";setUpCameraOutputs(int width, int height)方法.

并添加如果条件在结束时setUpCameraOutputs(int width, int height),

if(mCameraId == null)
    mCameraId = cameraId;
Run Code Online (Sandbox Code Playgroud)

此更改完美显示前置摄像头,但不选择照片.所以我换了

mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback,
                        mBackgroundHandler);
Run Code Online (Sandbox Code Playgroud)

captureStillPicture();
Run Code Online (Sandbox Code Playgroud)

lockFocus().现在前置摄像头拍摄照片,但它看起来颠倒了.

例如:

样本图像

我现在不知道该怎么办.

我的要求是使用camera2 api在两个摄像头中捕捉照片.所以,如果我做错了什么,请纠正我.

在某些设备中,此应用程序只需单击即可拍摄多张照片.

camera android android-camera2

6
推荐指数
1
解决办法
459
查看次数

Camera2 - 获取静态捕捉位图的最有效方法

首先问一个问题:在ImageReader知道我总是将捕获转换为 的情况下,初始化和使用camera2 api 的最有效方法是什么Bitmap

我正在尝试 Android Camera2 示例,一切都运行得很好。然而,出于我的目的,我总是需要对捕获的静态图像执行一些后期处理,为此我需要一个Bitmap对象。目前我正在使用来自(我正在解释)的BitmapFactory.decodeByteArray(...)字节。ImageReader.acquireNextImage().getPlanes()[0].getBuffer()虽然这可以接受,但我仍然觉得应该有一种方法可以提高性能。捕获的内容被编码ImageFormat.Jpeg,需要再次解码才能得到Bitmap,这似乎是多余的。理想情况下,我会获取它们PixelFormat.RGB_888并使用将其复制到位图Bitmap.copyPixelsFromBuffer(...),但使用该格式初始化似乎并不ImageReader具有可靠的设备支持。YUV_420_888可能是另一种选择,但环顾四周,似乎需要跳过一些环节才能解码为Bitmap. 有推荐的方法吗?

android bitmap android-camera2

6
推荐指数
1
解决办法
2161
查看次数

glReadPixels 很慢

我正在使用 GLSurfaceView 创建自定义相机预览,使用 OpenGl 渲染相机提供给我的帧。我已经完全实现了相机,并按照我期望的方式工作,没有 fps 损失和正确的纵横比等。但是当我需要捕获来自相机源的帧时,问题出现了,我的第一个想法是使用 glReadPixles ()

使用 GLES20.glReadPixels() 我发现某些设备会出现 fps 损失,主要是屏幕分辨率较高的设备,这是有道理的,因为 glReadPixels 需要以更高分辨率读取更多像素。

我做了一些挖掘,发现其他人对 glReadPixels 也有类似的问题,许多人建议使用 PBO,最好使用其中两个作为双缓冲区,这将允许我读取像素数据,而不会阻塞/停止当前的渲染过程。我完全理解双缓冲的概念,我对 OpenGL 相当陌生,需要一些关于如何让双缓冲 PBO 工作的指导。

我找到了一些 PBO 双缓冲的解决方案,但我永远找不到完整的解决方案来完全理解它如何与 GLES 交互。

我的 GLSurfaceView.Renderer.onDrawFrame() 实现

    // mBuffer and mBitmap are declared and allocated outside of the onDrawFrame Method

    // Buffer is used to store pixel data from glReadPixels
    mBuffer.rewind();


    GLES20.glUseProgram(hProgram);
    if (tex_matrix != null)
    {
        GLES20.glUniformMatrix4fv(muTexMatrixLoc, 1, false, tex_matrix, 0);
    }
    GLES20.glUniformMatrix4fv(muMVPMatrixLoc, 1, false, mMvpMatrix, 0);

    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, tex_id);
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, GLConstants.VERTEX_NUM);
    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0); …
Run Code Online (Sandbox Code Playgroud)

android opengl-es-2.0 android-camera2

6
推荐指数
1
解决办法
1931
查看次数

Camera2控制的连拍模式

因此,我们正在尝试制作一个可在您旋转设备时(大约每3个角度)拍照的应用程序。但是,使用camera2时,我们旋转设备:

  1. 每次拍照时,预览都会滞后
  2. 几张图像后,onCaptureFailed触发,代码为0

我仍在尝试弄清Camera2(似乎很多人认为它非常棒,因此我想尽全力,但它相当复杂)。我下载了RAW示例(https://github.com/googlesamples/android-Camera2Raw),并对其进行了修改,使其能够如上所述工作。

以前,我们使用过时的相机api,该api在Samsung s8-BUT上可100%正常工作,但在旧设备上会失败,因为拍摄图像的速度太快而无法处理。但是,我看到这些较旧的设备实际上确实允许一个人拍摄连拍照片-因此,相机2肯定可以以某种方式使用此功能吗?

请注意:我不想拍摄连拍照片,因为这会导致在角度尚未改变的情况下拍摄图像。这是我需要更改的代码:

 // Gets called whenever the sensor gives me a value. calculates if it is time to take the next photo
 private void updateAngle(double angle) {
    mCurrentAngle = angle;
    double photoAngle = angle - mOffset < 0 ? CONST_360 + angle - mOffset : angle - mOffset;

    if (photoAngle < mPrevAngle) {
        tvZAxis.setText("You are going the wrong way");
        Log.w("BROKEN", mPrevAngle + "  " + photoAngle);
        return;
    }

    if (mStart) {
        double diff …
Run Code Online (Sandbox Code Playgroud)

android android-camera2

6
推荐指数
0
解决办法
162
查看次数

Android Camera2 预览被拉伸

我正在尝试学习 Camera2 API,并且我已经构建了一个简单的相机应用程序只是为了拍照,但我面临的问题是预览对于某些分辨率来说会被拉伸。我浏览了许多不同的帖子,所有这些帖子都表明我的宽高比可能是错误的,但我使用了谷歌推荐的 AutoFitTextureView 以及正确的宽高比,但我的预览仍然被拉伸。我从 Playstore 下载了一些开源相机应用程序,其中很多应用程序也与我的前置摄像头存在相同的问题(除了开放式相机),但有趣的是我在另一台设备上使用了相同的应用程序,并且预览绝对完美。所以最后我决定用不同的分辨率测试我的应用程序并观察结果,但我找不到任何模式有人可以帮助我理解它吗???

my device display size is 720x1280
Front camera results: 
SurfaceTexture        AutoFitTextureView         Result
buffer size           size       
2576x1932             720x960                    Normal
2560x1440             720x1280                   Normal
2048x1536             720x960                    Normal
2048x1152             720x1280                   Normal
1920x1920             720x720                    Normal
1920x1080             720x1280                   Normal
1440x1080             720x960                    Horizontally Stretched
1280x720              720x1280                   Horizontally Stretched
1072x1072             720x720                    Normal
960x720               720x960                    Normal
720x480               720x1080                   Horizontally Stretched
640x480               720x960                    Horizontally Stretched
352x288               720x880                    Normal
320x240               720x960                    Normal
256x144               720x1280                   Horizontally Stretched
176x144               720x880                    Normal
Run Code Online (Sandbox Code Playgroud)

android preview android-camera android-camera2

6
推荐指数
1
解决办法
1977
查看次数