UVCCamera 项目解析与优化实践

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

    • 包含多个子模块,如 jnijava 等,负责处理底层的 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 摄像头技术的发展。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玉念聿辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值