
Android平台上灵活实用的UVC摄像头引擎,无需任何系统权限即可轻松打开您的uvc摄像头。 您唯一应该做的就是确认您的 Android 设备必须支持 OTG 功能。 所以,欢迎使用AUSBC3.0,欢迎star & fork & issues!
支持在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设备等
AUSBC 3.0 与之前的版本有点不同,到目前为止还不能直接被 gradle 依赖。你唯一应该做的就是关闭项目并将其添加为你自己项目的模块。 当然,以后肯定会支持依赖的方式。 至于如何正确使用这个模块,只要让你的 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)
