一、什么是UVC?

UVC,全称为:USB Video Class或USB Video Device Class,是Microsoft与另外几家设备厂商联合推出的为USB视频捕获设备定义的协议标准,目前已成为USB ORG标准之一。

USB协议中,除了通用的软硬件电气接口规范等,还包含了各种各样的Class协议,用来为不同的功能定义各自的标准接口和具体的总线上的数据交互格式和内容。这些Class协议的数量非常多,最常见的比如支持U盘功能的Mass Storage Class,以及通用的数据交换协议:CDC class。此外还包括VideoAudio Class, Print Class等等。正是由于这些Class协议,大大促进了USB设备的普及,比如说各个厂商生产的U盘都能通过操作系统自带的驱动程序来使用。

所以说UVC仅仅只是USB规范协议中设备类规范的其中一种,是用作USB接口的视频设备的一个统一的数据交换规范。使用 UVC 的好处 USB 在 Video这块也成为一项标准了之后,硬件在各个程序之间彼此运行会更加顺利,而且也省略了驱动程序安装这一环节,操作系统只要是 Windows XP SP2 之后的版本都可以支持 UVC,Linux系统自2.4以后的内核都支持了大量的设备驱动,其中支持UVC设备。

二、为什么Android要使用UVCCamera?

1、名词解释:

OTGOn-The-Go的英文缩写,是无线通讯设备或是移动设备的一项拓展功能。(官方解释太正式了,看简单版的吧!)

简单版 :OTG是让设备支持外接U盘,通过一个USB线,可以像电脑一样,读取U盘里的文件或者写入。

2、为什么Android要使用UVCCamera?

在Android手机上 如果我们使用USBCamera设备 就得需要OTG功能,大部分手机的OTG功能都被厂商屏蔽掉了,如果想用就得ROOT设备(用户如果装一个APP就得ROOT设备,不现实!!)

开源项目UVCCamera,实现了手机无需ROOT就支持USBCamera设备的检测、连接、预览和音视频数据采集等功能。

UVCCamera开源项目链接 : https://github.com/saki4510t/UVCCamera

三、了解每个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控件。目前这只支持亮度和对比度。

四、UVCCamera项目模块介绍

1、整个UVCCamera框架包括:

• Java层封装

• libjpeg-turbo1500.so、libusb100.so、libuvc.so、libUVCCamera.so这几个库

• 库的源码

2、库文件功能介绍

  • libjpeg-turbo1500.so JPEG图像编码、解码和转码的库
  • libusb100.so USB通信的库
  • libuvc.so 建立在libusb库上的跨平台的USB视频设备库
  • libUVCCamera.so UVC Camera库

驱动层面使用原生C++语言编写,根据自己使用的架构可以编译不同架构so库

1
2
3
4
5
6
7
#libuvccamera/src/main/jni/Application.mk

#NDK_TOOLCHAIN_VERSION := 4.9
APP_PLATFORM := android-16
APP_ABI := armeabi-v7a arm64-v8a
APP_OPTIM := debug
# APP_OPTIM := release

UVCCamera相关内容