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

前提条件
步骤 1:集成 SDK

下载 SDK 离线包,然后导入到 Unity 工程中,如下图所示:

步骤 2:系统配置
Windows 平台

在 PlayerSetting -> Other Settings 下,设置 Scripting Runtime Version 为 Experimental (.Net 4.6 Equivalent)。

Android 平台

配置 Gradle

在 PlayerSetting -> Publishing Settings 下,勾选 CustomGradleTemplate, 如果没有 CustomGradleTemplate, 则勾选 CustomLauncherGradle Template。

之后会在 Assets -> Plugins -> Android 目录下生成 Template.gradle 文件,然后在里面添加代码:

implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:support-v4:28.0.0'
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.61'

packagingOptions
{
   pickFirst "lib/*/libc++_shared.so"
}
kotlin

iOS 平台

配置 XCodePostProcess

在 Assets 文件下新建 Editor 目录,在 Editor 目录下新建 XCodePostProcess.cs 文件。

在 XCodePostProcess.cs 里面添加生成 XCode 工程的配置代码:

using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using UnityEditor.iOS.Xcode.Extensions;
using System.IO;

public static class XCodePostProcess
{
    private static void AddEmbedFramework(PBXProject project, string targetGuid, string frameworkName) 
    {
#if !UNITY_2019_3_OR_NEWER
        const string defaultLocationInProj = "Frameworks/RTCVideo/Plugins/iOS";
        string framework = Path.Combine(defaultLocationInProj, frameworkName);
        string fileGuid = project.AddFile(framework, "Frameworks/" + framework, PBXSourceTree.Sdk);
        PBXProjectExtensions.AddFileToEmbedFrameworks(project, targetGuid, fileGuid);
#endif
    }

    [PostProcessBuild(999)]
    public static void OnPostProcessBuild(BuildTarget buildTarget, string path)
    {
        if(buildTarget == BuildTarget.iOS)
        {
            string projectPath = path + "/Unity-iPhone.xcodeproj/project.pbxproj";

            PBXProject pbxProject = new PBXProject();
            pbxProject.ReadFromFile(projectPath);
#if !UNITY_2019_3_OR_NEWER
            string mainTarget = PBXProject.GetUnityTargetName();
#else
            string mainTarget = pbxProject.GetUnityMainTargetGuid();
#endif
            string targetGuid = pbxProject.TargetGuidByName(mainTarget);
            pbxProject.SetBuildProperty(targetGuid, "ENABLE_BITCODE", "NO");
            pbxProject.SetBuildProperty(targetGuid, "CODE_SIGN_STYLE", "Manual");
            pbxProject.SetBuildProperty(targetGuid, "PRODUCT_NAME", "VideoSDKDemo");
        
            AddEmbedFramework(pbxProject, targetGuid, "VolcEngineRTC.framework");
            AddEmbedFramework(pbxProject, targetGuid, "VolcEngineRTCScreenCapturer.framework");
            AddEmbedFramework(pbxProject, targetGuid, "ByteRTCCWrapper.framework");
            pbxProject.SetBuildProperty(targetGuid, "LD_RUNPATH_SEARCH_PATHS", "$(inherited) @executable_path/Frameworks");
            pbxProject.WriteToFile (projectPath);

            // 修改plist
            string plistPath = path + "/Info.plist";
            PlistDocument plist = new PlistDocument();
            plist.ReadFromString(File.ReadAllText(plistPath));
            PlistElementDict rootDict = plist.root;
            rootDict.SetString("NSMicrophoneUsageDescription", "App需要您的同意,才能访问麦克风");
            rootDict.SetString("NSCameraUsageDescription", "App需要您的同意,才能访问相机");
            rootDict.SetString("CFBundleIdentifier", "${PRODUCT_BUNDLE_IDENTIFIER}");
            PlistElementArray backgroundModesArray = rootDict.CreateArray("UIBackgroundModes");
            backgroundModesArray.AddString("audio");
            plist.WriteToFile(plistPath);
        }
    }
}
c#
步骤 3:实现音视频通话

alt

1. 创建引擎实例 CreateRTCVideo
public int CreateRTCVideo(RTCVideoEngineParams initParams)
 
  public struct RTCVideoEngineParams {
        /** {zh}
         * @brief 应用 ID。
         */
        public string AppID;
        /** {zh}
         * @brief 初始化参数。
         */
        public Dictionary<string, object> Params;
    };
c#
参数名类型说明
AppIDString每个应用的唯一标识符,由 RTC 控制台随机生成的。不同的 AppId 生成的实例在 RTC 中进行音视频通话完全独立,无法互通。
ParamsDictionary<string, object>用以覆盖默认参数的本引擎实例参数。JSON 字符串格式。
2. 设置视频编码参数
public int SetVideoEncoderConfig(VideoEncoderConfig maxSolution)
c#
参数名类型说明
maxSolutionVideoEncoderConfig期望发布的最大分辨率视频流参数。参看 VideoEncoderConfig。
3. 设置本地视频渲染视图 SetLocalVideoSink
void SetLocalVideoSink(StreamIndex index, VideoSinkPixelFormat requiredFormat)
c#
参数名类型说明
indexStreamIndex视频流属性, 参看 StreamIndex
requiredFormatVideoSinkPixelFormat视频编码格式 VideoSinkPixelFormat
4. 开始视频采集 StartVideoCapture
public void StartVideoCapture()
c#
5. 开始音频采集 StartAudioCapture
public void StartAudioCapture()
c#
6. 创建房间 CreateRTCRoom
IRTCVideoRoom  CreateRTCRoom(string  roomID)
c#
7. 加入房间 JoinRoom
int JoinRoom(string  token, UserInfo info, MultiRoomConfig roomConfig)
c#
参数名类型说明
tokenString动态密钥。用于对进房用户进行鉴权验证。 进入房间需要携带 Token。测试时可使用控制台生成临时 Token,正式上线需要使用密钥 SDK 在你的服务端生成并下发 Token。 使用不同 AppID 的 App 是不能互通的。 请务必保证生成 Token 使用的 AppID 和创建引擎时使用的 AppID 相同,否则会导致加入房间失败。
userInfoinfo用户信息。参看 UserInfo。
roomConfigMultiRoomConfig房间参数配置,设置房间模式以及是否自动发布或订阅流。具体配置模式参看 MultiRoomConfig。
8. 处理房间状态改变回调 OnRoomStateChangedEventHandler
void OnRoomStateChangedEventHandler(string  roomID,  string  userID,  int  state,  string  ExtraInfo)
c#
参数名类型说明
roomIdString房间 ID。
userIDString用户 ID。
stateint房间状态码。
• 0: 成功。
• !0: 失败,具体原因参看 ErrorCode 及 WarningCode。
ExtraInfoString额外信息,如 {"elapsed":1187,"join\_type":0}。 join_type 表示加入房间的类型,0 为首次进房,1 为重连进房。 elapsed 表示加入房间耗时,即本地用户从调用 JoinRoom 到加入房间成功所经历的时间间隔,单位为 ms。
9. 处理用户加入房间回调 OnUserJoinedEventHandler
void OnUserJoinedEventHandler(string  roomID, UserInfo userInfo,  int  elapsed)
c#
参数名类型说明
roomIdString房间 ID。
userInfoUserInfo用户信息。参看 UserInfo。
elapsedint保留字段。
10. 处理远端视频首帧解码的回调 OnFirstRemoteVideoFrameDecodedEventHandler
void OnFirstRemoteVideoFrameDecodedEventHandler(RemoteStreamKey key, VideoFrameInfo info)
c#
参数名类型说明
keyRemoteStreamKey远端流信息,参看 RemoteStreamKey
infoVideoFrameInfo视频帧信息,参看 VideoFrameInfo
11. 设置远端视图 SetRemoteVideoSink
void SetRemoteVideoSink(RemoteStreamKey streamKey, VideoSinkPixelFormat requiredFormat)
c#
参数名类型说明
streamKeyRemoteStreamKey远端流信息,用于指定需要渲染的视频流来源及属性,参看 RemoteStreamKey。
requiredFormatVideoSinkPixelFormat视频编码格式 VideoSinkPixelFormat
12. 处理用户离开房间回调 OnUserLeaveEventHandler
void OnUserLeaveEventHandler(string  roomID,  string  userID, UserOfflineReason reason)
c#
参数名类型说明
roomIdString房间 ID。
userIDString用户 ID。
reasonUserOfflineReason用户离开房间的原因,参看 UserOfflineReason。
13. 离开房间 LeaveRoom
void LeaveRoom()
c#
14. 销毁引擎实例 DestroyRTCVideo
void DestroyRTCVideo()
c#