Android灵活实用的Android平台UVC摄像头引擎,无需任何系统权限即可轻松打开您的uvc摄像头(支持多路摄像头)。 您唯一应该做的就是确认您的 Android 设备必须支持 OTG 功能。 欢迎使用AUSBC3.0,欢迎star & fork & issues!
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.gradle 或settings.gradle:
allprojects {
repositories {
google()
jcenter()
maven { url "https://jitpack.io" }
}
}
其次,在你的 app.gradle 中添加依赖,最新版本是 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SiVDEaQ7-1658640679873)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fafe2e67f10f40a287a32175a4ec87f9~tplv-k3u1fbpfcp-zoom-1.image)]:
dependencies {
implementation 'com.github.jiangdongguo.AndroidUSBCamera:libausbc:latest_tag'
}
- 简单使用
至于如何正确使用这个库,只要让你的 Fragment 或 Activity 实现 CameraFragment 或 CameraActivity 即可。
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)
对于更高级的功能,您甚至可以为您的相机添加一些滤镜。这个库提供了一些默认滤镜,如 EffectBlackWhite、EffectSoul 和 EffectZoom 等 将来会添加过滤器。当然,您也可以通过扩展 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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P6cSHC5m-1658640679874)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fdc8e416780b44039eff446f15389d58~tplv-k3u1fbpfcp-watermark.image?)]
- download by opening url
问答
1.相机预览黑屏?
首先,检查 targetSdk
版本。 如果 targetSdk>=28
,您应该授予应用 android.permission.CAMERA
权限,此解决方案将照常解决。 但是,如果它不起作用,则必须将 targetSdk 设置为低于 28,因为这是自定义系统问题。 否则,如果您已经获得了 uvc 摄像头权限授予对话框,请向我发送一封电子邮件,其中包含您在位置 Android/data/com.jiangdg.ausbc/files
的日志。
主页和帮助
如果您有任何问题或有趣的想法,请发给我。
当然,你也可以发邮件给我[765067602@qq.com]。
所以,别忘了从位置Android/data/com.jiangdg.ausbc/files发送日志,并通过执行收集logcat信息command adb shell logcat -v threadtime > usbcamera.log