用 Golang 开发 Android 应用(六)—— Camera 使用

android native开发-native实现对camera的操作 通过native实现camera的操作 源码路径:frameworks/av/camera/ndk/ 参考的test源码路径:cts/tests/tests/graphics/jni/CameraTestHelpers.cpp 1/* 2 * Copyright 2018 The Android Open Source Project 3 * 4 * Licensed under the Apac... 阅读详情

用 Golang 开发 Android 应用 -- Camera 使用

计划按以下的内容更新

Android 中的 Camera

  在 Android 中,最初的 Camera 连前置摄像头(以下简称前摄,后摄同理)都没支持,而是各厂商自行实现的,曾逆向过一个 Camera 应用,里面有太多的反射调用,并不是它们写得不好,而是现实中太多实现方式了,各种不同的类。总之要靠一些复杂、怪异的判断来决定当前要用什么方式来调用前摄。
  后来虽然官方加入了前摄的支持,但NDK都没有提供 Camera 的方式,要在 NDK 中使用用摄像头就需要通过参考 Android 的源码,找到调用方法。
  直到 Android 7.0 上 Camera 2 的出现,NDK 才开始有官方接口提供,这个我们可以从 NDK 的 include\camera 头文件看到。
  这一篇还是基于 Camera 2 之前的版本,也如上面说的原因,在 Android 4.4 的仿真上这个 Camera Demo 是能正常运行的。

在这里插入图片描述

理论上它能在的如下几个 Android 版本上跑(仅限 armeabi ):
libnative_camera_r6.0.0.so
libnative_camera_r5.1.0.so
libnative_camera_r4.4.0.so
libnative_camera_r4.3.0.so

Demo 代码说明

为了便于理解,先说一下 Camera 的帧数据的格式,目前我碰到的都是 yuv420sp 格式,所以这个 Demo 只处理了这一种格式的数据。 代码中 YuvRender 就是用来处理这种格式的,它是一个 Render 对象。

type Render interface {
	// Init render, userdata is ignore
	Init()
	Draw(pixels interface{})
	Release()

	// SetProperty
	// wW, wH is windows/client width, height
	// iW, iH is image width, height
	// x, y, w, h is draw image to rect
	// op is ROTATION?? | FLIPHOR | FLIPVER
	SetProperty(wW, wH int, iW, iH int, x, y, w, h int, op int)

	// 验证 pixels 是否符合指定 width、height
	Validate(width, height int, pixels interface{}) bool
}

主要是用来绘制和检查数据是否有效。
如果出现其它格式的数据,同样实现一个 Render 。
并在这里加上对它的支持:

	switch cam.imgFormat {
	case "yuv420sp":
		cam.irender = &render.YuvRender{}
	case "????": // 新加的格式
		cam.irender = ???? 
	default:
		log.Println("not support format:", cam.imgFormat)
		return
	}

如果 Demo 不能正常跑,一方面看 cameraInit 是否成功, 另外就是看一下数据格式。

func cameraInit(id int, usercb func(w, h int, img []byte) bool) *cameraObj {
	cam := &cameraObj{}

	cb := func(buffer []byte) bool {
		// init done
		if atomic.CompareAndSwapInt32(&cam.camStat, NONE, READY) {
			return true
		}

		wh := cam.previewSizes[cam.previewIndex]
		if cam.camStat == RESIZING && cam.irender.Validate(wh[0], wh[1], buffer) {
			cam.ResetProperty()
			atomic.CompareAndSwapInt32(&cam.camStat, RESIZING, READY)
		}

		...
		runtime.Gosched()
		return true
	}

	cam.Camera = camera.Connect(id, cb)
	if cam.Camera == 0 {
		log.Println("Cammera connect fail")
		return nil
	}

	...

	// 第一个为默认分辨率
	// 因 camera 还未初始化完,需就异步执行
	go func() {
		runtime.LockOSThread()
		for cam.camStat == NONE {
			time.Sleep(time.Millisecond * 100)
		}
		cam.setPreviewSize(0)
	}()
	return cam
}

cam.Camera = camera.Connect(id, cb) 这就是“打开”摄像头的函数,它的参数有一个回调,用于传回帧数据的。这个回调之所以做了一些判断逻辑,主要是因为象改分辨率这种操作,和回调传回的数据之间是异步的,也就是说调用修改分辨率之后,可能还会有一两帧数据是之前分辨率的数据,所以要用cam.irender.Validate(...) 确认一下,这个数据是否符合新分辨率要求的数据。只有符合最新分辨率的的数据第一次收到时才去修改 render 的 property ,否则会花屏或崩溃。还有就是传入的 buffer 可能是和之前是同一个内存块,这意味着这个 buffer 的数据可能会被新的帧数据填充,因此我们不能直接拿着 buffer 来用,如果需要处理数据要做一次 copy 到自己分配的内存里,考虑到这个数据 buffer 较大,最好也只做一次 copy ,否则执行效率是个大问题。
另外之所以调用runtime.Gosched()是为了主动进行一次 goroutine 调度,以避免回调占用太多CPU导致其它 goroutine 没有机会运行(虽然对现在的多核手机来说似乎没意义了)。

	...
	cam.SetFlashMode(camera.FLASH_MODE_TORCH)
	...
	cam.SetFlashMode(camera.FLASH_MODE_OFF)
	...
	cam.ApplyProperties()

这是开关闪光灯的地方 FLASH_MODE_TORCH 这个模式是开灯,闪光灯常亮。记得加个定时器自动关了,烧了闪光灯本人不负任何责任。调用cam.ApplyProperties()之后,所做的各种 property 修改才真正有效。正确用法是依次设置不同的 property ,最后调用 cam.ApplyProperties() 使所做设置有效。

Camera2

关于 Camera 就写这些了,毕竟它已被 Android 给淘汰了。Camera2 估计要一段时间才能写个 Demo 出来,暂时没计划。该收收心积极点找工作了。
当然这个计划还有一篇关于 OpenCV 的,将用它结合Camera 实现一个人脸检测(非识别),争取这两天完成。

Android Camera API2架构和流程介绍 和你一起终身学习,这里是程序员Android经典好文推荐,通过阅读本文,您将收获以下知识点:一、简介二、Camera API2 架构2.1 Camera应用框架2.2 Camera AIDL2.3 Camera Native 框架2.4 Camera binder IPC 接口2.5 CameraService2.6 Camera HAL三、Camera API 2 操作流程3.1 Camera参... 阅读详情

相关推荐

虹软人脸识别 - ArcFace Go应用套件接入说明

本帖最后由 一二三亖 于 2020-7-23 09:43 编辑 昨天看了虹软的发布会,得知应用套件要开源了,晚上看到在官网上线了,随后下载下来打算试一试。 但是运行工程的过程中,它报错了。。。查看错误信息,说的是缺少类(详细说明看下方) 咨询了下虹软小助手,表示这两个类确实是需要自己实现的 晚上加班把这个做出来了,不得不说虹软开放了应用套件,确实省去了很多研发时间,当天晚上就跑通了 下面把类实现分享在这里,给有需要的人做个参考。。 导航: – 获取ArcFaceGo包 – 运行ArcFaceGo工程 – 安

qq_40110356的博客 1945

golang+vue 通过RTSP播放海康威视摄像头画面

展示摄像头视频流

IT艺术家-rookie的博客 2919

Android Go 平台下的轻量级 Camera HAL 构建策略与优化实践

Android Go 针对入门级设备进行系统裁剪,要求 Camera HAL 在保证基本功能完整性的前提下最大程度精简资源开销。本篇围绕 Android Go 平台下 Camera HAL3 的轻量化设计展开,结合实际工程经验,解析轻量化 HAL 的构建路径,包括模块裁剪、Metadata 精简、Buffer 控制、线程调度优化、与驱动通信缩减策略等关键实现细节,同时对低端平台(如 MTK MT6761/6765、Unisoc SC9863)下的 Camera 模组适配案例进行解构,提出可复用的通用裁剪策略

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1153

NDK Android平台camera2采集视频

在Android平台开发实时音视频项目,摄像头的采集是一个必不可少的流程;通常在Android平台上采集摄像头数据可以使用Camera1接口、Camera2接口或者CameraX接口。Camera1接口只支持java语言的接口,是Android最开始支持的相机接口,在Android 5.0 以后逐步废弃;Camera2是替代Camera1的接口,不仅支持java语言的接口也支持c/c++的接口;CameraX 是一个 Jetpack 库,Camera2使用比较复杂,CameraX对Camera2的API 进

u010140427的博客 5440

AndroidNativeCamera:该项目包括打开相机以更改主屏幕的背景和其他android功能,例如sharedprefernces和真正的java布局等

安卓原生相机 该项目包括打开相机以更改主屏幕的背景和其他android功能,例如sharedprefernces和真正的java布局等。

native-camera2:一个简单的应用程序,演示如何使用Android Camera HAL 3

你好相机2 Hello Camera2是播放预览的Android Camera2示例。 它通过NDK camera2 API控制相机设备,该设备成为Android N中的之一。 先决条件 带有 (> = r12)捆绑包的Android Studio 2.1+。 屏幕截图 触摸屏幕时,会切换一个小的额外视图。 已知错误 更改了其他表面视图后,App崩溃了。 (例如,将人像切换为横向模式时,反之亦然)

Android Camera开发系列(干货满满)

无论走到哪里,都会有明天~整理了下发布的Camera相关的文章,每个标题就是链接,可以直接点击进入查看相关内容~生活不息、学习不止,相关内还会持续更新~01Android Camera开发...

1万+

arduino uno spi驱动12864

arduino uno spi驱动12864

yvee的博客 2060

用 Golang 开发 Android 应用(非 gomobile)(一 )—— 基本环境配置

用 Golang 开发 Android 应用 -- 基本环境配置——题记计划按以下的内容更新基本环境配置Golang 和 android 有什么关系?基本 go 编译环境Android 的 ndk 编译器的配置命令行环境设置和编译其它 ——题记 遭遇经济寒冬加上中年危机(看我在优快云的注册时间,就知道本人有多“少年”了_),所以简历看得人多,有兴趣聊聊的人少。有人会说是没转到管理的原因,哥可是1...

kaisoft的专栏 3万+

OTN设备核心知识速记

本文章为工作笔记,若有错误,还需大家指正。不定期更新。

Hiddengold的博客 2648

05-SA8155 QNX Display框架及代码分析(1)

显示是非常重要的一个模块,人机交互的桥梁。那么SA8155 Hypervisor显示是如何处理的呢。对处理流程非常的好奇O(∩_∩)O哈哈~。TODO。

静虚待令,有物混成 1万+

新手入门---跨平台expo-camera 开发手机应用拍照和视频(安卓手机,方法一,视频受限)

本文介绍了利用旧安卓手机快速验证摄像头功能的方案。作者选择ReactNative框架,发现国内资源匮乏且大模型提供的信息过时错误。详细讲解了通过Expo Go实现拍照和录像功能的完整流程:1.安装Expo Go应用和Node.js环境;2.创建项目并安装expo-camera模块;3.配置权限和界面布局;4.实现拍照/录像切换、前后摄像头切换功能。最终成功实现拍照(照片可保存到公共相册)和录像(视频仅存缓存)功能,并指出Expo Go对媒体库的访问限制问题。

hnnsboy的博客 1539

Java对接快递鸟,查询快递物流信息

根据用户输入的订单号,我们的后台识别订单号并根据快递鸟查询快递API接口,实现自动查询的功能。下面是java版本的根据单号查询物流跟踪信息的详细示例代码。只需要下载就可以运行,(自己需要简单的修改)注:登录快递鸟用户管理后台后获得。登录快递鸟用户管理后台。

Roc的博客 958

用 Golang 开发 Android 应用(七)—— OpenCV 使用

用 Golang 开发 Android 应用 -- Opencv 使用计划按以下的内容更新OpenCV 在 Android 上的配置FaceDeteck 例子 计划按以下的内容更新 基本环境配置 简单 UI Storage 使用 Sensor 使用 Audio(openAL) 使用 Camera 使用 OpenCV 使用 OpenCV 在 Android 上的配置 OpenCV是什么就不在...

kaisoft的专栏 2599

建立时间与保持时间

建立时间与保持时间的计算 文章目录1、建立时间与保持时间概述及模型2、寄存器之间数据传输时建立时间与保持时间3、寄存器之间数据传输时建立时间余量与保持时间余量计算4、 FPGA允许的最大时钟频率或最小时钟周期5、计算FPGA时钟所允许的最大频率或最小时钟周期6、违反建立和保持时间会发生什么? 1、建立时间与保持时间概述及模型 建立时间(Tsu): 在时钟采样之前,输入必须稳定一段时间,该时间量称为建立时间。 理想最优建立时间: 保持时间(Th): 在时钟沿之后输入到触发器稳定所需的最短时间。 理想最优

Crazzy_M的博客 3万+

Lammps不同亲疏水性粗糙表面的润湿行为模拟(包含in文件)

Lammps粗糙表面的润湿行为模拟(包含in文件)前言—润湿行为模拟一、物理模型构建二、具体in文件—in文件内循环亲疏水性三、具体in文件—分子模板构建初始模型以及平衡态模拟四、全部代码(基地粗糙表面只提供data文件) 前言—润湿行为模拟 润湿现象:当液体与固体接触时,液体的附着层将沿固体表面延伸。当接触角 θ\rm \thetaθ 为锐角时,液体润湿固体,若θ为零时,液体将展延到全部固体表面上。润湿现象的产生与液体和固体的性质有关。(来自百度百科) 润湿行为的本质是固液之间的相互作用,也就是分子间的范

Rockyoung 7093

android camera.getparameters,android:camera.getParameters()使应用程序崩溃

我正在使用此代码将相机LED用作手电筒,但在服务启动时崩溃.我使用Log.w()语句发现它停在param = camera.getParameters();.我在清单中包含了android.permission.CAMERA.我不明白是什么原因导致飞机坠毁.我怎样才能解决这个问题?public class Flashlight extends Service {private Camera cam...

weixin_42550052的博客 664

MTK平台WiFi学习--Wi-Fi 连线/断线问题初步分析

摘要:本文详细介绍了MTK平台WiFi连接问题的日志分析方法。文章首先阐述了WiFi连接的标准流程,包括指令接收、BSSID选择、信道分配、认证关联、四次握手和DHCP获取等关键步骤。针对常见故障场景,如选网失败、信道申请失败、认证关联失败、四次握手失败等,提供了具体的日志分析方法和排查思路,包括识别关键日志、分析状态码、结合固件日志和抓包数据等。文章还特别强调了不同故障场景下需要收集的日志类型和分析要点,为WiFi连接问题的定位提供了一套系统化的解决方案。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 1590

go-sdl2 Android 开发指南:移动端多媒体应用实战

go-sdl2 是 SDL2 库的 Go 语言绑定,为开发者提供了在 Android 平台上构建高性能多媒体应用的强大工具。本文将详细介绍如何利用 go-sdl2 开发 Android 应用,从环境搭建到核心功能实现,帮助你快速掌握移动端多媒体应用开发的关键技术。 ## 一、环境准备:快速搭建开发环境 ### 1.1 安装必要工具 开发 go-sdl2 Android 应用需要以下工具: -

gitblog_00990的博客 1111

Python控制程控电源(USB)

随着智能电动汽车行业的持续发展,汽车电子或嵌入式设备在软硬件的测试中,都会使用程控电源供电,特别是自动化测试、压力测试场景必定使用到程控电源控制,控制电源上下电,监听电源电流、电压等,以下就以常见的艾德克斯程控电源为例,分享如何通过USB连接方式Python语言来控制程控电源。

测试领域技术分享 2865

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

用 Golang 开发 Android 应用(四)—— Sensor 使用

用 Golang 开发 Android 应用 -- Storage 使用计划按以下的内容更新Sensor 使用关于 SensorSensor 使用sensor.Event 说明Sensor 进阶Sonsor 一些应用场景 计划按以下的内容更新 基本环境配置 简单 UI Storage 使用 Sensor 使用 Camera 使用 OpenCv 使用 Sensor 使用 关于 Sensor ...

kaisoft的专栏 1586

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

用 Golang 开发 Android 应用(五)—— Audio(openAL)使用

@[TOC](用 Golang 开发 Android 应用 – Audio(openAL) 使用 计划按以下的内容更新 基本环境配置 简单 UI Storage 使用 Sensor 使用 Audio(openAL) 使用 Camera 使用 OpenCv 使用 Audio(openAL) 使用   Audio 是很重要的部分,但我之前漏掉它了,所以最初的计划里没有相关内容,发现这个漏网之鱼...

kaisoft的专栏 2502

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Camera驱动开发:从V4L2框架到Android HAL实践

Camera驱动作为连接图像传感器与上层应用的核心组件,其架构设计直接影响设备成像质量与性能表现。在Linux系统中,V4L2(Video4Linux2)框架提供了标准化的视频设备驱动模型,通过media controller实现多设备拓扑管理,而Android Camera HAL则定义了硬件抽象接口规范。开发过程中需重点关注MIPI CSI信号完整性、时钟树同步、ISP管线优化等关键技术点,特别是在多摄像头系统和计算摄影场景下,驱动层需要处理硬件同步、元数据传递等复杂需求。以RK3568平台为例,合理的

weixin_34014555的博客 401

Android平台使用Camera2(5.0+)替代过时的Camera

在做Android平台基于Camera2的RTMP直播推送对接时,查找Camera2的资料,无意发现这篇文章,感觉挺好,分享给大家看看。 原文:http://forums.developer.amazon.com/forums/thread.jspa?threadID=4836&tstart=0 概要 从5.0开始(API Level 21),可以完全控制安卓设备相机的新api Camera2(android.hardware.Camera2)被引入了进来。在以前的Camera api(an.

大牛直播SDK 1170

XCodeScanner深度剖析:Camera2与旧Camera双API兼容的设计之道

在Android扫码开发中,最让新手头疼的莫过于相机API的新旧分裂:Android 5.0(API 21)之前是古老的 `android.hardware.Camera`,之后则是复杂的 `android.hardware.camera2`。**XCodeScanner** 作为一款更快、更简单、更精准的Android二维码与条形码识别框架,用一套优雅的抽象设计同时兼容了这两代API,让开发者无

gitblog_00812的博客 752

Camera Framework流程系列(一)setRepeatingRequest 流程

应用层调用 CameraCaptureSession.setRepeatingRequest 方法时,会触发框架层和 HAL 层的一系列交互。

weixin_44668516的博客 2130
上一篇: 用 Golang 开发 Android 应用(五)—— Audio(openAL)使用
下一篇: 用 Golang 开发 Android 应用(七)—— OpenCV 使用
kaisoft
博客等级 码龄26年 39粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值