本文分享UVC Caemra的概念,uvc camera开源项目的编译和集成,可作为了解uvc camera的入门文章,内容整理来源网络。
UVC Caemra是什么?
UVCCamera是usb摄像头的一个开源库,库主要有三部分组成,一个是libuvccamera,一个是usbCameraCommon,另一个是调用demo程序usbCameraTest。
如下图所示:
如上图,libuvccamera库是基础库,主要包括USB设备的扫描,设备,驱动,监控等。
CameraDialog主要完成usb设备的扫描过滤展示,展示结果放在listview中。
UsbMonitor主要完成设备的连接断开,扫描等。
DeviceFilter主要是设备的过滤,解析xml配置文件。
UVCCamera则是主要的类,主要管理USB摄像头的打开关闭,预览,设备参数等等。
而common下的BaseActivity,BaseFragment, BaseService则提供一些基本功能,供其他类继承使用。
UVC Camera开源项目?
https://github.com/saki4510t/UVCCamera
现在我们在网上搜索uvc camera相关的文章,能查找到的uvc camera相关的项目,可以毫不夸张的说,基本都是基于上面这个开源项目来改的,这个开源项目的确比较牛逼,而且类封装的很好,代码逻辑比较清晰,使用起来也是非常的方便,而且关于摄像头基本的预览、拍照、录像功能都实现了,是个比较完整的工程项目。
我们通过git pull先把代码拉到本地,导入到AndroidStudio中,(不通过git pull 也行,直接下载代码也是可以的。
github 网站在国内不翻墙的话,可能有时访问不了,如何访问不了,大家也可以尝试在gitee上去搜索这个项目下载)。
整个工程的目录结构如下图所示。当然导入的过程中,会遇到一些报错的问题,其实主要是gradle版本的问题。
导入报错的问题,我们统一在这个文章后面再给大家做详细的讲解,包括遇到的问题以及是如何去解决这些问题的。
这个开源项目,除了sdk库的源码,作者还提供了8个demo。这8个demo的具体功能介绍如下:
1)USBCameraTest0
显示如何使用SurfaceView来启动/停止预览。
2)USBCameraTest
显示如何启动/停止预览。这与USBCameraTest0几乎相同,
但是使用自定义的TextureView来显示相机图像而不是使用SurfaceView。
3)USBCameraTest2
演示如何使用MediaCodec编码器将UVC相机(无音频)的视频记录为.MP4文件。
此示例需要API>=18,因为MediaMuxer仅支持API>=18。
4)USBCameraTest3
演示如何将音频(来自内部麦克风)的视频(来自UVC相机)录制为.MP4文件。
这也显示了几种捕捉静止图像的方式。此示例可能最适用于您的定制应用程序的基础项目。
5)USBCameraTest4
显示了访问UVC相机并将视频图像保存到后台服务的方式。
这是最复杂的示例之一,因为这需要使用AIDL的IPC。
6)USBCameraTest5
和USBCameraTest3几乎相同,但使用IFrameCallback接口保存视频图像,
而不是使用来自MediaCodec编码器的输入Surface。
在大多数情况下,您不应使用IFrameCallback来保存图像,因为IFrameCallback比使用Surface要慢很多。
但是,如果您想获取视频帧数据并自行处理它们或将它们作为字节缓冲区传递给其他外部库,
则IFrameCallback将非常有用。
7)USBCameraTest6
这显示了如何将视频图像分割为多个Surface。你可以在这个应用程序中看到视频图像并排观看。
这个例子还展示了如何使用EGL来渲染图像。
如果您想在添加视觉效果/滤镜效果后显示视频图像,则此示例可能会对您有所帮助。
8)USBCameraTest7
这显示了如何使用两个摄像头并显示来自每个摄像头的视频图像。这仍然是实验性的,可能有一些问题。
9)usbCameraTest8
这显示了如何设置/获取uvc控件。目前这只支持亮度和对比度。
供的demo,代码逻辑都很清晰,大家可以根据自己的需求去看对应的demo。
这些demo包含了预览、录像、拍照这些基本的功能。关于调节亮度、对比度这点,可能是不同摄像头的原因,我本地验证了下,看实际上并没有效果,如果有哪位同学后面试试到有效果的,欢迎给我留言,大家交流交流。
Demo7我们可以看到是一个支持2个摄像头的Demo。有多摄像头支持需求的,可以参考这个里面的逻辑。
开源项目UV CCaemra的编译、集成?
UVCCamera的核心代码都在libuvccamera里面了。
我们要在我们的项目工程中集成这个项目的话,需要2个东西,一个是so库,一个可以调用的java sdk源码。
从上面的截图我们可以很清楚的看到,代码里面主要是包含了jni和java两大部分的内容。编译jni,就可以得到我们需要的so库,java代码可以打包成aar,或者之间直接把整个代码复制到我们的工程目录下,作为库引用也是可以的。
1) so库的编译
现在so库的编译,已经非常的方便了,如下图所示,我们在as的Terminal终端界面,切到jni目录下,直接ndk-build,就可以生成我们需要的so库文件了。
这里有个地方我们得注意下,就是我们需要Android 32位还是64位的库文件,这个是在Application.mk里面配的,上面的截图我已经把Application.mk这个文件的位置圈出来了。如果是32位,这里边APP_ABI的内容修改为armeabi-v7a即可,64位则是arm64-v8a,其它平台的类推。
2) 打包aar
我们项目要集成这个开源项目,那肯定得提供java代码我们才能调用。我这里采用的方式是,把UVCCamera的核心代码(也就是不包含8个demo)的内容,打包成aar,然后在我自己的工程目录中引用打包好的aar.
打包成aar在AS里面操作也是非常简单的。先贴下图片。
从上面的截图,我们可以看到,需要打包的module有2个,分别是libuvccamera和usbCameraCommon。
按照截图上的操作顺序来,从1到3。先是点击as界面右侧的Gradle,在腾出的界面中,双击执行assembleRelease,执行完没有啥报错的话,在module的build output路径下,就可以看到生成的aar文件了。
最后就是把生成的so库文件,已经生成的aar文件,都拷贝到我们自己工程的libs目录下,导入到项目中使用即可。
3)将UVCCamera sdk集成到自己项目
通过上面的步骤,我们已经成功的编译出了so库文件以及aar文件。下图显示的就是我们把生成的文件导入到我们自己的工程项目中。
文章参考:
1.https://blog.csdn.net/bawang_cn/article/details/121350618
2.https://blog.csdn.net/Mr_ZJC/article/details/117970651
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。