Flutter增强现实实时通信插件ar_rtc_engine的使用

Flutter增强现实实时通信插件ar_rtc_engine的使用

ar_rtc_engine

此 Flutter 插件 是对 anyRTC 音视频 SDK 的封装。

您可以集成此 SDK 以便在您自己的应用程序中快速实现实时通信。


快速开始

参阅 example 目录,这是一个一对一视频聊天的示例。


设备权限

SDK 需要 摄像头 和 麦克风 权限来开始视频通话。

Android

打开 AndroidManifest.xml 文件并且添加必备的权限到此文件中.

<manifest>
    ...
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <!-- The SDK requires Bluetooth permissions in case users are using Bluetooth devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    ...
</manifest>

完整示例代码

以下是一个简单的示例,展示如何使用 ar_rtc_engine 实现一对一视频通话。

示例代码
// example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:ar_rtc_engine/ar_rtc_engine.dart'; // 引入 ar_rtc_engine 插件

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // 这是应用的根部件。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: VideoCallPage(), // 主页面为视频通话页面
    );
  }
}

class VideoCallPage extends StatefulWidget {
  [@override](/user/override)
  _VideoCallPageState createState() => _VideoCallPageState();
}

class _VideoCallPageState extends State<VideoCallPage> {
  final _engine = RtcEngine(); // 创建 RTC 引擎实例
  String appId = "your_app_id"; // 替换为您的 AnyRTC App ID
  String channelId = "test_channel"; // 通话频道名称
  bool _joined = false; // 是否已加入频道
  bool _isSpeakerOn = true; // 是否开启扬声器

  [@override](/user/override)
  void initState() {
    super.initState();
    initRtcEngine(); // 初始化 RTC 引擎
  }

  Future<void> initRtcEngine() async {
    await _engine.initialize(RtcEngineContext(appId: appId)); // 初始化引擎并设置 App ID
    _engine.enableAudio(); // 启用音频
    _engine.enableVideo(); // 启用视频
    _engine.setChannelProfile(ChannelProfileType.channelProfileLiveBroadcasting); // 设置频道类型
    _engine.startPreview(); // 开始预览
    _engine.setClientRole(role: ClientRoleType.clientRoleBroadcaster); // 设置角色(主播模式)
    _engine.setAudioRoute(_isSpeakerOn ? AudioPlaybackRouteType.audioPlaybackRouteSpeakerphone : AudioPlaybackRouteType.audioPlaybackRouteEarpiece); // 设置默认音频路由
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter 视频通话'),
      ),
      body: Stack(
        children: [
          Center(
            child: _joined
                ? RTCVideoView(
                    _engine, // 显示本地视频流
                    objectFit: VideoObjectFit.videoObjectFitCover,
                  )
                : Container(), // 如果未加入频道,不显示视频
          ),
          Positioned(
            bottom: 20,
            left: 20,
            child: ElevatedButton(
              onPressed: () async {
                if (_joined) {
                  await _engine.leaveChannel(); // 离开频道
                  setState(() {
                    _joined = false;
                  });
                } else {
                  await _engine.joinChannel(
                    token: null, // 使用空令牌(需要配置服务器端生成令牌)
                    channelId: channelId,
                    uid: 123, // 用户 ID
                  );
                  setState(() {
                    _joined = true;
                  });
                }
              },
              child: Text(_joined ? '离开频道' : '加入频道'),
            ),
          ),
          Positioned(
            bottom: 20,
            right: 20,
            child: ElevatedButton(
              onPressed: () {
                setState(() {
                  _isSpeakerOn = !_isSpeakerOn; // 切换扬声器状态
                  _engine.setAudioRoute(
                    _isSpeakerOn
                        ? AudioPlaybackRouteType.audioPlaybackRouteSpeakerphone
                        : AudioPlaybackRouteType.audioPlaybackRouteEarpiece,
                  );
                });
              },
              child: Text(_isSpeakerOn ? '扬声器关闭' : '扬声器开启'),
            ),
          ),
        ],
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    _engine.stopPreview(); // 停止预览
    _engine.leaveChannel(); // 离开频道
    _engine.release(); // 释放资源
    super.dispose();
  }
}

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

1 回复

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


ar_rtc_engine 是一个用于 Flutter 的增强现实(AR)实时通信(RTC)插件。它结合了 AR 和 RTC 技术,允许开发者在 Flutter 应用中实现增强现实场景下的实时音视频通信。以下是如何使用 ar_rtc_engine 插件的基本步骤和示例代码。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 ar_rtc_engine 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  ar_rtc_engine: ^latest_version

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

2. 初始化 AR RTC Engine

在你的 Flutter 应用中,首先需要初始化 AR RTC Engine。通常,你可以在 main.dart 或某个初始化方法中进行初始化。

import 'package:ar_rtc_engine/ar_rtc_engine.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 AR RTC Engine
  await ArRtcEngine.init('YOUR_APP_ID');
  
  runApp(MyApp());
}

3. 创建 AR 场景

接下来,你可以使用 ArRtcEngine 创建一个 AR 场景,并设置相关参数。

class ARView extends StatefulWidget {
  @override
  _ARViewState createState() => _ARViewState();
}

class _ARViewState extends State<ARView> {
  ArRtcEngine _engine;

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

  Future<void> _initEngine() async {
    _engine = await ArRtcEngine.create('YOUR_APP_ID');
    
    // 设置 AR 场景参数
    await _engine.setARSceneConfiguration(
      ArSceneConfiguration(
        sceneType: ArSceneType.ARSCENE_TYPE_3D,
        enableAudio: true,
        enableVideo: true,
      ),
    );
    
    // 加入 AR 场景
    await _engine.joinARScene('YOUR_CHANNEL_NAME', 'YOUR_USER_ID');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ArRtcEngineView(
        engine: _engine,
      ),
    );
  }

  @override
  void dispose() {
    _engine.destroy();
    super.dispose();
  }
}

4. 处理实时音视频通信

在 AR 场景中,你可以使用 ArRtcEngine 来处理实时音视频通信。以下是一些常见的操作:

// 开启本地视频
await _engine.enableLocalVideo(true);

// 开启本地音频
await _engine.enableLocalAudio(true);

// 订阅远程用户的视频流
_engine.onUserJoined = (userId) {
  _engine.subscribeRemoteVideo(userId);
};

// 处理远程视频流
_engine.onRemoteVideoStateChanged = (userId, state) {
  if (state == VideoStreamState.VIDEO_STREAM_STARTED) {
    // 显示远程视频
  } else if (state == VideoStreamState.VIDEO_STREAM_STOPPED) {
    // 隐藏远程视频
  }
};

// 处理远程音频流
_engine.onRemoteAudioStateChanged = (userId, state) {
  if (state == AudioStreamState.AUDIO_STREAM_STARTED) {
    // 播放远程音频
  } else if (state == AudioStreamState.AUDIO_STREAM_STOPPED) {
    // 停止播放远程音频
  }
};

5. 离开 AR 场景

当用户离开 AR 场景时,你需要调用 leaveARScene 方法来释放资源。

await _engine.leaveARScene();

6. 销毁 AR RTC Engine

在应用退出或不再需要使用 AR RTC Engine 时,记得调用 destroy 方法来释放资源。

await _engine.destroy();

7. 处理权限

在使用 AR 和 RTC 功能时,通常需要获取摄像头和麦克风的权限。你可以在 initEngine 方法中添加权限请求:

import 'package:permission_handler/permission_handler.dart';

Future<void> _initEngine() async {
  // 请求摄像头权限
  await Permission.camera.request();
  
  // 请求麦克风权限
  await Permission.microphone.request();
  
  // 初始化 AR RTC Engine
  _engine = await ArRtcEngine.create('YOUR_APP_ID');
  
  // 其他初始化操作...
}

8. 处理错误和事件

ar_rtc_engine 插件提供了多种事件和错误回调,你可以根据需要进行处理。

_engine.onError = (errorCode, errorMessage) {
  // 处理错误
};

_engine.onWarning = (warningCode, warningMessage) {
  // 处理警告
};

_engine.onARSceneJoined = (channel, userId) {
  // 成功加入 AR 场景
};

_engine.onARSceneLeaved = (channel, userId) {
  // 离开 AR 场景
};
回到顶部