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

Unity

最近更新时间2024.04.22 17:52:22

首次发布时间2023.09.08 17:15:19

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

前提条件

  • Unity Editor 2017+

    以下示例基于 Unity 2017 版本。不同的 Unity 版本上,操作方式可能有细微差别。如果你使用的 Unity 版本和示例中不一致,并发生了问题,请联系技术支持。

  • Android Studio 3.5+

  • XCode 14.1 +

  • 获取 Appid

  • 获取 RTC SDK 文件

步骤 1:集成 SDK

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

步骤 2:系统配置

Windows 平台

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

alt

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"

    pickFirst "lib/*/libbmf_hydra.so"
    pickFirst "lib/*/libbmf_mods.so"
    pickFirst "lib/*/libbytenn.so"
    pickFirst "lib/*/libbytertc_ffmpeg_audio_extension.so"
    pickFirst "lib/*/libbytertc_nico_extension.so"
    pickFirst "lib/*/libbytertc_videodenoise_extension.so"
    pickFirst "lib/*/libbytertc_videosharpen_extension.so"
    pickFirst "lib/*/libbytertc_videosr_extension.so"
    pickFirst "lib/*/libh265enc.so"

}

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);
        }
    }
}

步骤 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;
    };
参数名类型说明
AppIDString每个应用的唯一标识符,由 RTC 控制台随机生成的。不同的 AppId 生成的实例在 RTC 中进行音视频通话完全独立,无法互通。
ParamsDictionary<string, object>用以覆盖默认参数的本引擎实例参数。JSON 字符串格式。

2. 设置视频编码参数

public int SetVideoEncoderConfig(VideoEncoderConfig maxSolution)
参数名类型说明
maxSolutionVideoEncoderConfig期望发布的最大分辨率视频流参数。参看 VideoEncoderConfig

3. 设置本地视频渲染视图 SetLocalVideoSink

void SetLocalVideoSink(StreamIndex index, VideoSinkPixelFormat requiredFormat)
参数名类型说明
indexStreamIndex视频流属性, 参看 StreamIndex
requiredFormatVideoSinkPixelFormat视频编码格式 VideoSinkPixelFormat

4. 开始视频采集 StartVideoCapture

public void StartVideoCapture()

5. 开始音频采集 StartAudioCapture

public void StartAudioCapture()

6. 创建房间 CreateRTCRoom

IRTCVideoRoom  CreateRTCRoom(string  roomID)

7. 加入房间 JoinRoom

int JoinRoom(string  token, UserInfo info, MultiRoomConfig roomConfig)
参数名类型说明
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)
参数名类型说明
roomIdString房间 ID。
userIDString用户 ID。
stateint房间状态码。
• 0: 成功。
• !0: 失败,具体原因参看 ErrorCodeWarningCode
ExtraInfoString额外信息,如 {"elapsed":1187,"join\_type":0}。 join_type 表示加入房间的类型,0 为首次进房,1 为重连进房。 elapsed 表示加入房间耗时,即本地用户从调用 JoinRoom 到加入房间成功所经历的时间间隔,单位为 ms。

9. 处理用户加入房间回调 OnUserJoinedEventHandler

void OnUserJoinedEventHandler(string  roomID, UserInfo userInfo,  int  elapsed)
参数名类型说明
roomIdString房间 ID。
userInfoUserInfo用户信息。参看 UserInfo
elapsedint保留字段。

10. 处理远端视频首帧解码的回调 OnFirstRemoteVideoFrameDecodedEventHandler

void OnFirstRemoteVideoFrameDecodedEventHandler(RemoteStreamKey key, VideoFrameInfo info)
参数名类型说明
keyRemoteStreamKey远端流信息,参看 RemoteStreamKey
infoVideoFrameInfo视频帧信息,参看 VideoFrameInfo

11. 设置远端视图 SetRemoteVideoSink

void SetRemoteVideoSink(RemoteStreamKey streamKey, VideoSinkPixelFormat requiredFormat)
参数名类型说明
streamKeyRemoteStreamKey远端流信息,用于指定需要渲染的视频流来源及属性,参看 RemoteStreamKey
requiredFormatVideoSinkPixelFormat视频编码格式 VideoSinkPixelFormat

12. 处理用户离开房间回调 OnUserLeaveEventHandler

void OnUserLeaveEventHandler(string  roomID,  string  userID, UserOfflineReason reason)
参数名类型说明
roomIdString房间 ID。
userIDString用户 ID。
reasonUserOfflineReason用户离开房间的原因,参看 UserOfflineReason

13. 离开房间 LeaveRoom

void LeaveRoom()

14. 销毁引擎实例 DestroyRTCVideo

void DestroyRTCVideo()