我试图将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) 嗨,我正在使用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) 因此,整个周末我都使用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级别太高,所以我没有对其进行测试。
以下是有关代码段的快速概述:
设置 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)创建所有强大的录音会话
SurfaceTexture texture = mTextureView.getSurfaceTexture();
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
List<Surface> …Run Code Online (Sandbox Code Playgroud)我用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-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在两个摄像头中捕捉照片.所以,如果我做错了什么,请纠正我.
在某些设备中,此应用程序只需单击即可拍摄多张照片.
我正在使用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
我正在使用 CAMERA2 API,同时开发一个没有任何错误的应用程序,该应用程序将运行得非常好。但是在录制了一些片段后,它会显示上述错误。
这是我的做法,
1.使用cameraManager类打开相机,然后将视频预览设置为纹理字段
没有任何问题,它会创建许多(大约 200-300)个摄像头会话。但突然它发生在错误之下。我已经给了一些时间来设置相机会话并使用Timerclass 和TimerSchduleclass发布这些会话。
我已经阅读了这个, 这里和这里为了提取到底发生了什么。思想需要一些进一步的帮助。
我想知道的是
这个错误是什么意思?
一般来说,为什么这些错误发生在
编辑 :
错误--->>>>
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) 我使用谷歌样本的camera2录制视频时,背置摄像头就可以了。我在代码中所做的唯一更改是
String cameraId = manager.getCameraIdList()[1];
Run Code Online (Sandbox Code Playgroud)
切换到前置摄像头。预览还可以,但是当我开始录制时它变得太暗了,停止录制后黑暗消失了。
目前我在使用 Android 8.1.0 的 Pixel 2 上遇到了这个问题,但还有其他用户在具有不同 API 级别的不同设备上遇到了同样的问题。
有人知道如何解决这个问题吗?
我在我的一个应用程序中使用 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 camera2 API,同时从两个摄像头拍摄照片和视频,我创建了 2 个纹理视图,当我打开一个摄像头(前置或后置)时,我的代码工作正常,但无论何时我试图同时打开两个摄像头,代码在创建会话时中断,我收到了 cameraAccessException :configure stream : 方法未实现。我想将前后摄像头捕获的图像保存为一张图像,并将两个视频保存为一个视频。伙计们,如果您可以放置一些示例代码或一些示例链接,将会非常有帮助。
我正在使用一加 6,我最近下载了一个应用程序“双摄像头前置后置摄像头”,通过使用它,我可以同时从前后两个摄像头捕获图像,所以如果有人想建议不支持硬件,我认为它可能对其他手机有效,但就我而言,我认为我在编码中遗漏了一些东西,直到现在从谷歌搜索来看,第二个摄像头的会话创建似乎存在一些问题,我在创建过程中调试了我的代码第二个摄像头会话失败了,所以如果你对此有任何想法,请分享。
谢谢拉克什