Flutter USB视频类设备访问插件uvc的使用

Flutter USB视频类设备访问插件uvc的使用

该插件用于控制符合UVC标准的网络摄像头。您可以在这里找到更多关于UVC USB设备的信息。

平台支持

Android iOS MacOS Web Linux Windows

示例

import 'package:uvc/uvc.dart';

void main() {
  final uvc = UvcLib(); // 加载libusb库

  final camera = uvc.control(vendorId: 0x1532, productId: 0x0E05); // 控制指定的摄像头

  final value = camera.zoom.min; // 获取当前缩放值的最小值
  camera.zoom.current = value == null ? 225 : value + 1; // 设置新的缩放值

  camera.close(); // 关闭摄像头

  uvc.dispose(); // 卸载库
}

使用方法

首先,在pubspec.yaml文件中添加uvc作为依赖项,并运行dart pub getflutter pub get

final uvc = UvcLib(); // 实例化UvcLib类以加载并设置libusb库

要打开并控制摄像头,请使用UVCControl类。包括摄像头的厂商ID和产品ID。

final camera = UvcLib().control(vendorId: 0x1532, productId: 0x0E05); // 控制指定的摄像头

要查找摄像头列表及其ID,请使用以下代码:

final uvcDevices = uvc.getDevices(onlyUvcDevices: true); // 获取所有UVC设备
final device = uvcDevices.first; // 获取第一个设备
final vendorId = device.deviceDescriptor.vendorId; // 获取厂商ID
final productId = device.deviceDescriptor.productId; // 获取产品ID

要获取当前的缩放值:

final value = camera.zoom.current; // 获取当前缩放值

要设置新的缩放值:

camera.zoom.current = 225; // 设置新的缩放值

关闭摄像头:

camera.close(); // 关闭摄像头

卸载库:

uvc.dispose(); // 卸载库

要获取缩放值的有效范围:

final min = camera.zoom.min; // 获取缩放值的最小值
final max = camera.zoom.max; // 获取缩放值的最大值

对于平移(pan)或倾斜(tilt)值,只需将名称替换为pantilt即可:

camera.pan.current; // 获取当前平移值
camera.tilt.current; // 获取当前倾斜值

控制项

平移(Pan)

camera.pan.current; // 获取当前平移值

倾斜(Tilt)

camera.tilt.current; // 获取当前倾斜值

缩放(Zoom)

final camera = UvcLib().control(vendorId: 0x1532, productId: 0x0E05); // 控制指定的摄像头

camera.zoom.current; // 获取当前缩放值
camera.zoom.defaultValue; // 获取默认缩放值
camera.zoom.max; // 获取最大缩放值
camera.zoom.min; // 获取最小缩放值
camera.zoom.resolution; // 获取缩放分辨率

背光补偿(Backlight Compensation)

camera.backlightCompensation.current; // 获取当前背光补偿值

亮度(Brightness)

camera.brightness.current; // 获取当前亮度值

对比度(Contrast)

camera.contrast.current; // 获取当前对比度值

饱和度(Saturation)

camera.saturation.current; // 获取当前饱和度值

锐度(Sharpness)

camera.sharpness.current; // 获取当前锐度值

白平衡(White Balance)

camera.whiteBalance.current; // 获取当前白平衡值

焦距(Focus)

camera.focus.current; // 获取当前焦距值

自动对焦(Focus Auto)

camera.focusAuto.current; // 获取当前自动对焦状态

电源线频率(Powerline Frequency)

camera.powerlineFrequency.current; // 获取当前电源线频率

调试

UvcLib中启用日志记录以进行故障排除。只需在创建UvcLib时传递truedebugLogging

final uvc = UvcLib(debugLogging: true); // 启用日志记录

还可以在UvcLib中启用libusb日志记录以进行故障排除。只需在创建UvcLib时传递truedebugLoggingLibUsb

final uvc = UvcLib(debugLoggingLibUsb: true); // 启用libusb日志记录

更多关于Flutter USB视频类设备访问插件uvc的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter USB视频类设备访问插件uvc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中访问USB视频类设备(如摄像头)通常需要使用到原生平台(Android和iOS)的相关API,因为Flutter本身并不直接提供对底层硬件设备的访问。对于USB视频类设备(UVC,USB Video Class),你需要借助一些原生插件来实现这一功能。

虽然Flutter社区可能没有现成的、广泛认可的UVC插件,但你可以通过编写或集成原生模块来实现这一功能。下面是一个简要的示例,展示如何在Flutter项目中集成原生代码来访问UVC设备。

步骤 1: 创建Flutter项目

首先,创建一个新的Flutter项目:

flutter create usb_camera_app
cd usb_camera_app

步骤 2: 添加原生依赖

Android

android/app/src/main/AndroidManifest.xml中添加必要的权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

然后,在android/目录下创建一个新的原生模块,用于处理UVC设备的访问。这通常涉及到使用如OpenCVFFmpeg等库来处理视频流。这里为了简化,我们假设你已经有一个处理UVC设备的Android库。

android/app/build.gradle中添加依赖:

dependencies {
    // 假设你有一个名为'uvc-library'的AAR文件
    implementation fileTree(dir: "libs", include: ["*.aar"])
    // 其他依赖...
}

android/src/main/java/...下创建一个新的Java/Kotlin类来封装UVC设备的访问逻辑。

iOS

对于iOS,处理UVC设备通常需要使用AVFoundation框架。你需要在ios/Runner/目录下的Info.plist中添加必要的权限:

<key>NSCameraUsageDescription</key>
<string>需要访问摄像头</string>

然后,在ios/Runner/目录下创建一个Swift或Objective-C桥接文件,用于处理UVC设备的访问。

步骤 3: 创建Flutter插件

为了将原生代码暴露给Flutter,你需要创建一个Flutter插件。在项目的根目录下运行:

flutter create --template=plugin usb_camera_plugin

这将创建一个名为usb_camera_plugin的新目录,其中包含插件的模板代码。

usb_camera_plugin/android/usb_camera_plugin/ios/目录下,分别实现访问UVC设备的逻辑。

例如,在Android中,你可以在UsbCameraPlugin.java中添加方法:

import android.content.Context;
import androidx.annotation.NonNull;

import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.embedding.engine.plugins.activity.ActivityAware;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;

public class UsbCameraPlugin implements FlutterPlugin, MethodCallHandler, ActivityAware {
    private MethodChannel channel;
    private Context applicationContext;
    private ActivityPluginBinding activityBinding;

    @Override
    public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
        channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "usb_camera_plugin");
        channel.setMethodCallHandler(this);
        applicationContext = flutterPluginBinding.getApplicationContext();
    }

    @Override
    public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
        if (call.method.equals("initializeCamera")) {
            // 在这里调用你的UVC库来初始化摄像头
            result.success("Camera initialized");
        } else {
            result.notImplemented();
        }
    }

    @Override
    public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
        channel.setMethodCallHandler(null);
    }

    @Override
    public void onAttachedToActivity(ActivityPluginBinding binding) {
        activityBinding = binding;
    }

    @Override
    public void onDetachedFromActivityForConfigChanges() {
        activityBinding = null;
    }

    @Override
    public void onReattachedToActivityForConfigChanges(ActivityPluginBinding binding) {
        activityBinding = binding;
    }

    @Override
    public void onDetachedFromActivity() {
        activityBinding = null;
    }
}

在iOS中,你可以在UsbCameraPlugin.swift中添加方法:

import Flutter
import UIKit
import AVFoundation

public class UsbCameraPlugin: NSObject, FlutterPlugin {
    public static func register(with registrar: FlutterRegistrar) {
        let channel = FlutterMethodChannel(name: "usb_camera_plugin", binaryMessenger: registrar.messenger())
        let instance = UsbCameraPlugin()
        registrar.addMethodCallDelegate(instance, channel: channel)
    }

    public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
        if call.method == "initializeCamera" {
            // 在这里使用AVFoundation初始化摄像头
            result("Camera initialized")
        } else {
            result(FlutterMethodNotImplementedError(methodName: call.method))
        }
    }
}

步骤 4: 在Flutter应用中使用插件

最后,在你的Flutter应用中引用并使用这个插件。在pubspec.yaml中添加:

dependencies:
  flutter:
    sdk: flutter
  usb_camera_plugin:
    path: ./usb_camera_plugin

然后在你的Dart代码中调用插件方法:

import 'package:flutter/material.dart';
import 'package:usb_camera_plugin/usb_camera_plugin.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('USB Camera App'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              final UsbCameraPlugin plugin = UsbCameraPlugin();
              final String result = await plugin.initializeCamera();
              print(result);
            },
            child: Text('Initialize Camera'),
          ),
        ),
      ),
    );
  }
}

请注意,上述代码是一个简化的示例,用于展示如何在Flutter项目中集成原生代码来访问UVC设备。实际的UVC设备访问逻辑会复杂得多,并可能涉及到多线程、视频流处理、错误处理等。你可能需要查阅相关的Android和iOS文档,以及你选择的UVC库的文档,来实现完整的功能。

回到顶部