目录标题
UVCCamera 项目解析与优化实践
一、项目简介
UVCCamera 是一个基于 UVCCamera 优化而来的 Android USB 摄像头库。该项目旨在解决原版中的一些常见问题,并减少预览编码队列以实现低延迟的视频预览效果。通过去除不必要的代码,仅保留核心功能部分,该库被打包成 aar 文件,方便二次开发。
项目地址:https://gitee.com/yunianvh/usb-camera
二、项目结构
2.1 项目依赖
- JUnit:用于单元测试,版本为
junit:junit==4
。
2.2 项目目录
-
根目录:
README.md
:项目说明文档。gradle.properties
:Gradle 配置文件。jitpack.yml
:JitPack 配置文件。
-
demo:
src/main/java/com/shlll/usbcamera/ExampleInstrumentedTest.java
:示例仪器测试类。src/test/java/com/shlll/usbcamera/ExampleUnitTest.java
:示例单元测试类。
-
libusbcamera:
- 包含多个子模块,如
jni
、java
等,负责处理底层的 USB 摄像头控制和图像处理。 src/main/jni/libusb/examples
:包含一些 libusb 的示例代码。src/main/jni/rapidjson
:JSON 解析库 RapidJSON 及其相关测试和示例代码。src/main/jni/libjpeg-turbo-1.5.0
:JPEG 图像压缩库及其 SIMD 优化代码。src/main/jni/libuvc
:USB 视频类(UVC)设备控制库。
- 包含多个子模块,如
三、使用方法
3.1 添加依赖
在项目的 build.gradle
文件中添加 JitPack 仓库和 UVCCamera 库的依赖项:
allprojects {
repositories {
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
dependencies {
//JitPack包已经很久没更新,直接引用libusbcamera模块:implementation project(':libusbcamera')
implementation "com.gitee.yunianvh:usb-camera:libusbcamera-1.2.3"
}
3.2 初始化和使用
在应用的主活动中初始化并使用 UVCCameraHelper 类来控制摄像头:
public class MainActivity extends AppCompatActivity {
private TextView textView;
private OpenGlView openGlView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.camera_tv);
openGlView = (OpenGlView) findViewById(R.id.camera_opengl_view);
init();
}
public void init() {
USBCameraHelper.getInstance().init(this, openGlView, new ConnectCheckerRtmp() {
// 实现连接回调接口
});
}
@Override
protected void onDestroy() {
if (USBCameraHelper.getInstance() != null) {
USBCameraHelper.getInstance().destory();
}
super.onDestroy();
}
@Override
protected void onStart() {
if (USBCameraHelper.getInstance() != null) {
USBCameraHelper.getInstance().start();
}
super.onStart();
}
@Override
protected void onStop() {
if (USBCameraHelper.getInstance() != null) {
USBCameraHelper.getInstance().stop();
}
super.onStop();
}
}
四、主要功能
4.1 录制功能
可以通过 USBCameraHelper
类进行录制操作:
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (USBCameraHelper.getInstance().isRecording()) {
USBCameraHelper.getInstance().stopRecord();
textView.setText("开始录制");
} else {
String recoderPath = getExternalFilesDir(null).getAbsolutePath() + "/" + new SimpleDateFormat("dd HH:mm:ss").format(new Date()) + ".mp4";
USBCameraHelper.getInstance().startRecord(recoderPath);
textView.setText("关闭录制");
}
}
});
4.2 推流功能
支持推流到指定地址:
textView2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (USBCameraHelper.getInstance().isStreaming()) {
USBCameraHelper.getInstance().stopStream();
textView2.setText("开始推流");
} else {
String url = editText.getText().toString();
if (TextUtils.isEmpty(url)) {
Toast.makeText(MainActivity.this, "请输入推流地址", Toast.LENGTH_SHORT).show();
return;
}
USBCameraHelper.getInstance().startStream(url);
textView2.setText("关闭推流");
}
}
});
4.3 参数设置
可以设置摄像头的各种参数,如分辨率、曝光模式等:
USBCameraHelper.getInstance().setPreviewSize(1920, 1080, 1024 * 1024 * 5, 0);
USBCameraHelper.getInstance().setExposureMode(UVCCamera.EXPOSURE_MODE_MANUAL);
USBCameraHelper.getInstance().setExposurePriority(1);
五、优化与改进
5.1 性能优化
- 减少预览编码队列:通过优化编码队列,减少了预览时的延迟,提升了用户体验。
- SIMD 优化:利用 libjpeg-turbo 提供的 SIMD 优化代码,提高了图像处理速度。
5.2 功能扩展
- 支持更多摄像头控制:增加了对色相、增益、自动白平衡等功能的支持。
- 推流协议支持:除了 RTMP 协议外,未来计划支持更多推流协议,如 HLS、RTSP 等。
六、总结
UVCCamera 项目通过对原版 UVCCamera 的优化,解决了许多常见的问题,并提供了更丰富的功能和更好的性能表现。通过将项目打包成 aar 文件,使得开发者可以更加方便地集成到自己的项目中。希望这篇博客能够帮助更多的开发者了解并使用 UVCCamera 库,共同推动 USB 摄像头技术的发展。