AUSBC3.0, 震撼来袭!(UVC Camera,支持开启多路摄像头)

13,210 阅读4分钟

logo.png

AUSBC  API

 Android灵活实用的Android平台UVC摄像头引擎,无需任何系统权限即可轻松打开您的uvc摄像头(支持多路摄像头)。 您唯一应该做的就是确认您的 Android 设备必须支持 OTG 功能。 欢迎使用AUSBC3.0,欢迎star & fork & issues

微信图片_20220724130902.jpg

@ Example showing

Feature

  • 支持开启多路摄像头;
  • 支持在Android 4.4~11开启camera1、camera2和uvc camera;
  • 支持预览480p、720p、1080p等;
  • 支持使用 OpenGL ES 2.0 添加效果;
  • 支持抓图(.jpg)、视频(.mp4/.h264/yuv)和音频(pcm/mp3/aac)
  • 支持旋转相机视图;
  • 支持在屏幕外显示相机;
  • 支持录制媒体以及获取 h264/aac 流,您可以将其推送到您的媒体服务器;
  • 支持获取所有分辨率和usb设备等

Usages

AUSBC 3.0被kotlin重构,使用更简单,功能更丰富。 所以,我强烈建议您使用当前版本,让我们一起构建它。

  • 获取 AUSBC

 首先,将它添加到你的根目录build.gradlesettings.gradle

allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

 其次,在你的 app.gradle 中添加依赖,最新版本是

dependencies {
    implementation 'com.github.jiangdongguo.AndroidUSBCamera:libausbc:latest_tag'
}
  • 简单使用

  至于如何正确使用这个库,只要让你的 Fragment 或 Activity 实现 CameraFragmentCameraActivity 即可。

class DemoFragment : CameraFragment() {
    private lateinit var mViewBinding: FragmentDemoBinding
    
    override fun initView() {
        
    }
    
    override fun getCameraView(): IAspectRatio {
        return AspectRatioTextureView(requireContext())
    }
    
    override fun initData() {
        
    }

    override fun getCameraViewContainer(): ViewGroup {
        return mViewBinding.cameraViewContainer
    }

    override fun getRootView(inflater: LayoutInflater, container: ViewGroup?): View {
        mViewBinding = FragmentDemoBinding.inflate(inflater, container, false)
        return mViewBinding.root
    }

    override fun getGravity(): Int = Gravity.TOP
}

 最重要的是你应该重写getRootView()/getCameraViewContainer()/ getCameraView() 至少表示fragment的根视图、纹理或表面视图以及它的容器。当然和CameraActivity一样,现在你可以看到uvc相机预览。

  • 高级用法

 如果你想要一些自定义配置,你可以这样做:

class DemoFragment : CameraFragment() {
    ...
    override fun getCameraClient(): CameraClient? {
        return CameraClient.newBuilder(requireContext())
            .setEnableGLES(true)   // use opengl render 
            .setRawImage(true)     // capture raw or filter image
            .setDefaultEffect(EffectBlackWhite(requireContext())) // default effect
            .setCameraStrategy(CameraUvcStrategy(requireContext())) // camera type
            .setCameraRequest(getCameraRequest()) // camera configurations
            .setDefaultRotateType(RotateType.ANGLE_0) // default camera rotate angle
            .openDebug(true) // is debug mode
            .build()
    }
    
    private fun getCameraRequest(): CameraRequest {
        return CameraRequest.CameraRequestBuilder()
            .setFrontCamera(false) // only for camera1/camera2
            .setPreviewWidth(640)  // initial camera preview width
            .setPreviewHeight(480) // initial camera preview height
            .create()
    }
}

 毫无疑问CameraClient是这个库中的核心类,你可以使用默认的CameraClient对象来预览你的相机或自定义它。 通过使用CameraClient,您可以捕获jpg 图像或mp4 视频或mp3 音频文件并更新分辨率或不同的uvc 相机。 您甚至可以获取 H264/AAC/YUV 的流。 例如:

// capture jpg image
mCameraClient?.captureImage(callBack, savePath)

// capture mp4 video
mCameraClient?.captureVideoStart(callBack, path, durationInSec)
mCameraClient?.captureVideoStop()

// capture mp3 audio
mCameraClient?.captureAudioStart(callBack, path)
mCameraClient?.captureAudioStop()

// play mic in real time
mCameraClient?.startPlayMic(callBack)
mCameraClient?.stopPlayMic()

// rotate camera
// base on opening opengl es
mCameraClient?.setRotateType(type)

// switch different camera
mCameraClient?.switchCamera(cameraId)

// update resolution
mCameraClient?.updateResolution(width, height)

// get all preview sizes
mCameraClient?.getAllPreviewSizes(aspectRatio)

// acquire encode data(h264 or aac)
mCameraClient?.addEncodeDataCallBack(callBack)

// acquire raw data(yuv)
mCameraClient?.addPreviewDataCallBack(callBack)

 对于更高级的功能,您甚至可以为您的相机添加一些滤镜。这个库提供了一些默认滤镜,如 EffectBlackWhiteEffectSoulEffectZoom 等 将来会添加过滤器。当然,您也可以通过扩展 AbstractEffect 来实现自己的过滤器。 例如:

// First, extending AbstractEffect
class EffectBlackWhite(ctx: Context) : AbstractEffect(ctx) {

    override fun getId(): Int = ID

    override fun getClassifyId(): Int = CameraEffect.CLASSIFY_ID_FILTER

    override fun getVertexSourceId(): Int = R.raw.base_vertex

    override fun getFragmentSourceId(): Int = R.raw.effect_blackw_fragment

    companion object {
        const val ID = 100
    }
}

// Second, adding or updating or removing filter
mCameraClient?.addRenderEffect(effect)
mCameraClient?.removeRenderEffect(effect)
mCameraClient?.updateRenderEffect(classifyId, effect)
  • 开启多路摄像头

 如果你想打开多路摄像头,你可以让你的Fragment或者Activity扩展MultiCameraFragment或者MultiCameraActivity。就这样做吧,更多细节请查阅DemoMultiCameraFragment

class DemoMultiCameraFragment : MultiCameraFragment(), ICameraStateCallBack {

    override fun onCameraAttached(camera: MultiCameraClient.Camera) {
 		// a camera be attached
    }

    override fun onCameraDetached(camera: MultiCameraClient.Camera) {
		// a camera be detached
    }

    override fun onCameraConnected(camera: MultiCameraClient.Camera) {
        // a camera be connected
  		camera.openCamera(textureView, getCameraRequest())
        camera.setCameraStateCallBack(this)
    }

    override fun onCameraDisConnected(camera: MultiCameraClient.Camera) {
     // a camera be disconnected
    }


    override fun onCameraState(
        self: MultiCameraClient.Camera,
        code: ICameraStateCallBack.State,
        msg: String?
    ) {
		// a camera be opened or closed or error
    }

    override fun getRootView(inflater: LayoutInflater, container: ViewGroup?): View {
        return rootView
    }
}
  • 在线调试

 如果您想在线调试项目或修改某些内容,您应该执行以下步骤:

首先,修改 Settings.gradle 文件并使其成为模块。

include ':app'

// For debug online
include ':libausbc'
include ':libuvc'
include ':libpush'
include ':libnative'
include ':libuvccommon'

其次,让 app.gradle 依赖于 ':libausbc'

dependencies {

    // For debug online
    implementation project(':libausbc')

    // demo
    //implementation 'com.github.jiangdongguo.AndroidUSBCamera:libausbc:3.1.7'
}

@ 中文文档

Demo

  • download by Scanning code

download.png

  • download by opening url

AUSBC.apk

问答

1.相机预览黑屏?

首先,检查 targetSdk 版本。 如果 targetSdk>=28,您应该授予应用 android.permission.CAMERA 权限,此解决方案将照常解决。 但是,如果它不起作用,则必须将 targetSdk 设置为低于 28,因为这是自定义系统问题。 否则,如果您已经获得了 uvc 摄像头权限授予对话框,请向我发送一封电子邮件,其中包含您在位置 Android/data/com.jiangdg.ausbc/files 的日志。

主页和帮助

1。 JUEJIN

2. CSDN(更新停止)

 如果您有任何问题或有趣的想法,请发给我。  当然,你也可以发邮件给我[765067602@qq.com]。

 所以,别忘了从位置Android/data/com.jiangdg.ausbc/files发送日志,并通过执行收集logcat信息command adb shell logcat -v threadtime > usbcamera.log

Github主页

github.com/jiangdonggu…