Camera2处理预览回调数据时出现native错误的解决方法

这篇具有很好参考价值的文章主要介绍了Camera2处理预览回调数据时出现native错误的解决方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:在使用camera api 2 时,若是增加了回调数据的监听器,那么需要在OnImageAvailableListener回调函数中从ImageReader获取图像,并转化成我们需要的格式(比如使用自己写的yv12转nv21格式的图像格式转化函数),比如NV21格式。在退出预览界面时,有时候会在图像转化格式函数中出现native错误。原因是相机在释放时,图像转化函数没有执行完成,所以才有native错误。解决方法也不难,就是在图像转化时,不能去释放相机。等图像转化完成后再释放相机。

大致代码实现如下:

一、定义两个变量,用于表明相机状态和图像处理状态,如下:

// 是否调用了释放相机函数
private boolean isReleasingCamera = false;
// 是否已经处理完了预览回调数据,处理完后,才去真正释放相机。
private boolean isProcessImageFinished = true;

二、在OnImageAvailableListener回调中去控制isProcessImageFinished变量的状态。如下:

private ImageReader.OnImageAvailableListener mOnImageAvailableListener
            = new ImageReader.OnImageAvailableListener() {

        @Override
        public void onImageAvailable(ImageReader reader) {
            isProcessImageFinished = false;

            if (isReleasingCamera) {
                try {
                    Image image1 = reader.acquireLatestImage();
                    image1.close();

                    // 去掉监听
                    if (mImageReader != null && isReleasingCamera) {
                        mImageReader.setOnImageAvailableListener(null, null);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                isProcessImageFinished = true;
                return;
            }

            byte[] imageData = null;
            Image image = null;
            try {
                image = reader.acquireLatestImage();
            } catch (Exception e) {
                e.printStackTrace();
            }
            
			if (image == null) {
				isProcessImageFinished = true;
				return;
			}
			
			try {
				// TODO 将yv12转nv21格式等
				// imageData = nv21格式的数据
			} catch (Exception e) {
				Log.e(TAG, "onImageAvailable e=" + e.getMessage());
			}
			if (image != null) {
				image.close();
			}
            
            if (imageData == null) {
                isProcessImageFinished = true;
                return;
            }
            // TODO 可在子线程中处理转化后的数据:imageData
            isProcessImageFinished = true;
        }
    };

三、 释放相机时,控制isReleasingCamera变量的值,在回调数据处理完后再去释放相机资源,如下:文章来源地址https://www.toymoban.com/news/detail-521044.html

    // TODO 最好在Activity中的onPause()方法中使用子线程执行
    public void releaseCamera() {
        if (isReleasingCamera) {
            Log.w(TAG, "releaseCamera function has called");
            return;
        }
        // 表示准备释放相机
        isReleasingCamera = true;
        // 等待调用释放函数的开始时间
        long waitReleaseTime = System.currentTimeMillis();

        // 等待回调数据处理结束
        while (!isProcessImageFinished && System.currentTimeMillis() - waitReleaseTime < 50) {
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //stopPreview();
        //closeCamera();
        // 释放完毕
        isReleasingCamera = false;
    }

到了这里,关于Camera2处理预览回调数据时出现native错误的解决方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 使用Camera2 API 和 GLSurfaceView实现相机预览

    GLSurfaceView 和 SurfaceView 是 Android 中用于显示图像的两个视图类,它们在实现方式和使用场景上有一些区别。 实现方式:GLSurfaceView 基于 OpenGL ES 技术实现,可以通过 OpenGL ES 渲染图像。而 SurfaceView 则是通过基于线程的绘制方式,可以在独立的线程中进行绘制操作。 性能:由于

    2024年02月09日
    浏览(46)
  • OpenGL ES笔记 + Camera2 API + TextureView + 滤镜预览

    updateTexImage()方法作用是将底层的 SurfaceTexture 中最新的图像帧更新为 GLES 纹理,以便可被 OpenGL ES 渲染。 具体地说,当使用 SurfaceTexture 获取预览图像时,每次预览图像变更,就会触发 SurfaceTexture 中一次新图像帧的接收操作。这个新图像帧将被更新到 SurfaceTexture 的缓存区中,

    2024年02月09日
    浏览(60)
  • 【Camera2 教程二】Camera2相机打开和关闭接口调用详细说明

    上一章《Camera2教程一》里我们介绍了一些 Camera2 的基础知识,但是并没有涉及太多的 API,从本章开始我们会开发一个具有完整相机功能的应用程序,并且将相机知识分成多个篇章进行介绍,而本章所要介绍的就是相机的开启流程。 阅读本章之后,你将学会以下几个知识点:

    2024年04月25日
    浏览(35)
  • 微信支付,JSAPI支付,APP支付,H5支付,Native支付,小程序支付功能详情以及回调处理

    支付wiki: https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml 支付api: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/index.shtml 开发工具包(SDK)下载: https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay6_0.shtml#part-1 1.1简介 JSAPI支付是指商户通过调用微信支付提供的JSAPI接口,在支付场景中调起微信支付模

    2023年04月18日
    浏览(49)
  • 【Camera2教程一】Camera2的框架Pipeline和framework中核心类和接口的详细介绍

    一,框架pipeline 在Android中,Camera2 API提供了一个全新的框架来访问和控制设备上的相机硬件。这个框架的设计更加灵活和强大,允许开发者进行更精细的控制,同时支持更复杂的相机功能。Camera2 API的pipeline可以大致划分为以下几个关键部分: 相机访问: 首先,应用需要请求

    2024年04月15日
    浏览(37)
  • Android 高通Camera2 Camera Device Close

     1、很多人看到这个日志第一感觉可能觉得哪里没有合理释放,于是带着这个思路去进行百度探索 2、一开始我去寻找 ImageReader.OnImageAvailableListener 这个问题 3、后面网上去寻找因为  Camera2最大连拍限制是 2 网上很多数包括Google相机源码 需要单独开个线程去处理图片的逻辑

    2023年04月09日
    浏览(44)
  • android camera系列(Camera1、Camera2、CameraX)的使用以及输出的图像格式

    1.1.1、布局 1.1.2、实现预览 Camera.open() 打开摄像头 setPreviewDisplay 设置预览展示的控件 startPreview 开始预览 发现预览是横着的,需要使用 setDisplayOrientation 调整预览图像的方向 1.1.3、获取摄像头的原始数据 setPreviewCallback 设置预览数据的回调 2560*1440 默认返回图像的分辨率 Image

    2024年02月21日
    浏览(53)
  • 基于Camera2和MediaRecorder实现视频录制

    视频录制,在一般开发中很少遇到,大部分开发工作都是写写页面,请求接口,展示数据等等。真要遇到,可能采用第三方库实现,一来实现快速,二来可能觉得别人实现的比较好。特别是在开发周期很紧的情况下,一般都不会自己花时间实现。 其实最好是使用手机系统的录

    2024年02月11日
    浏览(46)
  • NDK Android平台camera2采集视频

    《Android平台使用camera2采集视频 代码实现 》链接: https://edu.csdn.net/learn/38258/606148?spm=1003.2001.3001.4157 在Android平台开发实时音视频项目,摄像头的采集是一个必不可少的流程;通常在Android平台上采集摄像头数据可以使用Camera1接口、Camera2接口或者CameraX接口。Camera1接口只支持

    2024年02月11日
    浏览(64)
  • Android Camera2 —CameraManager API详解

    一、CameraManager类概述 CameraManager是用于检测、表征和连接到 CameraDevices 的系统服务管理器。 CameraManager 是一个负责查询和建立相机连接的系统服务,它的功能不多,这里列出几个 CameraManager 的关键功能: 1)、将相机信息封装到 Camera Characteristics 中,并提获取 CameraCharacterist

    2024年02月12日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包