You need to enable JavaScript to run this app.
导航

Flutter

最近更新时间2024.02.02 17:46:16

首次发布时间2022.08.26 14:51:09

集成 RTC SDK 后,你可以使用其中接口快速构建基础应用,实现基本实时音视频通话;你也能通过阅读代码,了解音视频通话的最佳实践。
关于完整的项目实现,参考 快速开始 demo

前提条件

  • Flutter 2.0.0+
  • Dart 2.12.0+
  • 获取 Appid
  • 如果目标平台为 Android:
    • Android Studio 3.5+
    • Android API Level 19+
    • arm64-v8a 真机、armeabi-v7a 真机
    • 使用 Java 作为开发语言
  • 如果目标平台为 iOS:
    • Xcode 12.5+
    • iOS 11.0+
    • arm64 真机
    • 使用 Objective-C 作为开发语言
    • 请确保您的项目已设置有效的开发者签名

集成 SDK

步骤1:(可选)创建项目

本步骤为如何创建一个新项目,如集成到已有项目,请跳过该步骤。

请参考 Create the App 创建一个 Flutter 项目。

步骤2: 添加依赖

方式一:远端依赖 (推荐)

在终端中进入项目根目录,运行如下命令安装依赖项:

flutter pub add volc_engine_rtc

这将在你项目的 pubspec.yaml 文件中添加这样的一行:

dependencies:
  volc_engine_rtc: ^3.44.1

方式二:本地依赖

  1. 将下载的 SDK 文件夹复制到你的项目文件夹下。

  2. 在 pubspec.yaml 文件中添加 volc_engine_rtc依赖项:

    environment:
      sdk: ">=2.12.0 <3.0.0"
    
    # 依赖项
    dependencies:
      flutter:
        sdk: flutter
       
      # 将 <SDK_PATH> 替换为项目下SDK的文件路径
      volc_engine_rtc:
        path: <SDK_PATH>
    

更新依赖项

选择以上任意一种方式添加依赖项后,当需要更新 SDK 版本时,在终端中进入项目根目录,运行如下命令更新依赖项:

flutter pub get

步骤3:配置项目属性

  1. 权限获取:

    在使用音视频功能前,请先在代码中申请音视频权限,本文采用 permission_handler 组件库为例:

    [Permission.camera, Permission.microphone].request()
    
  2. 目标平台项目配置

    1. iOS 平台

      打开 Info.plist 文件添加下列权限

      • Privacy - Microphone Usage Description ,并填入使用麦克风的原因(Value)

      • Privacy - Camera Usage Description ,并填入使用摄像头的原因(Value)

      打开 Podfile 文件添加如下代码

      # Uncomment this line to define a global platform for your project
      # platform :ios, '11.0'
      
      # CocoaPods analytics sends network stats synchronously affecting flutter build latency.
      ENV['COCOAPODS_DISABLE_STATS'] = 'true'
      
      source 'https://github.com/CocoaPods/Specs.git'
      ···
      source 'https://github.com/volcengine/volcengine-specs'
      ···
      

实现音视频通话

alt

实现流程

1. (可选)创建用户界面

根据场景需要,为你的项目创建音视频通话的用户界面。若已有用户界面,请跳过此步骤。

如果你想实现基本的音视频通话,我们建议你在项目中添加如下元素:

  • 房间ID

  • 用户 ID

  • 本地视频窗口

  • 远端视频窗口

  • 打开麦克风按钮

  • 打开摄像头按钮

  • 结束通话按钮

2. 引入头文件

在用到 SDK API 的文件中引入头文件。

//引入 byte_rtc_engine_SDK 头文件
import 'package:volc_engine_rtc/volc_engine_rtc.dart';

3. 创建引擎

首先你需要调用 RTCVideo.createRTCVideo 接口,创建一个引擎单例,以使用 RTC 提供的各种音视频能力。
如果当前进程中未创建引擎实例,那么你必须先使用此方法创建实例;
如果当前进程中已创建了引擎实例,再次调用此方法时,会返回已创建的实例。
你需要在该方法中传入以下参数:

参数名类型说明
contextRTCVideoContext引擎环境参数
static Future<RTCVideo?> createRTCVideo(RTCVideoContext context)

4. 设置视频编码参数

创建引擎实例后,你可以调用RTCVideo.setMaxVideoEncoderConfig设置视频编码参数修改发布的视频流属性。
你需要在该方法中传入以下参数:

参数名类型说明
maxSolutionVideoEncoderConfig视频发布端设置期望发布的最大分辨率视频流参数,包括分辨率、帧率、码率、网络不佳时的回退策略等。
Future<int?> setMaxVideoEncoderConfig(VideoEncoderConfig maxSolution)

5. 设置本地视图

加入房间前,你需要设置本地视图以在通话中看到本地图像,首先创建RTCViewContext实例:

参数名类型说明
uidString本地用户 Id
streamTypeStreamIndex流类型,默认为主视频流
RTCViewContext.localContext(
    {required this.uid, this.streamType = StreamIndex.main})

再由创建的RTCViewContext实例构建RTCSurfaceView视频渲染视图:

参数名类型说明
contextRTCViewContext渲染视图环境参数
renderModeVideoRenderMode视频渲染模式
backgroundColorint用于填充画布空白部分的背景颜色,颜色格式为BGR。取值范围是 `[0x0000000, 0xFFFFFFFF]`。默认值是 `0x00000000`。其中,透明度设置无效。
zOrderOnTopbool仅安卓使用,参考Android官方接口文档
zOrderMediaOverlaybool仅安卓使用,参考Android官方接口文档
onPlatformViewCreatedPlatformViewCreatedCallback`PlatformView` 被创建时,收到此回调
gestureRecognizersSet<Factory>?应转发哪些手势给 `PlatformView`
const RTCSurfaceView({
  Key? key,
  required this.context,
  this.renderMode = VideoRenderMode.hidden,
  this.backgroundColor = 0,
  this.zOrderOnTop = false,
  this.zOrderMediaOverlay = false,
  this.onPlatformViewCreated,
  this.gestureRecognizers,
})

6. 开始视频采集

创建引擎实例后,你需要调用RTCVideo.startVideoCapture开启视频采集,以在通话中使用视频功能。

Future<void> startVideoCapture()

7. 开始音频采集

创建引擎实例后,你需要调用RTCVideo.startAudioCapture开启音频采集,以在通话中使用音频功能。

Future<void> startAudioCapture()

8. 创建房间

完成初始化后,你就可以调用RTCVideo``.createRTCRoom创建房间。

参数名类型说明
roomIdString房间 Id
Future<RTCRoom?> createRTCRoom(String roomId)

9. 设置房间事件回调处理

成功创建房间后,你就可以调用RTCRoom``.setRTCRoomEventHandler设置房间事件回调处理。

参数名类型说明
eventHandlerRTCRoomEventHandler房间事件回调处理器
void setRTCRoomEventHandler(RTCRoomEventHandler eventHandler)

10. 加入房间

完成房间初始化后,你就可以调用RTCRoom``.joinRoom加入房间。
你需要在该方法中传入以下参数:

参数名类型说明

token

String

动态密钥,用于对登录用户进行鉴权验证。
进入房间需要携带 Token。测试时可使用控制台生成临时 Token ,正式上线需要使用密钥 SDK 在你的服务端生成并下发 Token 。
使用不同 AppID 的 App 是不能互通的。
请务必保证生成 Token 使用的 AppID 和创建引擎时使用的 AppID 相同,否则会导致加入房间失败。

userInfoUserInfo用户信息。
roomConfigRoomConfig房间信息配置。
Future<int?> joinRoom(
    {required String token,
    required UserInfo userInfo,
    required RoomConfig roomConfig})

11. 处理加入房间结果回调

加入房间后,你需要在 RTCRoomEventHandler.onRoomStateChanged 中处理首次加入房间/重连加入房间的事件。
回调参数说明:

参数名类型说明
roomIdString房间 ID。
uidString用户 ID。

state

int

用户加入房间回调的状态码。
• 0: 加入房间成功;
• 非 0: 加入房间失败。具体原因参看 ErrorCodeWarningCode

extraInfo

String

加入房间的类型。
• 0: 首次加入房间。用户手动调用 joinRoom,收到加入成功。
• 1: 重新加入房间。用户网络较差,失去与服务器的连接,进行重连时收到加入成功。

typedef OnRoomStateChangedType = void Function(
    String roomId, String uid, int state, String extraInfo);

12. 处理远端用户加入房间的回调

加入房间后,你需要在 RTCRoomEventHandler.onUserJoined 中处理远端用户加入房间的事件。
回调参数说明:

参数名类型说明
userInfoUserInfo用户信息。
elapsedint保留字段,无意义
typedef OnUserJoinedType = void Function(UserInfo userInfo, int elapsed);

13. 处理远端视频数据渲染的回调

加入房间后,你需要在 RTCVideoEventHandler.onFirstRemoteVideoFrameDecoded 中处理第一帧远端视频流在视图上渲染成功后的事件。
回调参数说明:

参数名类型说明
streamKeyRemoteStreamKey远端流信息。
videoFrameInfoVideoFrameInfo视频帧信息。
OnFirstRemoteVideoFrameRenderedType = void Function(RemoteStreamKey streamKey,VideoFrameInfo videoFrameInfo)

14. 设置远端视图

在确认收到远端用户的第一帧视频渲染回调后,你需要设置远端视图以在通话中查看远端图像,将接口创建的RTCViewContext实例用于构建视频渲染视图RTCSurfaceView
你需要在该方法中传入以下参数:

参数名类型说明
roomIdString房间ID
uidString视频来源的远端用户 ID
streamTypeStreamIndex流类型,默认为主视频流
RTCViewContext.remoteContext(
    {required this.roomId,
    required this.uid,
    this.streamType = StreamIndex.main})

15. 处理远端用户离开房间的回调

加入房间后,你需要在 RTCRoomEventHandler.onUserLeave 的此回调中处理远端用户离开房间的事件。
回调参数说明:

参数名类型说明
uidString离开房间,或切至隐身的远端用户 ID 。
reasonint用户离开房间的原因。
OnUserLeaveType = void Function(String uid,int reason)

16. 离开房间

在结束通话等场景下,你需要调用 RTCRoom.leaveRoom 离开房间,结束通话过程,释放所有通话相关的资源。

Future<int?> leaveRoom()

17. 销毁房间

在 RTC 房间实例相关的业务场景全部结束后,你可以调用RTCRoom.destroy 销毁房间,并释放所有相关资源。

Future<void> destroy()

18. 销毁引擎

在 RTC 引擎实例相关的业务场景全部结束后,你可以调用RTCVideo``.``destroy销毁由引擎创建的单例,并释放所有相关资源。

Future<void> destroy()

至此,我们实现了基本的音视频通话。