Flutter增强现实功能插件rwa_deep_ar的使用

概述

camera_deep_ar是一个用于摄像头视频和照片增强现实录制的新插件。此插件要求 Android SDK 19+ 和 iOS 10+。在代码中必须请求权限,否则首次运行时可能无法正常工作。

开始使用

获取 API 密钥

首先,从 DeepAr 获取您的 API 密钥。

示例代码

以下是一个完整的示例代码,展示如何使用 camera_deep_ar 插件。

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  CameraDeepArController cameraDeepArController;
  int currentPage = 0;
  final vp = PageController(viewportFraction: .24);
  Effects currentEffect = Effects.none;
  Filters currentFilter = Filters.none;
  Masks currentMask = Masks.none;
  bool isRecording = false;

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        backgroundColor: Colors.black,
        appBar: AppBar(
          title: const Text('DeepAR Camera Example'),
        ),
        body: Stack(
          children: [
            CameraDeepAr(
              onCameraReady: (isReady) {
                _platformVersion = "Camera status $isReady";
                setState(() {});
              },
              onImageCaptured: (path) {
                _platformVersion = "Image Taken @ $path";
                setState(() {});
              },
              onVideoRecorded: (path) {
                _platformVersion = "Video Recorded @ $path";
                isRecording = false;
                setState(() {});
              },
              androidLicenceKey:
                  "3b58c448bd650192e7c53d965cfe5dc1c341d2568b663a3962b7517c4ac6eeed0ba1fb2afe491a4b",
              iosLicenceKey:
                  "53618212114fc16bbd7499c0c04c2ca11a4eed188dc20ed62a7f7eec02b41cb34d638e72945a6bf6",
              cameraDeepArCallback: (c) async {
                cameraDeepArController = c;
                setState(() {});
              },
            ),
            Align(
              alignment: Alignment.bottomCenter,
              child: Container(
                padding: EdgeInsets.all(20),
                child: Column(
                  mainAxisSize: MainAxisSize.min,
                  mainAxisAlignment: MainAxisAlignment.end,
                  children: [
                    Text(
                      'Response >>> : $_platformVersion\n',
                      textAlign: TextAlign.center,
                      style: TextStyle(fontSize: 14, color: Colors.white),
                    ),
                    SizedBox(height: 20),
                    Row(
                      children: [
                        Expanded(
                          child: FlatButton(
                            onPressed: () {
                              if (null == cameraDeepArController) return;
                              if (isRecording) return;
                              cameraDeepArController.snapPhoto();
                            },
                            child: Icon(Icons.camera_enhance_outlined),
                            color: Colors.white,
                            padding: EdgeInsets.all(15),
                          ),
                        ),
                        if (isRecording)
                          Expanded(
                            child: FlatButton(
                              onPressed: () {
                                if (null == cameraDeepArController) return;
                                cameraDeepArController.stopVideoRecording();
                                isRecording = false;
                                setState(() {});
                              },
                              child: Icon(Icons.videocam_off),
                              color: Colors.red,
                              padding: EdgeInsets.all(15),
                            ),
                          )
                        else
                          Expanded(
                            child: FlatButton(
                              onPressed: () {
                                if (null == cameraDeepArController) return;
                                cameraDeepArController.startVideoRecording();
                                isRecording = true;
                                setState(() {});
                              },
                              child: Icon(Icons.videocam),
                              color: Colors.green,
                              padding: EdgeInsets.all(15),
                            ),
                          ),
                      ],
                    ),
                    SingleChildScrollView(
                      padding: EdgeInsets.all(15),
                      scrollDirection: Axis.horizontal,
                      child: Row(
                        children: List.generate(Masks.values.length, (p) {
                          bool active = currentPage == p;
                          return GestureDetector(
                            onTap: () {
                              currentPage = p;
                              cameraDeepArController.changeMask(p);
                              setState(() {});
                            },
                            child: Container(
                              margin: EdgeInsets.all(5),
                              padding: EdgeInsets.all(12),
                              width: active ? 100 : 80,
                              height: active ? 100 : 80,
                              alignment: Alignment.center,
                              decoration: BoxDecoration(
                                color: active ? Colors.orange : Colors.white,
                                shape: BoxShape.circle,
                              ),
                              child: Text(
                                "$p",
                                textAlign: TextAlign.center,
                                style: TextStyle(
                                  fontSize: active ? 16 : 14,
                                  color: Colors.black,
                                ),
                              ),
                            ),
                          );
                        }),
                      ),
                    ),
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

功能说明

  1. 拍照

    cameraDeepArController.snapPhoto();
    
  2. 开始录像

    cameraDeepArController.startVideoRecording();
    
  3. 停止录像

    cameraDeepArController.stopVideoRecording();
    
  4. 切换面具

    cameraDeepArController.changeMask(p);
    

更多功能将在后续版本中添加。


Android 配置

在 Android 中,可以使用 permission_handler 插件来管理权限。

权限配置

AndroidManifest.xml 中添加以下权限:

<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera.front" />
<uses-feature android:name="android.hardware.microphone" />
<uses-feature android:name="android.hardware.camera2" />
<uses-feature
    android:name="android.hardware.camera.autofocus"
    android:required="true" />
<uses-feature android:name="android.hardware.camera.flash" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

ProGuard 配置

proguard-rules.pro 文件中添加以下内容:

-keepclassmembers class ai.deepar.ar.DeepAR { *; }

对于发布模式,在 build.gradlerelease 部分添加:

buildTypes {
    release {
        signingConfig signingConfigs.debug
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

iOS 配置

在 iOS 中,只需在 Info.plist 中添加权限描述。

<key>NSCameraUsageDescription</key>
<string>Allows you to capture your best moment</string>
<key>io.flutter.embedded_views_preview</key>
<true/>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Allows you to capture your best moment</string>
<key>NSMicrophoneUsageDescription</key>
<string>Needs access to your mic to help your record voice notes on chat/message conversations</string>

更多关于Flutter增强现实功能插件rwa_deep_ar的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter增强现实功能插件rwa_deep_ar的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


rwa_deep_ar 是一个 Flutter 插件,用于集成 DeepAR 增强现实(AR)功能到 Flutter 应用中。DeepAR 是一个强大的 AR SDK,支持面部滤镜、3D 效果、面部跟踪等功能。通过 rwa_deep_ar 插件,你可以在 Flutter 应用中轻松实现这些 AR 效果。

以下是如何使用 rwa_deep_ar 插件的步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 rwa_deep_ar 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  rwa_deep_ar: ^0.0.1  # 检查最新版本

然后运行 flutter pub get 来安装依赖。

2. 获取 DeepAR License Key

在使用 DeepAR 之前,你需要从 DeepAR 官网获取一个 License Key。这个 Key 用于初始化 DeepAR SDK。

3. 初始化 DeepAR

在你的 Dart 代码中,导入 rwa_deep_ar 插件并初始化 DeepAR:

import 'package:rwa_deep_ar/rwa_deep_ar.dart';

final deepAr = DeepAr();

void initDeepAr() async {
  await deepAr.initialize(
    'YOUR_DEEPAR_LICENSE_KEY',
    // 其他可选参数
  );
}

4. 显示 AR 视图

你可以使用 DeepArView 来显示 AR 效果。将 DeepArView 添加到你的 widget 树中:

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('DeepAR Example'),
      ),
      body: DeepArView(
        onViewCreated: (controller) {
          // 你可以在这里访问控制器来加载效果、切换滤镜等
        },
      ),
    );
  }
}

5. 加载 AR 效果

你可以通过 DeepArController 加载不同的 AR 效果。例如,加载一个面部滤镜:

void loadEffect(DeepArController controller) {
  controller.loadEffect('assets/effects/effect1.deepar');
}

你可以在 onViewCreated 回调中访问 DeepArController,并在需要的时候调用 loadEffect

6. 切换摄像头

你可以通过 DeepArController 切换前置和后置摄像头:

void switchCamera(DeepArController controller) {
  controller.switchCamera();
}

7. 处理生命周期

在 Flutter 中,你需要正确处理插件的生命周期。例如,在 dispose 方法中释放资源:

[@override](/user/override)
void dispose() {
  deepAr.dispose();
  super.dispose();
}
回到顶部