集成

本文将介绍如何快速完成 Flutter RTC Engine 的接入,实现一个基本的音视频通话。

环境准备

Flutter 2.0 及以上版本。
Android 端开发:
Android Studio 3.5及以上版本。
App 要求 Android 4.1及以上版本设备。
请确保您的项目支持 CMake 3.13 及以上版本
iOS 端开发:
Xcode 11.0及以上版本。
osx 系统版本要求 10.11 及以上版本。
请确保您的项目已设置有效的开发者签名。

步骤1. 导入SDK

通过以下命令安装组件 tencent_rtc_sdk
flutter pub add tencent_rtc_sdk

步骤2. 配置项目

1. 开通摄像头麦克风的权限,即可开启语音通话功能。
iOS
Android
1. 需要在 Info.plist 的第一级<dict>目录下加入对相机和麦克风的权限申请:
<key>NSCameraUsageDescription</key>
<string>授权摄像头权限才能正常视频通话</string>
<key>NSMicrophoneUsageDescription</key>
<string>授权麦克风权限才能正常语音通话</string>
2. 添加字段 io.flutter.embedded_views_preview,并设定值为 YES。
1. 打开/android/app/src/main/AndroidManifest.xml文件。
2. 在其中添加如下权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera.autofocus" />
3. 如果您需要编译运行在 Android 平台,您还需要进行如下配置:
首先,需要在工程的 android/app/build.gradle 文件中对应位置添加:
android {
.....
packagingOptions {
pickFirst 'lib/**/libliteavsdk.so'
}
buildTypes {
release {
......
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
在工程的 android/app 目录下创建 proguard-rules.pro 文件,并在 proguard-rules.pro 文件中添加如下代码:
-keep class com.tencent.** { *; }
说明:
如果您在接入过程中遇到问题,请参见 常见问题

步骤3. 创建 TRTC 实例

1. 声明成员变量
import 'package:tencent_rtc_sdk/trtc_cloud.dart';
import 'package:tencent_rtc_sdk/trtc_cloud_def.dart';
import 'package:tencent_rtc_sdk/trtc_cloud_listener.dart';
late TRTCCloud trtcCloud;
2. 调用初始化接口创建 TRTC 实例并设置事件回调。
// 创建 TRTC 实例
trtcCloud = (await TRTCCloud.sharedInstance())!;

// 创建 TRTCCloudListener 实例
TRTCCloudListener listener = TRTCCloudListener(
// 根据需要实现对应的回调
onError: (errCode, errMsg) {
// TODO
}
);

// 注册监听器,将 listener 绑定到 trtcCloud 实例
trtcCloud.registerListener(listener);

步骤4. 进入房间

1. 如果您在 Android 设备上运行程序,需要提前请求 CAMERAMICROPHONE 权限。
if (!(await Permission.camera.request().isGranted) || !(await Permission.microphone.request().isGranted)) { print('You need to obtain audio and video permission to enter'); return; }
说明:
此处权限申请使用了第三方仓库 permission_handler
2. Tencent RTC 控制台 中单击 Create Application,在 Application Overview 中获取 SDKAppID 。



3. UserSig Tools 中下来选择 SDKAppID ,并输入您自己的用户名(UserID),单击Generate即可获取您自己的 UserSig 。



4. 在设置进房参数 TRTCParams 后,调用 enterRoom 接口函数即可进入房间。
主播角色
trtcCloud.enterRoom(
TRTCParams(
sdkAppId: sdkAppId, // 请替换为您的 SDKAppID
userId: "userId", // 请替换为您的 userid
userSig: '', // 请替换为您的 userSig
role: TRTCRoleType.anchor,
roomId: 123123, // 请替换为您的 roomId
),
TRTCAppScene.live
);
观众角色
trtcCloud.enterRoom(
TRTCParams(
sdkAppId: sdkAppId, // 请替换为您的 SDKAppID
userId: "userId", // 请替换为您的 userid
userSig: '', // 请替换为您的 userSig
role: TRTCRoleType.audience,
roomId: 123123, // 请替换为您的 roomId
),
TRTCAppScene.live
);
注意:
如果以观众角色进入房间,sdkAppIdroomId 需要与主播端相同,而 userIduserSig 需要替换为自己的值。

步骤5. 打开摄像头

1. 在页面的 build 方法中对应位置添加 TRTCCloudVideoView :
import 'package:tencent_rtc_sdk/trtc_cloud_video_view.dart';
TRTCCloudVideoView(
key: valueKey,
onViewCreated: (viewId) {
localViewId = viewId;
// TODO
},
),
说明:
viewId 为视频渲染控件 TRTCCloudVideoView 的唯一标识符。您可以以您想要的方式存储该标识符。此处使用 localViewId 来存储,用以后续渲染本地采集的视频流。
2. 在调用接口 startLocalPreview 打开摄像头预览之前,您可以通过通过调用接口 setLocalRenderParams 来设置本地预览的渲染参数。
// 设置本地预览渲染参数
trtcCloud.setLocalRenderParams(
TRTCRenderParams(
fillMode: TRTCVideoFillMode.fill,
mirrorType: TRTCVideoMirrorType.auto,
rotation: TRTCVideoRotation.rotation0,
),
);

// 对前置摄像头采集内容进行本地预览
trtcCloud.startLocalPreview(true, localViewId);

// 对后置摄像头采集内容进行本地预览
trtcCloud.startLocalPreview(false, localViewId);
调用stopLocalPreview关闭摄像头预览并停止推送本地视频信息。
trtcCloud.stopLocalPreview();
3. 您可以通过调用接口 TXDeviceManager 来完成“切换前后摄像头”“设置对焦模式”、“闪光灯”等设备扩展功能的使用。
import 'package:tencent_rtc_sdk/tx_device_manager.dart';
// 获取设备管理器实例
TXDeviceManager manager = trtcCloud.getDeviceManager();

// 判断是否为前置摄像头
if (manager.isFrontCamera()) {
// 切换为后置摄像头
manager.switchCamera(false);
} else {
// 切换为前置摄像头
manager.switchCamera(true);
}
// 获取设备管理器实例
TXDeviceManager manager = trtcCloud.getDeviceManager();

// 设备是否支持自动识别人脸位置
if (manager.isAutoFocusEnabled()) {
// 开启自动对焦功能
manager.enableCameraAutoFocus(true);
} else {
// 关闭自动对焦功能
manager.enableCameraAutoFocus(false);
}
// 获取设备管理器实例
TXDeviceManager manager = trtcCloud.getDeviceManager();

// 切换后置摄像头时可开启闪光灯
manager.enableCameraTorch(true);

// 关闭闪光灯
manager.enableCameraTorch(false);

步骤6. 打开麦克风

您可以调用 startLocalAudio 来开启麦克风采集,该接口需要您通过 quality 参数确定采集模式,建议根据您的需求选择以下其中一个适合您项目的模式
// 开启麦克风采集,设置当前场景为:语音模式
// 具有高的噪声抑制能力,有强有弱的网络阻力
trtcCloud.startLocalAudio(TRTCAudioQuality.speech);
// 开启麦克风采集,设置当前场景为:音乐模式
// 为获得高保真度,低音质损失,建议配合专业声卡使用
trtcCloud.startLocalAudio(TRTCAudioQuality.music);
调用stopLocalAudio关闭麦克风采集并停止推送本地音频信息。
trtcCloud.stopLocalAudio();

步骤7. 播放/停止视频流

1. 在进入房间之前对 onUserVideoAvailable 进行监听,当您收到onUserVideoAvailable(userId, true)通知时,表示该路画面已经有可播放的视频帧到达。
说明:
此处假设可播放视频的用户为 denny,预计要将用户 denny 的视频流渲染到唯一标识符为 remoteViewIdTRTCCloudVideoView 控件中。
2. 您可以通过调用接口 startRemoteView 来播放远端用户的视频画面。
// 播放远端用户 denny 的主流视频画面
trtcCloud.startRemoteView("denny", TRTCVideoStreamType.big, remoteViewId);
之后,您通过调用接口 stopRemoteView 停止某个远端用户的视频,也可以通过接口 stopAllRemoteView 停止播放所有远端用户的视频。
// 停止播放远端用户 denny 的主流视频画面
trtcCloud.stopRemoteView("denny", TRTCVideoStreamType.big);
// 停止播放所有远端用户的视频画面
trtcCloud.stopAllRemoteView();

步骤8. 播放/停止音频流

默认情况下,SDK 将自动播放远程音频,因此您不需要调用任何 API 来手动播放它。
但当您不喜欢自动播放音频时,可以调用 muteRemoteAudio/muteAllRemoteAudio选择播放或停止远端声音。
// 仅静音远端用户 denny
trtcCloud.muteRemoteAudio("denny", true);

// 静音所有远端用户
trtcCloud.muteAllRemoteAudio(true);
// 取消静音远端用户 denny
trtcCloud.muteRemoteAudio("denny", true);

// 取消静音所有远端用户
trtcCloud.muteAllRemoteAudio(true);

步骤9. 退出房间

调用 exitRoom 退出当前的房间:
trtcCloud.exitRoom();
TRTC SDK 会在退房结束后通过 onExitRoom 回调事件通知您。
TRTCCloudListener listener = TRTCCloudListener(
onExitRoom: (reason) {
// TODO
}
);

trtcCloud.registerListener(listener);

常见问题

您可以在 API 参考 查看所有函数列表及其描述。
如果您的接入和使用中遇到问题,请参见 常见问题