Flutter实时音视频通信插件youme_rtc_engine的使用

概述

youme_rtc_engine 是为 Flutter 提供的实时音视频通信插件。通过该插件,您可以轻松实现基于 YouMeRTC 的音视频通话功能。


使用步骤

要使用此插件,请将 youme_rtc_engine 添加到您的 pubspec.yaml 文件中:

dependencies:
  youme_rtc_engine: ^版本号

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


获取示例代码

可以从插件的示例文件夹中获取基本和高级示例。示例代码可以在以下位置找到:


权限配置

在使用 youme_rtc_engine 之前,需要配置相应的权限。

Android

AndroidManifest.xml 中添加以下权限:

<manifest>
  <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" />
  <uses-permission android:name="android.permission.BLUETOOTH" />
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.WAKE_LOCK" />
  <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"
    tools:ignore="ProtectedPermissions" />
</manifest>
iOS & macOS

Info.plist 中添加以下描述:

<key>NSMicrophoneUsageDescription</key>
<string>需要访问麦克风以进行语音通话</string>
<key>NSCameraUsageDescription</key>
<string>需要访问摄像头以进行视频通话</string>

完整示例代码

以下是一个完整的示例代码,展示了如何初始化插件并加入频道。

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

import 'package:flutter/services.dart';
import 'package:youme_rtc_engine/youme_rtc_engine.dart';
import 'dart:math';

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

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

class _MyAppState extends State<MyApp> {
  int _initCode = -1; // 初始化状态码
  int joinChannelState = 0; // 加入频道状态码

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState(); // 初始化平台状态
  }

  // 平台消息异步初始化
  Future<void> initPlatformState() async {
    int initCode = 0;

    // 监听 SDK 事件
    YoumeRtcEngine.addEventChannelHandler((event) {
      print("收到事件: ${event}");
    });

    try {
      // 初始化 SDK
      var appKey = "【https://console.youme.im/user/login】注册后获取";
      var appSecret =
          "【https://console.youme.im/user/login】注册后获取";
      Map<Object?, Object?> ret = await YoumeRtcEngine.init(
        appKey,
        appSecret,
        0, // 渠道类型(0 表示默认)
        "", // 额外参数
      );
      print("初始化结果: ${ret}");
    } on PlatformException {
      initCode = -2; // 初始化失败
    }

    // 如果组件被移除,则忽略回调
    if (!mounted) return;

    setState(() {
      _initCode = initCode; // 更新初始化状态
    });
  }

  Future<void> joinChannel() async {
    int code = 0;

    try {
      // 生成随机用户 ID
      var rng = Random();
      var channelId = "aaaaa";
      var userId = "userId-${rng.nextInt(100000)}";
      var userRole = 1; // 用户角色(1 表示普通用户)

      // 加入频道
      Map<Object?, Object?> ret = await YoumeRtcEngine.joinChannel(
        channelId,
        userId,
        userRole,
      );
      code = ret["code"] as int; // 获取返回的状态码
      print("加入频道结果: ${ret}");

      // 开启麦克风和扬声器
      YoumeRtcEngine.setMicrophoneMute(false);
      YoumeRtcEngine.setSpeakerMute(false);
    } catch (e) {
      print("加入频道异常: ${e}");
      code = -1; // 异常处理
    }

    setState(() {
      joinChannelState = code; // 更新加入频道状态
    });
  }

  static TextStyle textStyle = TextStyle(fontSize: 18, color: Colors.blue);

  Widget mainBody() {
    return Column(
      children: [
        Row(
          children: [
            Center(child: Text("初始化状态: $_initCode")),
          ],
        ),
        Row(
          children: [
            OutlineButton(
              child: Text(
                  '加入频道: aaa, 状态: $joinChannelState', style: textStyle),
              onPressed: joinChannel,
            ),
          ],
        ),
      ],
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('YouMe RTC'),
        ),
        body: Center(
          child: mainBody(),
        ),
      ),
    );
  }
}

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

1 回复

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


youme_rtc_engine 是一个用于 Flutter 的实时音视频通信插件,支持音视频通话、实时消息传输等功能。以下是如何在 Flutter 项目中使用 youme_rtc_engine 插件的基本步骤。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  youme_rtc_engine: ^1.0.0  # 请使用最新版本

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

2. 初始化插件

在 Flutter 应用的 main.dart 文件中初始化 youme_rtc_engine 插件。

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await YoumeRtcEngine.init("YourAppKey", "YourAppSecret");
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

3. 加入房间

HomeScreen 中,你可以实现加入房间的逻辑。

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

class _HomeScreenState extends State<HomeScreen> {
  YoumeRtcEngine _youmeRtcEngine = YoumeRtcEngine();

  [@override](/user/override)
  void initState() {
    super.initState();
    _youmeRtcEngine.onJoinRoomSuccess = (String roomId) {
      print("加入房间成功: $roomId");
    };
    _youmeRtcEngine.onJoinRoomFailed = (String roomId, int errorCode, String errorMessage) {
      print("加入房间失败: $roomId, $errorCode, $errorMessage");
    };
  }

  void _joinRoom() async {
    await _youmeRtcEngine.joinRoom("YourRoomId", "YourUserId");
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Youme RTC Engine Example"),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _joinRoom,
          child: Text("加入房间"),
        ),
      ),
    );
  }
}

4. 处理音视频流

你可以通过 YoumeRtcEngine 提供的 API 来处理音视频流,例如开始/停止本地视频、切换摄像头等。

void _startLocalVideo() async {
  await _youmeRtcEngine.startLocalPreview();
}

void _stopLocalVideo() async {
  await _youmeRtcEngine.stopLocalPreview();
}

void _switchCamera() async {
  await _youmeRtcEngine.switchCamera();
}

5. 离开房间

在离开房间时,记得调用 leaveRoom 方法。

void _leaveRoom() async {
  await _youmeRtcEngine.leaveRoom();
}

6. 处理其他事件

youme_rtc_engine 提供了许多事件回调,例如用户加入/离开房间、音视频状态变化等。你可以根据需要处理这些事件。

[@override](/user/override)
void initState() {
  super.initState();
  _youmeRtcEngine.onUserJoined = (String userId) {
    print("用户加入: $userId");
  };
  _youmeRtcEngine.onUserLeft = (String userId) {
    print("用户离开: $userId");
  };
  _youmeRtcEngine.onAudioStateChanged = (String userId, bool isMuted) {
    print("音频状态变化: $userId, $isMuted");
  };
  _youmeRtcEngine.onVideoStateChanged = (String userId, bool isMuted) {
    print("视频状态变化: $userId, $isMuted");
  };
}

7. 释放资源

在应用退出时,记得释放 youme_rtc_engine 的资源。

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