标签: android-camera2

Camera2 Api..java.lang.IllegalArgumentException:Surface没有有效的原生Surface

我试图将Camera2 api集成到我的app.Its工作正常,最初捕获图像.但是当我第二次拍摄时预览没有来.我在genymotion nexus 5模拟器中测试了它.与所有例子结合.预览是不是第二次抢购.也得到了这个错误.java.lang.IllegalArgumentException:Surface没有有效的原生Surface ...

我按照这两个代码 http://inducesmile.com/android/android-camera2-api-example-tutorial/?cid=519 Github-Camera2Master.请帮助任何人解决此错误并提供一些链接以获取更多详细解释相机2 api

package com.example.cameraapi;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.ImageFormat;
import android.graphics.SurfaceTexture;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CameraMetadata;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.TotalCaptureResult;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.media.Image;
import android.media.ImageReader;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.util.Size;
import android.util.SparseIntArray;
import android.view.Surface;
import android.view.TextureView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import …
Run Code Online (Sandbox Code Playgroud)

android android-camera2

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

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中重用MediaRecorder的Surface?

因此,整个周末我都使用camera2 API玩了。现在,我开始了解事物如何连接在一起。在测试api来实现视频录制应用程序时,我碰壁了。

我首先根据需要更改了Android Camera2Video示例。让我感到困扰的是,在每次录制过程之后,都将重新创建摄像机会话。更糟糕的是,当开始录制会话时,发生的情况是预览会话将首先被破坏并创建录制会话。录制会话完成后,它将被销毁并创建一个新的预览会话。

该文档明确指出:

创建会话是一项昂贵的操作,可能需要几百毫秒的时间... CameraCaptureSession文档

当我点击“录制”并停止时,结果看起来非常丑陋,并且屏幕结巴。我想改善这种行为,所以我摆弄了代码。

现在要做的是创建我的一个,并且仅CameraSession在其中添加我的预览图面(a TextureView)以及MediaRecorder通过调用其getSurface方法从已经创建的图面中添加该图面。这对于第一个视频效果很好,但是当我尝试捕获第二个视频时,我得到了一个IllegalArgumentException: Bad argument passed to camera service。我想,这是因为表面MediaRecorder是我传递给CameraSession在它的创作以某种方式破坏或改变时,我重置MediaRecorder准备一个新的记录。

我现在的问题是,有什么办法可以解决这个问题?(setInputSurface(Surface surface))可能是,但api级别太高,所以我没有对其进行测试。

以下是有关代码段的快速概述:

  1. 设置 MediaRecorder

    private void setUpMediaRecorder() throws IOException {
        if (mMediaRecorder == null) {
            mMediaRecorder = new MediaRecorder();
        }
        mMediaRecorder.setVideoEncodingBitRate(5000000);
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mMediaRecorder.setVideoFrameRate(24);
        mMediaRecorder.setVideoSize(mVideoSize.getWidth(), mVideoSize.getHeight());
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        mMediaRecorder.setOrientationHint(SENSOR_ORIENTATION_DEFAULT_DEGREES);
        mNextVideoAbsolutePath = getVideoFilePath();
        mMediaRecorder.setOutputFile(mNextVideoAbsolutePath);
        mMediaRecorder.prepare();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建所有强大的录音会话

    SurfaceTexture texture = mTextureView.getSurfaceTexture();
    texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
    
    List<Surface> …
    Run Code Online (Sandbox Code Playgroud)

video android mediarecorder android-camera2

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

如何设置android camera2预览和捕获大小?

我用a SurfaceView来显示我捕获的预览.我想使用width = 1080,height = 1920进行预览.我在哪里可以设置预览的大小?

我用谷歌搜索了一个答案,但它们都是用于相机版本的.我使用的是android.hardware.camera2.

private void takePreview() {
    try {
        final CaptureRequest.Builder previewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        previewRequestBuilder.addTarget(mSurfaceHolder.getSurface());
        mCameraDevice.createCaptureSession(Arrays.asList(mSurfaceHolder.getSurface(), mImageReader.getSurface()), new CameraCaptureSession.StateCallback() // ?
        {
            @Override
            public void onConfigured(CameraCaptureSession cameraCaptureSession) {
                if (null == mCameraDevice) return;
                mCameraCaptureSession = cameraCaptureSession;
                try {
                    previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
                    previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
                    previewRequestBuilder.set(CaptureRequest.JPEG_THUMBNAIL_SIZE, new Size(1080,1920));

                    CaptureRequest previewRequest = previewRequestBuilder.build();
                    mCameraCaptureSession.setRepeatingRequest(previewRequest, null, childHandler);
                } catch (CameraAccessException e) {
                    Log.e("takePreview","onConfigured(CameraCaptureSession cameraCaptureSession)",e);
                }
            }
            @Override
            public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
                Log.e("takePreview","onConfigureFailed");
            }
        }, childHandler);
    } catch (CameraAccessException e) …
Run Code Online (Sandbox Code Playgroud)

android android-camera2

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

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
查看次数

Android CameraX-录制视频时的人脸检测

我正在使用Android中带有Firebase ML Kit的新库CameraX,并检测设备可以拍摄的每张脸。

所以我像这样设置CameraX:

CameraX.bindToLifecycle(this, preview, imageCapture, faceDetectAnalyzer)
Run Code Online (Sandbox Code Playgroud)

现在所有工作都很流畅,我想录制视频。

因此,基本上我想在录制视频时检测人脸

我试过了:

CameraX.bindToLifecycle(this, preview, imageCapture, faceDetectAnalyzer, videoCapture)
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误消息,说参数太多,所以我猜这不是正确的方法。

我知道该库仍处于alpha状态,但我想有一种方法可以做到这一点。

即使没有喷气机,使用Firebase ML录制视频时,还有另一种实现面部检测的方法吗?

android android-camera android-camera2 firebase-mlkit android-camerax

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

在 GL 渲染线程上收到异常:android

我正在使用 CAMERA2 API,同时开发一个没有任何错误的应用程序,该应用程序将运行得非常好。但是在录制了一些片段后,它会显示上述错误。

这是我的做法,

1.使用cameraManager类打开相机,然后将视频预览设置为纹理字段

  1. 在我们开始录制视频后,它会根据给定的时间中断,并立即再次开始录制,并会不断创建视频块,直到用户停止录制

没有任何问题,它会创建许多(大约 200-300)个摄像头会话。但突然它发生在错误之下。我已经给了一些时间来设置相机会话并使用Timerclass 和TimerSchduleclass发布这些会话。

我已经阅读了这个, 这里这里为了提取到底发生了什么。思想需要一些进一步的帮助。

我想知道的是

  1. 这个错误是什么意思?

  2. 一般来说,为什么这些错误发生在

编辑 :

错误--->>>>

10-11 12:20:58.966 27862-27988/? E/CameraDeviceGLThread-0: Received exception on GL render thread: 
                                                           java.lang.IllegalStateException: glDrawArrays: GLES20 error: 0x505
                                                               at android.hardware.camera2.legacy.SurfaceTextureRenderer.checkGlError(SurfaceTextureRenderer.java:537)
                                                               at android.hardware.camera2.legacy.SurfaceTextureRenderer.drawFrame(SurfaceTextureRenderer.java:346)
                                                               at android.hardware.camera2.legacy.SurfaceTextureRenderer.drawIntoSurfaces(SurfaceTextureRenderer.java:726)
                                                               at android.hardware.camera2.legacy.GLThreadManager$1.handleMessage(GLThreadManager.java:105)
Run Code Online (Sandbox Code Playgroud)

android opengl-es android-camera2 android-thread

5
推荐指数
0
解决办法
1075
查看次数

在某些设备上,camera2 的前置摄像头变暗

我使用谷歌样本camera2录制视频时,背置摄像头就可以了。我在代码中所做的唯一更改是

 String cameraId = manager.getCameraIdList()[1];
Run Code Online (Sandbox Code Playgroud)

切换到前置摄像头。预览还可以,但是当我开始录制时它变得太暗了,停止录制后黑暗消失了。

目前我在使用 Android 8.1.0 的 Pixel 2 上遇到了这个问题,但还有其他用户在具有不同 API 级别的不同设备上遇到了同样的问题。

有人知道如何解决这个问题吗?

android android-camera2

5
推荐指数
0
解决办法
176
查看次数

Android:Camera2 API 仅在 Google Pixel 2 和 2 XL 设备上崩溃

我在我的一个应用程序中使用 Camera2 示例代码:https : //github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/ Camera2BasicFragment.java

它一直运行良好,直到最近该应用程序在图像捕获时崩溃,但仅限于 Google Pixel 2 和 Pixel 2 XL 设备。

崩溃报告显示以下内容:

java.lang.NullPointerException: 
  at ....Camera2BasicFragment$ImageSaver.run (Camera2BasicFragment.java:935)
  at android.os.Handler.handleCallback (Handler.java:873)
  at android.os.Handler.dispatchMessage (Handler.java:99)
  at android.os.Looper.loop (Looper.java:193)
  at android.os.HandlerThread.run (HandlerThread.java:65)
Run Code Online (Sandbox Code Playgroud)

这是第 935 行(ImageSaver 类):

ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
Run Code Online (Sandbox Code Playgroud)

我已经尝试了一些东西,但我无法测试,因为我没有 Pixel 2 设备。有什么建议?

更新(2018 年 11 月 5 日):

所以合乎逻辑的解释是从 ImageReader 返回的图像以某种方式为空:

@Override
        public void onImageAvailable(ImageReader reader) {
            mBackgroundHandler.post(new ImageSaver(reader.acquireLatestImage(), mFile));
        }
Run Code Online (Sandbox Code Playgroud)

SO 上的其他一些帖子表明可能不支持 ImageReader 格式。这是格式:

mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(),
 ImageFormat.JPEG, /*maxImages*/2);
Run Code Online (Sandbox Code Playgroud)

但我无法想象为什么 JPEG 会是不受支持的格式。

还在寻找答案!

android android-camera2

5
推荐指数
1
解决办法
621
查看次数

如何在 Android camera2 API 中同时配置前后两个摄像头?

我想将前后两个摄像头配置为 Android camera2 API,同时从两个摄像头拍摄照片和视频,我创建了 2 个纹理视图,当我打开一个摄像头(前置或后置)时,我的代码工作正常,但无论何时我试图同时打开两个摄像头,代码在创建会话时中断,我收到了 cameraAccessException :configure stream : 方法未实现。我想将前后摄像头捕获的图像保存为一张图像,并将两个视频保存为一个视频。伙计们,如果您可以放置​​一些示例代码或一些示例链接,将会非常有帮助。

我正在使用一加 6,我最近下载了一个应用程序“双摄像头前置后置摄像头”,通过使用它,我可以同时从前后两个摄像头捕获图像,所以如果有人想建议不支持硬件,我认为它可能对其他手机有效,但就我而言,我认为我在编码中遗漏了一些东西,直到现在从谷歌搜索来看,第二个摄像头的会话创建似乎存在一些问题,我在创建过程中调试了我的代码第二个摄像头会话失败了,所以如果你对此有任何想法,请分享。

谢谢拉克什

 我用的是一加6

android android-camera2

5
推荐指数
1
解决办法
2712
查看次数