集成 RTC SDK 后,你可以使用其中接口快速构建基础应用,实现基本实时音视频通话;你也能通过阅读代码,了解音视频通话的最佳实践。 如果你想了解完整的项目实现,参看 Demo 工程文件。
Unity Editor 2017+
以下示例基于 Unity 2017 版本。不同的 Unity 版本上,操作方式可能有细微差别。如果你使用的 Unity 版本和示例中不一致,并发生了问题,请联系技术支持。
Android Studio 3.5+
XCode 14.1 +
获取 Appid
获取 RTC SDK 文件
下载 SDK 离线包,然后导入到 Unity 工程中,如下图所示:
进入 PlayerSetting -> Other Settings。
配置 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" }
配置 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); } } }
public int CreateRTCVideo(RTCVideoEngineParams initParams) public struct RTCVideoEngineParams { /** {zh} * @brief 应用 ID。 */ public string AppID; /** {zh} * @brief 初始化参数。 */ public Dictionary<string, object> Params; };
参数名 | 类型 | 说明 |
---|---|---|
AppID | String | 每个应用的唯一标识符,由 RTC 控制台随机生成的。不同的 AppId 生成的实例在 RTC 中进行音视频通话完全独立,无法互通。 |
Params | Dictionary<string, object> | 用以覆盖默认参数的本引擎实例参数。JSON 字符串格式。 |
public int SetVideoEncoderConfig(VideoEncoderConfig maxSolution)
参数名 | 类型 | 说明 |
---|---|---|
maxSolution | VideoEncoderConfig | 期望发布的最大分辨率视频流参数。参看 VideoEncoderConfig。 |
void SetLocalVideoSink(StreamIndex index, VideoSinkPixelFormat requiredFormat)
参数名 | 类型 | 说明 |
---|---|---|
index | StreamIndex | 视频流属性, 参看 StreamIndex |
requiredFormat | VideoSinkPixelFormat | 视频编码格式 VideoSinkPixelFormat |
public void StartVideoCapture()
public void StartAudioCapture()
IRTCVideoRoom CreateRTCRoom(string roomID)
int JoinRoom(string token, UserInfo info, MultiRoomConfig roomConfig)
参数名 | 类型 | 说明 |
---|---|---|
token | String | 动态密钥。用于对进房用户进行鉴权验证。 进入房间需要携带 Token。测试时可使用控制台生成临时 Token,正式上线需要使用密钥 SDK 在你的服务端生成并下发 Token。 使用不同 AppID 的 App 是不能互通的。 请务必保证生成 Token 使用的 AppID 和创建引擎时使用的 AppID 相同,否则会导致加入房间失败。 |
userInfo | info | 用户信息。参看 UserInfo。 |
roomConfig | MultiRoomConfig | 房间参数配置,设置房间模式以及是否自动发布或订阅流。具体配置模式参看 MultiRoomConfig。 |
void OnRoomStateChangedEventHandler(string roomID, string userID, int state, string ExtraInfo)
参数名 | 类型 | 说明 |
---|---|---|
roomId | String | 房间 ID。 |
userID | String | 用户 ID。 |
state | int | 房间状态码。 • 0: 成功。 • !0: 失败,具体原因参看 ErrorCode 及 WarningCode。 |
ExtraInfo | String | 额外信息,如 {"elapsed":1187,"join\_type":0} 。 join_type 表示加入房间的类型,0 为首次进房,1 为重连进房。 elapsed 表示加入房间耗时,即本地用户从调用 JoinRoom 到加入房间成功所经历的时间间隔,单位为 ms。 |
void OnUserJoinedEventHandler(string roomID, UserInfo userInfo, int elapsed)
参数名 | 类型 | 说明 |
---|---|---|
roomId | String | 房间 ID。 |
userInfo | UserInfo | 用户信息。参看 UserInfo。 |
elapsed | int | 保留字段。 |
void OnFirstRemoteVideoFrameDecodedEventHandler(RemoteStreamKey key, VideoFrameInfo info)
参数名 | 类型 | 说明 |
---|---|---|
key | RemoteStreamKey | 远端流信息,参看 RemoteStreamKey |
info | VideoFrameInfo | 视频帧信息,参看 VideoFrameInfo |
void SetRemoteVideoSink(RemoteStreamKey streamKey, VideoSinkPixelFormat requiredFormat)
参数名 | 类型 | 说明 |
---|---|---|
streamKey | RemoteStreamKey | 远端流信息,用于指定需要渲染的视频流来源及属性,参看 RemoteStreamKey。 |
requiredFormat | VideoSinkPixelFormat | 视频编码格式 VideoSinkPixelFormat |
void OnUserLeaveEventHandler(string roomID, string userID, UserOfflineReason reason)
参数名 | 类型 | 说明 |
---|---|---|
roomId | String | 房间 ID。 |
userID | String | 用户 ID。 |
reason | UserOfflineReason | 用户离开房间的原因,参看 UserOfflineReason。 |
void LeaveRoom()
void DestroyRTCVideo()