我正在阅读有关此的许多报告,但仍然找不到适合我的答案。有时,在使用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) 我正在尝试为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) 嗨,我正在使用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相机应用程序(如果有兴趣的人可以分享它),它在视频录制时具有手动对焦。
我已经在谷歌示例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) 关于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-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在两个摄像头中捕捉照片.所以,如果我做错了什么,请纠正我.
在某些设备中,此应用程序只需单击即可拍摄多张照片.
首先问一个问题:在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. 有推荐的方法吗?
我正在使用 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) 因此,我们正在尝试制作一个可在您旋转设备时(大约每3个角度)拍照的应用程序。但是,使用camera2时,我们旋转设备:
我仍在尝试弄清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) 我正在尝试学习 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)