标签: android-camera2

Android camera2 在牛轧糖上废弃了表面,但在棉花糖上工作

编辑 05/05/2018
我仍然不知道发生这种情况的原因,但显然它不会影响 Lolipop 和 Marshmallow 设备。据我测试,此错误仅出现在 Nougat 7.0 上。


我正在制作一个应用程序,可让您录制视频,然后用于进一步处理。但是,我目前在录制部分遇到了问题。

设置/开始录制的代码:

private void startRecord()
{
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mediaRecorder.setOutputFile(videoFile.getAbsolutePath());
    mediaRecorder.setVideoEncodingBitRate(1000000);
    mediaRecorder.setVideoFrameRate(30);
    mediaRecorder.setVideoSize(videoSize.getWidth(), videoSize.getHeight());
    mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    mediaRecorder.setOrientationHint(totalRotation);

    try
    {
        mediaRecorder.prepare();

        SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
        surfaceTexture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight());
        Surface previewSurface = new Surface(surfaceTexture);
        Surface recordSurface = mediaRecorder.getSurface();
        captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
        captureRequestBuilder.addTarget(previewSurface);
        captureRequestBuilder.addTarget(recordSurface);

        cameraDevice.createCaptureSession(Arrays.asList(previewSurface, recordSurface),
                new CameraCaptureSession.StateCallback()
                {
                    @Override
                    public void onConfigured(CameraCaptureSession session)
                    {
                        recordCaptureSession = session;
                        try
                        {
                            recordCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null);
                        }
                        catch (CameraAccessException e) {}
                    }

                    @Override
                    public void onConfigureFailed(CameraCaptureSession session) …
Run Code Online (Sandbox Code Playgroud)

java android android-camera2 android-7.0-nougat

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

Android - CameraDevice 已关闭

我一直在尝试将 Camera2 api 集成到我的应用程序中。当我从纵向模式切换到横向模式时,它会引发异常

    java.lang.IllegalStateException: CameraDevice was already closed
at android.hardware.camera2.impl.CameraDeviceImpl.checkIfCameraClosedOrInError(CameraDeviceImpl.java:1984)
at android.hardware.camera2.impl.CameraDeviceImpl.submitCaptureRequest(CameraDeviceImpl.java:825)
at android.hardware.camera2.impl.CameraDeviceImpl.setRepeatingRequest(CameraDeviceImpl.java:880)
at android.hardware.camera2.impl.CameraCaptureSessionImpl.setRepeatingRequest(CameraCaptureSessionImpl.java:231)
at com.essentialsln.memtalk.ui.fragments.Camera2Fragment$11.onConfigured(Camera2Fragment.java:795)
at java.lang.reflect.Method.invoke(Native Method)
at android.hardware.camera2.dispatch.InvokeDispatcher.dispatch(InvokeDispatcher.java:39)
at android.hardware.camera2.dispatch.HandlerDispatcher$1.run(HandlerDispatcher.java:65)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.os.HandlerThread.run(HandlerThread.java:61)
Run Code Online (Sandbox Code Playgroud)

android device-orientation android-camera2

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

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

为 Firebase 条码解码裁剪 YUV_420_888 图像

我正在使用 Camera2 API 以流式(实时)方式使用 Firebase-ML 条形码解码器。我这样做的方法是设置一个 ImageReader 定期为我提供图像。完整图像是我的相机的分辨率,所以它很大 - 它是一个 12MP 相机。

条码扫描器在 Samsung S7 Edge 上处理图像大约需要 0.41 秒,因此我设置 ImageReaderListener 一次解码一个并丢弃任何后续帧,直到解码器完成。

我使用的图像格式是 YUV_420_888,因为这是文档推荐的,并且因为如果您尝试向 ML Barcode 解码器提供任何其他内容,它会抱怨(调试日志的运行时消息)。

所有这些都有效,但我认为如果我可以裁剪图像,效果会更好。我想让相机分辨率保持不变(以便我可以显示一个宽的 SurfaceView 以帮助用户将他的相机与条形码对齐),但我想给 Firebase 一个裁剪版本(基本上是一个中心矩形)。我所说的“更好地工作”主要是指“更快”,但我也想消除干扰(尤其是可能位于图像边缘的其他条码)。

这让我试图找出裁剪 YUV 图像的最佳方法,但我很惊讶地发现帮助很少。我在网上找到的大多数示例都执行多步骤过程,首先将 YUV 图像转换为 JPEG,然后将 JPEG 渲染为位图,然后对其进行缩放。这在我看来有几个问题

  • 这似乎会对性能产生重大影响(实时)。这将帮助我完成一些事情,包括减少一些功耗、改进响应时间,以及允许我通过 image.close() 更快地将图像返回到 ImageReader。
  • 这种方法不会让您回到 Image,因此您必须改为向 firebase 提供 Bitmap,这似乎也不起作用。我不知道 firebase 在内部在做什么,但我有点怀疑它主要(可能完全)在 Y 平面之外工作,并且如果 Image -> JPEG -> Bitmap 的转换将其弄混了。

我四处寻找可能有帮助的 YUV 库。有一种叫做 libyuv-android 的东西,但它并不能完全按照 firebase-ml 想要的格式工作,而且它是一堆 JNI,让我担心跨平台问题。

我想知道是否还有其他人考虑过这个问题,并提出了一个更好的解决方案来在 Android 中裁剪 YUV_420_488 图像。我是否无法找到它,因为它是一个相对微不足道的操作?除其他事项外,还有步幅和填充需要关注。我不是图像/色彩专家,我有点觉得我不应该自己尝试这个,我特别关心的是我找到了一些在我的设备上有效但在其他人上无效的东西。

更新:这实际上可能没有实际意义。作为一项实验,我查看了从 ImageReader 返回的 Image。它是 ImageReader.SurfaceImage 的一个实例,它是一个私有(对 ImageReader)类。它也有一堆本地搭档。因此,唯一的选择可能是执行压缩/解压缩方法,这似乎很蹩脚。我唯一能想到的另一件事是自己决定只使用 Y 平面并从中制作位图,然后看看 …

firebase android-camera2

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

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

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

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

谢谢拉克什

 我用的是一加6

android android-camera2

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

使用 RenderScript 为纵向模式旋转 YUV 图像数据

对于视频图像处理项目,我必须旋转传入的 YUV 图像数据,以便数据不是水平显示而是垂直显示。我使用了这个项目,它让我深入了解了如何将 YUV 图像数据转换为 ARGB 以实时处理它们。该项目的唯一缺点是它仅在景观中。没有纵向模式选项(我不知道为什么 Google 的人提供了一个仅处理横向的示例示例)。我想改变这一点。

因此,我决定使用自定义的 YUV 转 RGB 脚本来旋转数据,使其以纵向模式显示。以下 GIF 演示了应用程序如何在我应用任何旋转之前显示数据。

在此处输入图片说明

你必须知道,在 Android 中,即使设备处于纵向模式,YUV 图像数据也会以横向呈现(我在开始这个项目之前不知道。同样,我不明白为什么没有可用的方法可用于通过一次调用来旋转帧)。这意味着即使设备处于纵向模式,起点也在左下角。但是在纵向模式下,每一帧的起点应该在左上角。我对字段使用矩阵表示法(例如 (0,0)、(0,1) 等)。注意:我从这里拿了草图: 在此处输入图片说明

要旋转横向框架,我们必须重新组织字段。这是我对草图(见上文)所做的映射,它显示了yuv_420横向模式下的单个帧。映射应将框架旋转 90 度:

first column starting from the bottom-left corner and going upwards:
(0,0) -> (0,5)       // (0,0) should be at (0,5)
(0,1) -> (1,5)       // (0,1) should be at (1,5)
(0,2) -> (2,5)       // and so on ..
(0,3) -> (3,5)
(0,4) -> (4,5)
(0,5) -> (5,5)

2nd column starting at …
Run Code Online (Sandbox Code Playgroud)

android yuv renderscript landscape-portrait android-camera2

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

无法解析符号“FragmentCompat” - Camera2VideoJava - 目标为 API 29

我有一个一直在使用Camera2VideoJava的项目。我正在升级到 API 29 (AndroidX) 但现在Camera2VideoFragment.java 文件出现以下错误

  1. 无法解析符号“v13”

    对于这一行: import android.support.v13.app.FragmentCompat;

  2. 无法解析符号“FragmentCompat”

    对于这一行: implements View.OnClickListener, FragmentCompat.OnRequestPermissionsResultCallback, MediaRecorder.OnInfoListener {

问题是android.support.v13它不再导入到我的项目中,因为 AndroidX 处理它。随着 API 29 和 AndroidX 的更新,Android Studio 通常会在更改时自动建议导入。

最初预期的解决方案:

进口(import android.support.v13.app.FragmentCompat;)通常会更改为类似import androidx.core.app.FragmentCompat;androidx.legacy.app.FragmentCompat(如建议在这里),这将解决以上两个错误。但是,这两种导入都不存在。

潜在的解决方案?

我相信进口是不建议/不存在,因为FragmentCompact已被废弃,现在片段建议,所以我唯一的想法则是使用片段而不是FragmentCompact,但会造成其他问题:

  • if (FragmentCompat.shouldShowRequestPermissionRationale(this, permission)) {
  • FragmentCompat.requestPermissions(this, VIDEO_PERMISSIONS, REQUEST_VIDEO_PERMISSIONS);
  • FragmentCompat.requestPermissions(parent, VIDEO_PERMISSIONS,REQUEST_VIDEO_PERMISSIONS);

因为Fragment没有这些方法。那么我将不得不替换/重写那些功能,这......可能有用吗?但我不会质疑我是否在这里无缘无故地走了很长的路。

额外的:

  • 我的理解是此解决方案不适用于这种情况,因为它会使用 AndroidX 创建重复导入

更新到 API 29 时,是否有更好的解决方案来解决Camera2VideoJavaFragmentCompat问题?

java android android-fragments android-camera2 androidx

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

是否可以将 cameraX 或 Camera2 缩放到 Api 最大缩放限制之外

所以我正在尝试制作一个双筒望远镜/望远镜类的应用程序,但问题是我想放大到最大。我看到商店里有应用程序可以做到这一点,但不确定如何。我尝试过 cameraX linearZoom 方法,但它只能在 0f - 1f 之间的范围内工作,或者是否可以使用 Camera2 api 来做到这一点?任何帮助将不胜感激。请注意,我只是在尝试或研究了一整天不同的事情后才发布了这个问题。

谢谢

android android-camera2 android-camerax

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