.app)` 文件中添加如下代码,将声网 RTC SDK 集成到你的 Android 项目中:
+
+ ```java
+ ...
+ dependencies {
+ ...
+ // x.y.z,请填写具体的 SDK 版本号,如:4.0.0 或 4.1.0-1。
+ // 通过互动直播产品发版说明获取最新版本号。
+ implementation 'io.agora.rtc:full-sdk:x.y.z'
+ }
+ ```
+
+3. 将字节火山美颜 SDK 集成到你的项目中。请联系字节技术支持获取美颜 SDK、美颜资源、证书等文件。下载并解压文件,然后添加到美颜项目对应的文件路径下:
+
+ | 文件 | 项目路径 |
+ |-------------------------------------------------------------------------|----------------------------------|
+ | Android/models | assets/beauty_sensetime |
+ | Android/smaple/SenseMeEffects/app/src/main/assets/sticker_face_shape | assets/beauty_sensetime |
+ | Android/smaple/SenseMeEffects/app/src/main/assets/style_lightly | assets/beauty_sensetime |
+ | Android/smaple/SenseMeEffects/app/libs/SenseArSourceManager-release.aar | libs |
+ | Android/smaple/SenseMeEffects/app/libs/HardwareBuffer-release.aar | libs |
+ | Android/aar/STMobileJNI-release.aar | libs |
+ | SenseME.lic | assets/beauty_sensetime/license |
+
+4. 将声网场景化 API 集成到你的项目中。添加 [Android/lib_bytedance/src/main/java/io/agora/beautyapi/bytedance](https://github.com/AgoraIO-Community/BeautyAPI/tree/main/Android/lib_bytedance/src/main/java/io/agora/beautyapi/bytedance) 目录下的文件到项目中,具体文件如下:
+ - `utils` 文件夹
+ - `ByteDanceBeautyAPI.kt` 文件
+ - `ByteDanceBeautyAPIImpl.kt` 文件
+
+ 为方便后续代码升级,请不要修改你添加的这些文件的名称。
+
+5. 添加网络及设备权限。
+
+ 在 `/app/Manifests/AndroidManifest.xml` 文件中,在 `` 后面添加如下权限:
+
+ ```xml
+
+
+
+
+
+
+
+
+
+
+
+
+ ```
+
+5. 在 `/Gradle Scripts/proguard-rules.pro` 文件中添加如下行,以防止声网 SDK 的代码被混淆:
+
+ ```java
+ -keep class io.agora.**{*;}
+ -dontwarn javax.**
+ -dontwarn com.google.devtools.build.android.**
+ ```
+
+## 实现美颜
+
+如下[时序图](#api-时序图)展示如何在直播间内实现美颜功能。声网 RTC SDK 承担实时音视频的业务,字节火山美颜 SDK 提供美颜功能,声网 Beauty API 封装了两个 SDK 中的 API 调用逻辑以简化你需要实现的代码逻辑。通过 Beauty API,你可以实现基础美颜功能,但是如果你需要更丰富的美颜效果,例如贴纸、美妆风格,你可以直接调用美颜 SDK 中的 API。
+
+### 1. 初始化 RtcEngine
+
+调用声网 RTC SDK 中的 `create` 创建并初始化 `RtcEngine` 对象。
+
+```kotlin
+// 初始化声网 RtcEngine
+private val mRtcEngine by lazy {
+ RtcEngine.create(RtcEngineConfig().apply {
+ mContext = applicationContext
+ // 传入你从控制台获取的声网项目的 APP ID
+ mAppId = BuildConfig.AGORA_APP_ID
+ mEventHandler = object : IRtcEngineEventHandler() {}
+ }).apply {
+ // 开启声网 clear_vision 视频插件
+ enableExtension("agora_video_filters_clear_vision", "clear_vision", true)
+ }
+}
+```
+
+### 2. 初始化 RenderManager
+
+复制美颜证书、美颜资源到 `sdcard` 存储中。
+
+```kotlin
+// 初始化美颜 SDK
+fun initBeautySDK(context: Context){
+ val storagePath = context.getExternalFilesDir("")?.absolutePath ?: return
+ val assetsPath = "beauty_bytedance"
+
+ workerThread.execute {
+ // copy license
+ licensePath = "$storagePath/beauty_bytedance/LicenseBag.bundle/$LICENSE_NAME"
+ FileUtils.copyAssets(context, "$assetsPath/LicenseBag.bundle/$LICENSE_NAME", licensePath)
+
+ // copy models
+ modelsPath = "$storagePath/beauty_bytedance/ModelResource.bundle"
+ FileUtils.copyAssets(context, "$assetsPath/ModelResource.bundle", modelsPath)
+
+ // copy beauty node
+ beautyNodePath = "$storagePath/beauty_bytedance/ComposeMakeup.bundle/ComposeMakeup/beauty_Android_lite"
+ FileUtils.copyAssets(context, "$assetsPath/ComposeMakeup.bundle/ComposeMakeup/beauty_Android_lite", beautyNodePath)
+
+ // copy beauty 4items node
+ beauty4ItemsNodePath = "$storagePath/beauty_bytedance/ComposeMakeup.bundle/ComposeMakeup/beauty_4Items"
+ FileUtils.copyAssets(context, "$assetsPath/ComposeMakeup.bundle/ComposeMakeup/beauty_4Items", beauty4ItemsNodePath)
+
+ // copy resharp node
+ reSharpNodePath = "$storagePath/beauty_bytedance/ComposeMakeup.bundle/ComposeMakeup/reshape_lite"
+ FileUtils.copyAssets(context, "$assetsPath/ComposeMakeup.bundle/ComposeMakeup/reshape_lite", reSharpNodePath)
+
+ // copy makeup node
+ makeupTianmeiNodePath = "$storagePath/beauty_bytedance/ComposeMakeup.bundle/ComposeMakeup/style_makeup/tianmei"
+ FileUtils.copyAssets(context, "$assetsPath/ComposeMakeup.bundle/ComposeMakeup/style_makeup/tianmei", makeupTianmeiNodePath)
+
+ // copy stickers
+ stickerPath = "$storagePath/beauty_bytedance/StickerResource.bundle/stickers"
+ FileUtils.copyAssets(context, "$assetsPath/StickerResource.bundle/stickers", stickerPath)
+ }
+}
+```
+
+在 GL 线程中通过美颜 SDK 的 initEffect 方法初始化 `RenderManager` 实例。
+
+```kotlin
+// GL 线程中
+// 初始化美颜 SDK 中的 RenderManager 实例
+fun initEffect(context: Context){
+ val ret = renderManager.init(
+ context,
+ modelsPath, licensePath, false, false, 0
+ )
+ if(!checkResult("RenderManager init ", ret)){
+ return
+ }
+ renderManager.useBuiltinSensor(true)
+ renderManager.set3Buffer(false)
+ renderManager.appendComposerNodes(arrayOf(beautyNodePath, beauty4ItemsNodePath, reSharpNodePath))
+ renderManager.loadResourceWithTimeout(-1)
+}
+```
+
+
+### 3. 初始化 Beauty API
+
+调用 `createByteDanceBeautyAPI` 创建 Beauty API 对象。Beauty API 对象是基于 `RenderManager` 对象封装。
+
+```kotlin
+// 创建 Beauty API 对象
+private val mByteDanceApi by lazy {
+ createByteDanceBeautyAPI()
+}
+```
+
+调用 `initialize` 初始化 Beauty API 对象。你需要在 `config` 参数中传入如下字段:
+
+- `applicationContext`:传入 Android Context(上下文)。
+- `mRtcEngine`:传入之前初始化的 `RtcEngine` 对象。
+- `renderManager`:传入之前初始化的 `RenderManager` 对象。
+- `captureMode`:视频的采集模式:
+ - 如果你使用声网模块采集视频,请传入 `CaptureMode.Agora`。
+ - 如果自定义采集视频,请传入 `CaptureMode.Custom`。
+- `statsEnable`:是否开启美颜统计数据回调。`true` 代表开启,`false` 代表不开启。开启后,会有周期性的 `onBeautyStats` 回调事件。
+- `cameraConfig`:设置视频镜像模式。如果在初始化 Beauty API 后你想修改镜像模式,可以调用 Beauty API 的 `updateCameraConfig`。
+- `eventCallback`:你希望监听的回调事件。
+
+```kotlin
+// 初始化 Beauty API 对象
+mByteDanceApi.initialize(
+ Config(
+ // Android Context(上下文)
+ applicationContext,
+ // RtcEngine
+ mRtcEngine,
+ // 美颜特效管理器
+ renderManager,
+ // 设置视频采集模式
+ // CaptureMode.Agora 意味着使用声网模块采集视频
+ // CaptureMode.Custom 意味着使用开发者自定义采集视频
+ captureMode = if (isCustomCaptureMode) CaptureMode.Custom else
+ CaptureMode.Agora,
+ // 是否开启美颜统计数据
+ // 开启后,会有周期性的 onBeautyStats 回调事件
+ statsEnable = true,
+ // 配置视频镜像模式
+ cameraConfig = cameraConfig,
+ // 用于监听 Beauty API 的回调事件
+ eventCallback = EventCallback(
+ // 美颜统计数据回调
+ onBeautyStats = {stats ->
+ Log.d(TAG, "BeautyStats stats = $stats")
+ },
+ // GL 线程中
+ // 美颜特效初始化完成回调
+ onEffectInitialized = {
+ ByteDanceBeautySDK.initEffect(applicationContext)
+ Log.d(TAG, "onEffectInitialized")
+ },
+ // GL 线程中
+ // 美颜特效销毁回调
+ onEffectDestroyed = {
+ ByteDanceBeautySDK.unInitEffect()
+ Log.d(TAG, "onEffectInitialized")
+ }
+ )
+ ))
+```
+
+### 4. 设置是否开启美颜
+
+调用 Beauty API 的 `enable` 方法开启美颜。
+
+```kotlin
+mByteDanceApi.enable(true)
+```
+
+### 5. 开启视频采集
+
+开发者可以使用声网模块采集视频,也可以自定义采集视频。本节介绍在这两种场景下如何开启视频采集。
+
+#### 使用声网模块采集视频
+
+使用声网模块采集视频视频时,你需要先调用 `RtcEngine` 类的 `enableVideo` 开启声网 SDK 的视频模块,然后调用 Beauty API 的 `setupLocalVideo` 开启本地视图。
+
+```kotlin
+// 开启视频模块
+mRtcEngine.enableVideo()
+// 设置本地视图
+mByteDanceApi.setupLocalVideo(mBinding.localVideoView, Constants.RENDER_MODE_FIT)
+```
+
+#### 自定义视频采集
+
+自定义视频采集时,你需要先调用 `RtcEngine` 类的 `enableVideo` 开启声网 SDK 的视频模块,然后通过 `RtcEngine` 类的 `registerVideoFrameObserver` 注册原始视频数据观测器并在其中实现 `onCaptureVideoFrame` 函数。
+
+通过 Beauty API 的 `onFrame` 函数,你可以将外部自采集的视频数据传入并进行处理。当处理结果不为 `SKIPPED`(忽略)时,用自采集的视频数据替代 `onCaptureVideoFrame` 函数中的 `VideoFrame`,并传入声网 SDK。
+
+
+```kotlin
+// 开启视频模块
+mRtcEngine.enableVideo()
+// 注册原始视频数据观测器
+// 自定义视频采集时,即 CaptureMode 为 Custom 时,你需要注册原始视频观测器
+mRtcEngine.registerVideoFrameObserver(object : IVideoFrameObserver {
+
+ override fun onCaptureVideoFrame(
+ sourceType: Int,
+ videoFrame: VideoFrame?
+ ) = when (mByteDanceApi.onFrame(videoFrame!!)) {
+ // 当处理结果为 SKIPPED(忽略)时,代表你丢帧,即外部自采集的视频数据不传入声网 SDK
+ // 当处理结果为其他时,外部自采集的视频数据传入声网 SDK
+ ErrorCode.ERROR_FRAME_SKIPPED.value -> false
+ else -> true
+ }
+
+ // 设置是否对原始视频数据作镜像处理
+ override fun getMirrorApplied() = mByteDanceApi.getMirrorApplied()
+
+ // 设置观测点为本地采集时的视频数据
+ override fun getObservedFramePosition() = IVideoFrameObserver.POSITION_POST_CAPTURER
+
+ // override 视频观测器中的其他回调函数
+ ...
+})
+```
+
+
+### 6. 加入频道
+
+调用 `RtcEngine` 类的 `joinChannel` 加入频道,同时传入如下参数:
+
+- `token`:用于鉴权的动态密钥。如果在[创建声网项目](#创建声网项目)时启用**调试模式**,那么 token 传空。如果启用**安全模式**,那么你先参考[使用 Token 鉴权](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/token_server_android_ng?platform=Android)在你的业务服务端生成 Token,然后在这个参数中传入。
+- `channelId`:频道名。
+- `options`:频道媒体设置选项。
+
+
+```kotlin
+mRtcEngine.joinChannel(null, mChannelName, 0, ChannelMediaOptions().apply {
+ // 设置频道场景为直播
+ channelProfile = Constants.CHANNEL_PROFILE_LIVE_BROADCASTING
+ // 设置用户角色为主播,主播可以在频道里发布和订阅音视频流
+ clientRoleType = Constants.CLIENT_ROLE_BROADCASTER
+ // 设置是否发布摄像头采集的视频流(适用于使用声网模块采集视频的情况)
+ publishCameraTrack = true
+ // 设置是否发布自定义采集的视频流(适用于自定义采集视频的情况)
+ publishCustomVideoTrack = false
+ // 设置是否发布麦克风采集的音频流
+ publishMicrophoneTrack = false
+ // 设置进入频道时是否自动订阅频道内其他用户的音频流
+ autoSubscribeAudio = false
+ // 设置进入频道时是否自动订阅频道内其他用户的视频流
+ autoSubscribeVideo = true
+})
+```
+
+### 7. 设置美颜效果
+
+调用 Beauty API 中 `setBeautyPreset` 方法设置使用的美颜参数的类型:
+
+- `DEFAULT`:默认且推荐的美颜参数。
+- `CUSTOM`:开发者自定义的美颜参数。
+
+不同的美颜参数会带来不同的美颜效果。如果你没有特殊偏好,推荐你使用 `DEFAULT`。
+
+```kotlin
+mByteDanceApi.setBeautyPreset(
+ // 设置是否使用默认且推荐的美颜参数
+ if (enable) BeautyPreset.DEFAULT else BeautyPreset.CUSTOM,
+ // 设置美颜、图像识别位点、美妆资源的节点路径
+ // 请确保节点路径在你初始化美颜 SDK 时已填写
+ ByteDanceBeautySDK.beautyNodePath,
+ ByteDanceBeautySDK.beauty4ItemsNodePath,
+ ByteDanceBeautySDK.reSharpNodePath
+)
+```
+
+通过 Beauty API 的 setBeautyPreset
方法,你可以实现基础美颜功能。但是如果你需要更丰富的美颜效果,例如贴纸、美妆风格,你可以直接调用美颜 SDK 中的 API。
+
+### 8. 离开频道
+
+调用 `RtcEngine` 类的 `leaveChannel` 离开频道。
+
+```kotlin
+// 离开 RTC 频道
+mRtcEngine.leaveChannel()
+```
+
+### 9. 销毁资源
+
+调用 Beauty API 的 `release` 销毁 Beauty API。
+
+```kotlin
+mByteDanceApi.release()
+```
+
+在 GL 线程中调用美颜 SDK 的 `unInitEffect` 销毁 `RenderManager`。
+
+```kotlin
+fun unInitEffect(){
+ renderManager.release()
+}
+```
+
+调用 `RtcEngine` 的 `destroy` 销毁 `RtcEngine`。
+
+```kotlin
+RtcEngine.destroy()
+```
+
+
+### API 时序图
+
+![](https://web-cdn.agora.io/docs-files/1692606491371)
\ No newline at end of file
diff --git "a/markdown/beauty/\345\255\227\350\212\202/beauty_integration_bytedance_ios.md" "b/markdown/beauty/\345\255\227\350\212\202/beauty_integration_bytedance_ios.md"
new file mode 100644
index 00000000000..72d98d16b73
--- /dev/null
+++ "b/markdown/beauty/\345\255\227\350\212\202/beauty_integration_bytedance_ios.md"
@@ -0,0 +1,314 @@
+本文介绍如何通过声网场景化 API 集成字节火山美颜到实时音视频中。
+
+## 示例项目
+
+声网在 GitHub 上提供开源 [BeautyAPI](https://github.com/AgoraIO-Community/BeautyAPI/tree/main) 示例项目供你参考。
+
+## 准备开发环境
+
+### 前提条件
+
+- [Git](https://git-scm.com/downloads)
+- [CocoaPods](https://guides.cocoapods.org/using/getting-started.html#getting-started)
+- [Xcode](https://apps.apple.com/cn/app/xcode/id497799835?mt=12) 12.0 及以上
+- iOS 设备,版本 13.0 及以上
+- 有效的苹果开发者账号
+- 有效的声网[开发者账号](https://docs.agora.io/cn/Agora%20Platform/sign_in_and_sign_up)
+- 已联系字节火山技术获取最新的美颜 SDK、美颜资源、美颜证书
+
+
+## 创建声网项目
+
+~f42d44d0-2ac7-11ee-b391-19a59cc2656e~
+
+跑通示例项目时,你需要将**鉴权机制**设置为**调试模式:APP ID**。从头搭建 Android 项目集成美颜功能时,声网推荐你将**鉴权机制**设置为**安全模式:APP ID + Token**,以保障安全性。
+
+
+### 创建 iOS 项目
+
+在 Xcode 中进行以下操作,在你的 app 中实现秀场直播功能:
+
+1. [创建一个新的项目](https://help.apple.com/xcode/mac/current/#/dev07db0e578),**Application** 选择 **App**,**Interface** 选择 **Storyboard**,**Language** 选择 **Swift**。
+
+ 如果你没有添加过开发团队信息,会看到 Add account… 按钮。点击该按钮并按照屏幕提示登入 Apple ID,点击 Next,完成后即可选择你的 Apple 账户作为开发团队。
+
+2. 为你的项目设置[自动签名](https://help.apple.com/xcode/mac/current/#/dev23aab79b4)。
+
+3. 设置部署你的 app 的[目标设备](https://help.apple.com/xcode/mac/current/#/deve69552ee5)。
+
+4. 添加项目的设备权限。在项目导航栏中打开 `info.plist` 文件,编辑[属性列表](https://help.apple.com/xcode/mac/current/#/dev3f399a2a6),添加以下属性:
+
+ | key | type | value |
+ | -------------------------------------- | ------ | ------------------------------------------------------------ |
+ | Privacy - Microphone Usage Description | String | 使用麦克风的目的,例如 for a live interactive streaming |
+ | Privacy - Camera Usage Description | String | 使用摄像头的目的,例如 for a live interactive streaming |
+
+
+
+5. 将字节火山美颜 SDK 集成到你的项目中。请联系字节火山技术支持获取美颜 SDK、美颜资源、证书等文件。下载并解压文件,然后添加到美颜项目对应的文件路径下:
+
+ | 文件 | 项目路径 |
+ |------------------|----------------|
+ | BytedEffects/app/Resource | iOS/ByteEffectLib/Resource |
+ | byted_effect_ios_static/iossample_static/libeffect-sdk.a | iOS/ByteEffectLib/ibeffect-sdk.a |
+ | byted_effect_ios_static/iossample_static/include/BytedEffectSDK | iOS/ByteEffectLib/BytedEffectSDK |
+
+6. 将声网场景化 API 集成到你的项目中。添加 [iOS/BeautyAPi/BeautyAPI](https://github.com/AgoraIO-Community/BeautyAPI/tree/main/iOS/BeautyAPi/BeautyAPI) 目录下的文件到项目中,具体文件如下:
+
+ - `Render/BytesRender` 文件夹
+ - `BytesRender` 文件夹
+ - `BeautyAPI.h` 文件
+ - `BeautyAPI.m` 文件
+ - `BeautyConfig.h` 文件
+ - `BeautyConfig.m` 文件
+
+ 为方便后续代码升级,请不要修改你添加的这些文件的名称。
+
+7. 将声网 RTC SDK 和字节火山美颜依赖库集成到你的项目。开始前请确保你已安装 CocoaPods,如尚未安装 CocoaPods,参考 [Getting Started with CocoaPods](https://guides.cocoapods.org/using/getting-started.html#getting-started) 安装说明。
+
+ 1. 在终端里进入项目根目录,并运行 `pod init` 命令。项目文件夹下会生成一个 `Podfile` 文本文件。
+ 2. 打开 `Podfile` 文件,修改文件为如下内容。注意将 `Your App` 替换为你的 Target 名称。
+
+ ```shell
+ platform :ios, '9.0'
+ # 替换成你的 target 名称
+ target 'Your App' do
+ # x.y.z 请填写具体的 SDK 版本号,如 4.0.1 或 4.0.0.4
+ # 可通过互动直播发版说明获取最新版本号
+ pod 'AgoraRtcEngine_iOS', 'x.y.z'
+ # 配置字节火山美颜的依赖库
+ pod 'bytedEffect', :path => 'bytedEffect.podspec'
+ end
+ ```
+
+
+8. 在终端内运行 pod install
命令安装声网 RTC SDK 和字节火山美颜依赖。成功安装后,Terminal 中会显示 Pod installation complete!
。
+
+9. 成功安装后,项目文件夹下会生成一个后缀为 .xcworkspace
的文件,通过 Xcode 打开该文件进行后续操作。
+
+## 实现美颜
+
+如下[时序图](#api-时序图)展示如何在直播间内实现美颜功能。声网 RTC SDK 承担实时音视频的业务,字节火山美颜 SDK 提供美颜功能,声网 Beauty API 封装了两个 SDK 中的 API 调用逻辑以简化你需要实现的代码逻辑。通过 Beauty API,你可以实现基础美颜功能,但是如果你需要更丰富的美颜效果,例如贴纸、美妆风格,你可以直接调用美颜 SDK 中的 API。
+
+### 1. 初始化 AgoraRtcEngineKit
+
+调用声网 RTC SDK 中的 `sharedEngineWithConfig` 创建并初始化 `AgoraRtcEngineKit` 对象。同时调用 `enableVideo` 开启声网 SDK 的视频模块。
+
+```swift
+// 初始化声网 RtcEngine
+private lazy var rtcEngine: AgoraRtcEngineKit = {
+ let config = AgoraRtcEngineConfig()
+ // 传入你从控制台获取的声网项目的 APP ID
+ config.appId = KeyCenter.AppId
+ config.channelProfile = .liveBroadcasting
+ let rtc = AgoraRtcEngineKit.sharedEngine(with: config, delegate: self)
+ // 设置用户角色为主播,主播可以发送音视频流也可以接收音视频流
+ rtc.setClientRole(.broadcaster)
+ // 开启 SDK 音频模块
+ rtc.enableAudio()
+ // 开启 SDK 视频模块
+ rtc.enableVideo()
+ // 设置默认音频路由为扬声器
+ rtc.setDefaultAudioRouteToSpeakerphone(true)
+ return rtc
+}()
+```
+
+### 2. 初始化美颜和 Beauty API
+
+创建 `BytesBeautyRender` 和 Beauty API 对象。Beauty API 对象是基于 `BytesBeautyRender` 对象封装。
+
+
+```swift
+private lazy var bytesRender = BytesBeautyRender()
+private lazy var beautyAPI = BeautyAPI()
+```
+
+
+调用 `initialize` 初始化 Beauty API 对象。你需要在 `config` 参数中传入如下字段:
+
+- `AgoraRtcEngineKit`:传入之前初始化的 `AgoraRtcEngineKit` 对象。
+- `beautyRender`:传入之前初始化的 `BytesBeautyRender` 对象。
+- `captureMode`:视频的采集模式:
+ - 如果你使用声网模块采集视频,请传入 `CaptureMode.Agora`。
+ - 如果自定义采集视频,请传入 `CaptureMode.Custom`。
+- `statsEnable`:是否开启美颜统计数据回调。`true` 代表开启,`false` 代表不开启。开启后,会有周期性回调事件。
+- `statsDuration`:美颜统计数据回调的周期。单位为秒。
+- `eventCallback`:监听的美颜统计数据回调事件。
+
+
+```swift
+let config = BeautyConfig()
+// AgoraRtcEngineKit
+config.rtcEngine = rtcEngine
+// 设置视频采集模式
+// .agora 意味着使用声网模块采集视频
+// .custom 意味着使用开发者自定义采集视频
+config.captureMode = capture == "Custom" ? .custom : .agora
+// BytesBeautyRender
+config.beautyRender = bytesRender
+// 是否开启美颜统计数据
+// 开启后,会有周期性回调事件
+config.statsEnable = false
+// 设置美颜统计数据的统计区间为 1 秒(默认)
+config.statsDuration = 1
+// Beauty API 的回调事件
+config.eventCallback = { stats in
+ print("min == \(stats.minCostMs)")
+ print("max == \(stats.maxCostMs)")
+ print("averageCostMs == \(stats.averageCostMs)")
+}
+
+// 初始化 Beauty API 对象
+let result = beautyAPI.initialize(config)
+if result != 0 {
+ print("initialize error == \(result)")
+}
+```
+
+
+### 3. 设置是否开启美颜
+
+调用 Beauty API 的 `enable` 方法开启美颜。
+
+```kotlin
+beautyAPI.enable(true)
+```
+
+### 4. 开启视频采集
+
+开发者可以使用声网模块采集视频,也可以自定义采集视频。本节介绍在这两种场景下如何开启视频采集。
+
+#### 使用声网模块采集视频
+
+使用声网模块采集视频视频时,调用 Beauty API 的 `setupLocalVideo` 开启本地视图。
+
+```swift
+// 设置本地视图
+beautyAPI.setupLocalVideo(localView, renderMode: .hidden)
+```
+
+
+#### 自定义视频采集
+
+自定义视频采集时,你需要通过 `AgoraRtcEngineKit` 类的 `setVideoFrameDelegate` 注册原始视频数据观测器并在其中实现 `onCaptureVideoFrame` 函数。
+
+通过 Beauty API 的 `onFrame` 函数,你可以将外部自采集的视频数据传入并进行处理。
+
+
+```swift
+if capture == "Custom" {
+ // 注册原始视频数据观测器
+ // 自定义视频采集时,即 CaptureMode 为 Custom 时,你需要注册原始视频观测器
+ rtcEngine.setVideoFrameDelegate(self)
+}
+
+extension BeautyViewController: AgoraVideoFrameDelegate {
+ func onCapture(_ videoFrame: AgoraOutputVideoFrame, sourceType: AgoraVideoSourceType) -> Bool {
+ // 将外部自采集的视频数据传入声网 SDK
+ guard let pixelBuffer = videoFrame.pixelBuffer else { return true }
+ beautyAPI.onFrame(pixelBuffer) { pixelBuffer in
+ videoFrame.pixelBuffer = pixelBuffer
+ }
+
+ return true
+ }
+
+ // 设置是否对原始视频数据作镜像处理
+ func getMirrorApplied() -> Bool {
+ beautyAPI.getMirrorApplied()
+ }
+
+ // 设置观测点为本地采集时的视频数据
+ func getObservedFramePosition() -> AgoraVideoFramePosition {
+ .postCapture
+ }
+
+ // 实现视频观测器中的其他回调函数
+ ...
+}
+```
+
+
+
+### 5. 加入频道
+
+调用 `AgoraRtcEngineKit` 类的 `joinChannelByToken` 加入频道,同时传入如下参数:
+
+- `token`:用于鉴权的动态密钥。如果在[创建声网项目](#创建声网项目)时启用**调试模式**,那么 token 传空。如果启用**安全模式**,那么你先参考[使用 Token 鉴权](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/token_server_android_ng?platform=Android)在你的业务服务端生成 Token,然后在这个参数中传入。
+- `channelId`:频道名。
+- `mediaOptions`:频道媒体设置选项。
+
+
+
+```swift
+let mediaOption = AgoraRtcChannelMediaOptions()
+mediaOption.clientRoleType = isBroadcast ? .broadcaster : .audience
+// 设置进入频道时是否自动订阅频道内其他用户的音频流
+mediaOption.autoSubscribeAudio = true
+// 设置进入频道时是否自动订阅频道内其他用户的视频流
+mediaOption.autoSubscribeVideo = true
+// 设置是否发布摄像头采集的视频流(适用于使用声网模块采集视频的情况)
+// 用户角色为主播时,设置发布
+// 用户角色为观众时,设置不发布
+mediaOption.publishCameraTrack = mediaOption.clientRoleType == .broadcaster
+// 设置是否发布自定义采集的视频流(适用于自定义采集视频的情况)
+mediaOption.publishCustomVideoTrack = false
+// 设置是否发布麦克风采集的音频流
+// 用户角色为主播时,设置发布
+// 用户角色为观众时,设置不发布
+mediaOption.publishMicrophoneTrack = mediaOption.clientRoleType == .broadcaster
+
+// 加入频道
+let result = rtcEngine.joinChannel(byToken: nil, channelId: channelName ?? "", uid: 0, mediaOptions: mediaOption)
+if result != 0 {
+ print("join failed")
+}
+```
+
+
+### 6. 设置美颜效果
+
+调用 Beauty API 中 `setBeautyPreset` 方法设置使用的美颜参数的类型:
+
+- `BeautyPresetModeDefault`:默认且推荐的美颜参数。
+- `BeautyPresetModeCustom`:开发者自定义的美颜参数。
+
+不同的美颜参数会带来不同的美颜效果。如果你没有特殊偏好,推荐你使用 `BeautyPresetModeDefault`。
+
+```kotlin
+beautyAPI.setBeautyPreset(.default)
+```
+
+通过 Beauty API 的 setBeautyPreset
方法,你可以实现基础美颜功能。但是如果你需要更丰富的美颜效果,例如贴纸、美妆风格,你可以直接调用美颜 SDK 中的 API。
+
+### 7. 离开频道
+
+调用 `AgoraRtcEngineKit` 类的 `leaveChannel` 离开频道。
+
+```kotlin
+// 离开 RTC 频道
+rtcEngine.leaveChannel()
+```
+
+
+### 8. 销毁资源
+
+调用 Beauty API 的 `destroy` 销毁 Beauty API。
+
+```kotlin
+beautyAPI.destroy()
+```
+
+Beauty API 自 1.0.2 版起,已将存在笔误的 `destory` 方法名修正为 `destroy`。
+
+调用 `AgoraRtcEngineKit` 的 `destroy` 销毁 `AgoraRtcEngineKit`。
+
+```kotlin
+AgoraRtcEngineKit.destroy()
+```
+
+
+### API 时序图
+
+![](https://web-cdn.agora.io/docs-files/1693995872971)
\ No newline at end of file
diff --git "a/markdown/beauty/\345\255\227\350\212\202/beauty_run_github_project_bytedance_android.md" "b/markdown/beauty/\345\255\227\350\212\202/beauty_run_github_project_bytedance_android.md"
new file mode 100644
index 00000000000..1e5a703374d
--- /dev/null
+++ "b/markdown/beauty/\345\255\227\350\212\202/beauty_run_github_project_bytedance_android.md"
@@ -0,0 +1,86 @@
+声网在 GitHub 上提供开源 [BeautyAPI](https://github.com/AgoraIO-Community/BeautyAPI/tree/main) 示例项目供你参考。本文介绍如何快速跑通该示例项目,体验字节火山美颜效果。
+
+## 前提条件
+
+- [Git](https://git-scm.com/downloads)
+- [Java Development Kit](https://www.oracle.com/java/technologies/javase-downloads.html) 11
+- [Android Studio](https://developer.android.com/studio/) 3.5 及以上
+- Android 手机,版本 Android 5.0(API Level 21)及以上
+- 有效的声网[开发者账号](https://docs.agora.io/cn/Agora%20Platform/sign_in_and_sign_up)
+
+声网推荐使用真机运行项目。部分模拟机可能存在功能缺失或者性能问题。
+
+
+## 创建声网项目
+
+~f42d44d0-2ac7-11ee-b391-19a59cc2656e~
+
+跑通示例项目时,你需要将**鉴权机制**设置为**调试模式:APP ID**。从头搭建 Android 项目集成美颜功能时,声网推荐你将**鉴权机制**设置为**安全模式:APP ID + Token**,以保障安全性。
+
+## 克隆仓库
+
+运行以下命令克隆仓库到本地:
+
+```shell
+git clone git@github.com:AgoraIO-Community/BeautyAPI.git
+```
+
+## 集成第三方美颜 SDK
+
+1. 联系字节技术支持获取最新的美颜 SDK、美颜资源、美颜证书。
+
+2. 下载并解压美颜 SDK,然后将 SDK 中如下文件添加到美颜示例项目对应的文件路径下:
+
+ |SDK 文件 | 项目路径 |
+ |---|-----|
+ | resource/LicenseBag.bundle | app/src/main/assets/beauty_bytedance |
+ | resource/ModelResource.bundle | app/src/main/assets/beauty_bytedance |
+ | resource/ComposeMakeup.bundle | app/src/main/assets/beauty_bytedance |
+ | resource/StickerResource.bundle | app/src/main/assets/beauty_bytedance |
+ | resource/StickerResource.bundle | app/src/main/assets/beauty_bytedance |
+
+3. 在 `app/src/main/java/io/agora/beautyapi/demo/ByteDanceActivity.kt` 文件中,将 `LICENSE_NAME` 设置为申请到的证书文件名。
+
+ ```kotlin
+ // 这里的证书文件名只用于声网示例项目测试
+ // 请替换成你的证书文件名
+ private val LICENSE_NAME = "agora_test_20220805_20230815_io.agora.entfull_4.2.3.licbag"
+ ```
+
+4. 在 `app/build.gradle` 文件中,将 `applicationId` 修改为你的包名,例如 `com.example.app`。包名用于在设备上唯一标识应用程序。在开发应用时,你需要设置包名。在此处设置的包名需要与你申请美颜 SDK 时提供的包名一致。
+
+ ```java
+ android {
+ defaultConfig {
+ applicationId "io.agora.entfull"
+ ...
+ }
+ }
+ ```
+
+## 配置示例项目
+
+运行美颜项目前,你需要在 `local.properties` 文件中添加并设置如下参数:
+
+```shell
+AGORA_APP_ID = "YOUR_APP_ID"
+```
+
+你可以在[创建声网项目](#create)后,从控制台获取参数的值,详情如下:
+
+| 参数 | 描述 | 获取方式 |
+|----|----|----|
+| `AGORA_APP_ID` | 声网项目的 App ID | [获取 App ID](https://docportal.shengwang.cn/cn/Agora%20Platform/get_appid_token?platform=All%20Platforms#获取-app-id) |
+
+
+## 编译并运行示例项目
+
+1. 开启 Android 设备的开发者选项,打开 USB 调试,通过 USB 连接线将 Android 设备接入电脑。
+
+2. 用 Android Studio 打开 `BeautyAPI/Android` 文件夹。
+
+3. 在 Android Studio 中,点击 **Sync Project with Gradle Files** 按钮,以让项目与 Gradle 文件同步。
+
+4. 待同步成功后,点击 `Run 'app'`。片刻后,美颜应用便会安装到你的 Android 设备上。
+
+5. 打开美颜应用,进行体验。
diff --git "a/markdown/beauty/\345\255\227\350\212\202/beauty_run_github_project_bytedance_ios.md" "b/markdown/beauty/\345\255\227\350\212\202/beauty_run_github_project_bytedance_ios.md"
new file mode 100644
index 00000000000..e05c5fb42eb
--- /dev/null
+++ "b/markdown/beauty/\345\255\227\350\212\202/beauty_run_github_project_bytedance_ios.md"
@@ -0,0 +1,70 @@
+声网在 GitHub 上提供开源 [BeautyAPI](https://github.com/AgoraIO-Community/BeautyAPI/tree/main) 示例项目供你参考。本文介绍如何快速跑通该示例项目,体验字节火山美颜效果。
+
+## 前提条件
+
+- [Git](https://git-scm.com/downloads)
+- [CocoaPods](https://guides.cocoapods.org/using/getting-started.html#getting-started)
+- [Xcode](https://apps.apple.com/cn/app/xcode/id497799835?mt=12) 13.0 及以上
+- iOS 设备,版本 11.0 及以上
+- 有效的苹果开发者账号
+- 有效的声网[开发者账号](https://docs.agora.io/cn/Agora%20Platform/sign_in_and_sign_up)
+
+声网推荐使用真机运行项目。部分模拟机可能存在功能缺失或者性能问题。
+
+
+## 创建声网项目
+
+~f42d44d0-2ac7-11ee-b391-19a59cc2656e~
+
+## 克隆仓库
+
+运行以下命令克隆仓库到本地:
+
+```shell
+git clone git@github.com:AgoraIO-Usecase/agora-ent-scenarios.git
+```
+
+## 集成第三方美颜 SDK
+
+1. 联系字节技术支持获取最新的美颜 SDK、美颜资源、美颜证书。
+
+2. 下载并解压美颜 SDK 等文件,然后将如下文件添加到美颜示例项目对应的文件路径下:
+
+ |文件 | 项目路径 |
+ |-----|-----|
+ | BytedEffects/app/Resource | iOS/ByteEffectLib/Resource |
+ | byted_effect_ios_static/iossample_static/libeffect-sdk.a | iOS/ByteEffectLib/ibeffect-sdk.a |
+ | byted_effect_ios_static/iossample_static/include/BytedEffectSDK | iOS/ByteEffectLib/BytedEffectSDK |
+
+
+## 配置示例项目
+
+1. 运行美颜项目前,你需要在 `iOS/BeautyAPi/KeyCenter.swift` 文件中设置如下参数:
+
+ ```swift
+ static let AppId: String = <#YOUR_APP_ID#>
+ ```
+
+ 你可以在[创建声网项目](#create)后,从控制台获取这些参数的值,详情如下:
+
+ | 参数 | 描述 | 获取方式 |
+ |----|----|----|
+ | `AppId` | 声网项目的 App ID | [获取 App ID](https://docportal.shengwang.cn/cn/Agora%20Platform/get_appid_token?platform=All%20Platforms#获取-app-id) |
+
+
+2. 在 `BeautyAPI/iOS` 目录下运行 `pod install`,然后等待依赖库安装完成。
+
+
+## 编译并运行示例项目
+
+![](https://web-cdn.agora.io/docs-files/1690276905446)
+
+1. 连接上 iOS 设备后,点击 `BeautyAPi.xcodeproj` 文件以通过 Xcode 打开项目,并在 **iOS Device** 选项中勾选上你的 iOS 设备。
+
+2. 在项目 **TARGETS** 下的 **Signing & Capabilities** 界面勾选 **Automatically manage signing**,配置你的苹果开发者账号和 **Bundle Identifier**。Bundle ID 用于在设备上唯一标识应用程序。在开发应用时,你需要设置 Bundle ID。在此处设置的 Bundle ID 需要与你申请商汤美颜 SDK 时提供的 Bundle ID 一致。
+
+3. 点击 开始编译。
+
+4. 编译成功后,你的 iOS 设备上会出现美颜应用。在 iOS 系统设置中将该应用设为信任开发者后你才能打开应用。
+
+5. 打开美颜应用,进行体验。
\ No newline at end of file
diff --git "a/markdown/beauty/\345\255\227\350\212\202Android\346\227\266\345\272\217\345\233\276.wsd" "b/markdown/beauty/\345\255\227\350\212\202Android\346\227\266\345\272\217\345\233\276.wsd"
new file mode 100644
index 00000000000..829e12058cf
--- /dev/null
+++ "b/markdown/beauty/\345\255\227\350\212\202Android\346\227\266\345\272\217\345\233\276.wsd"
@@ -0,0 +1,46 @@
+@startuml
+autonumber
+title 美颜场景化 API (Beauty API) 时序图
+participant "App" as app
+participant "声网 RTC SDK" as rtc
+participant "Beauty API" as api
+participant "字节火山美颜 SDK" as beauty
+app -> app: 进入预览和直播间
+== 初始化 RtcEngine ==
+app -> rtc: RtcEngine.create \n创建并初始化 RtcEngine 对象
+== 初始化 RenderManager ==
+app -> beauty: initBeautySDK \n初始化美颜 SDK
+app -> beauty: initEffect \n初始化 RenderManager 美颜特效对象
+== 初始化 Beauty API ==
+app -> api: createByteDanceBeautyAPI \n创建 Beauty API 对象
+alt #WhiteSmoke 使用声网模块采集视频
+app -> api: initialize(captureMode.**Agora**) \n初始化 Beauty API 对象
+end
+alt #AntiqueWhite 自定义视频采集
+app -> api: initialize(captureMode.**Custom**) \n初始化 Beauty API 对象
+end
+== 开启美颜 ==
+app -> api: enable
+== 开启视频采集 ==
+app -> rtc: enableVideo \n开启视频模块
+alt #WhiteSmoke 使用声网模块采集视频
+app -> rtc: setupLocalVideo \n设置本地视图
+end
+alt #AntiqueWhite 开发者自定义视频采集
+app -> rtc: registerVideoFrameObserver \n注册原始视频数据观测器
+api -->> rtc: onFrame \n传递原始视频数据
+rtc -->> app: onCaptureVideoFrame \n传递原始视频数据
+end
+== 加入频道 ==
+app -> rtc: joinChannel
+== 设置美颜效果 ==
+app -> api: setBeautyPreset \n设置是否使用默认且推荐的美颜参数
+app -> beauty: 如需更多美颜效果,例如贴纸、美妆风格,可直接调用美颜 SDK 的 API
+== 离开频道 ==
+app -> rtc: leaveChannel
+== 销毁资源 ==
+app -> api: release \n销毁 Beauty API 对象
+app -> beauty: unInitEffect \n销毁 RenderManager 美颜特效对象
+app -> rtc: destroy \n销毁 RtcEngine 对象
+app -> app: 退出预览和直播间
+@enduml
\ No newline at end of file
diff --git "a/markdown/beauty/\345\255\227\350\212\202iOS\346\227\266\345\272\217\345\233\276.wsd" "b/markdown/beauty/\345\255\227\350\212\202iOS\346\227\266\345\272\217\345\233\276.wsd"
new file mode 100644
index 00000000000..bcfa094b243
--- /dev/null
+++ "b/markdown/beauty/\345\255\227\350\212\202iOS\346\227\266\345\272\217\345\233\276.wsd"
@@ -0,0 +1,44 @@
+@startuml
+autonumber
+title 美颜场景化 API (Beauty API) 时序图
+participant "App" as app
+participant "声网 RTC SDK" as rtc
+participant "Beauty API" as api
+participant "字节火山美颜 SDK" as beauty
+app -> app: 进入预览和直播间
+== 初始化 AgoraRtcEngineKit ==
+app -> rtc: sharedEngineWithConfig \n创建并初始化 AgoraRtcEngineKit 对象
+== 初始化美颜 SDK ==
+app -> beauty: 创建并初始化 BytesBeautyRender
+== 初始化 Beauty API ==
+app -> api: 创建 Beauty API 对象
+alt #WhiteSmoke 使用声网模块采集视频
+app -> api: initialize(captureMode.**Agora**) \n初始化 Beauty API 对象
+end
+alt #AntiqueWhite 自定义视频采集
+app -> api: initialize(captureMode.**Custom**) \n初始化 Beauty API 对象
+end
+app -> rtc: enableVideo \n开启视频模块
+== 开启美颜 ==
+app -> api: enable
+== 开启视频采集 ==
+alt #WhiteSmoke 使用声网模块采集视频
+app -> rtc: setupLocalVideo \n设置本地视图
+end
+alt #AntiqueWhite 开发者自定义视频采集
+app -> rtc: setVideoFrameDelegate \n注册原始视频数据观测器
+api -->> rtc: onFrame \n传递原始视频数据
+rtc -->> app: onCaptureVideoFrame \n传递原始视频数据
+end
+== 加入频道 ==
+app -> rtc: joinChannelByToken
+== 设置美颜效果 ==
+app -> api: setBeautyPreset \n设置是否使用默认且推荐的美颜参数
+app -> beauty: 如需更多美颜效果,例如贴纸、美妆风格,可直接调用美颜 SDK 的 API
+== 离开频道 ==
+app -> rtc: leaveChannel
+== 销毁资源 ==
+app -> api: destroy \n销毁 Beauty API 对象
+app -> rtc: destroy \n销毁 AgoraRtcEngineKit 对象
+app -> app: 退出预览和直播间
+@enduml
\ No newline at end of file
diff --git "a/markdown/beauty/\347\233\270\350\212\257/beauty_integration_faceunity_android.md" "b/markdown/beauty/\347\233\270\350\212\257/beauty_integration_faceunity_android.md"
new file mode 100644
index 00000000000..115e9b4442a
--- /dev/null
+++ "b/markdown/beauty/\347\233\270\350\212\257/beauty_integration_faceunity_android.md"
@@ -0,0 +1,395 @@
+本文介绍如何通过声网场景化 API 集成相芯美颜到实时音视频中。
+
+## 示例项目
+
+声网在 GitHub 上提供开源 [BeautyAPI](https://github.com/AgoraIO-Community/BeautyAPI/tree/main) 示例项目供你参考。
+
+## 准备开发环境
+
+### 前提条件
+
+- [Git](https://git-scm.com/downloads)
+- [Java Development Kit](https://www.oracle.com/java/technologies/javase-downloads.html) 11
+- [Android Studio](https://developer.android.com/studio/) 3.5 及以上
+- Android 手机,版本 Android 5.0(API Level 21)及以上
+- 有效的声网[开发者账号](https://docs.agora.io/cn/Agora%20Platform/sign_in_and_sign_up)
+- 已联系相芯技术获取最新的美颜 SDK、美颜资源、美颜证书
+- 已在项目中添加 Kotlin 插件
+
+## 创建声网项目
+
+~f42d44d0-2ac7-11ee-b391-19a59cc2656e~
+
+跑通示例项目时,你需要将**鉴权机制**设置为**调试模式:APP ID**。从头搭建 Android 项目集成美颜功能时,声网推荐你将**鉴权机制**设置为**安全模式:APP ID + Token**,以保障安全性。
+
+
+### 创建 Android 项目
+
+按照以下步骤准备开发环境:
+
+1. 如需创建新项目,在 **Android Studio** 里,依次选择 **Phone and Tablet > Empty Activity**,创建 [Android 项目](https://developer.android.com/studio/projects/create-project)。
+
+ 创建项目后,Android Studio 会自动开始同步 gradle, 稍等片刻至同步成功后再进行下一步操作。
+
+2. 使用 Maven Central 将声网 RTC SDK 集成到你的项目中。
+
+ a. 在 `/Gradle Scripts/build.gradle(Project: )` 文件中添加如下代码,添加 Maven Central 依赖:
+
+ ```java
+ buildscript {
+ repositories {
+ ...
+ mavenCentral()
+ }
+ ...
+ }
+
+ allprojects {
+ repositories {
+ ...
+ mavenCentral()
+ }
+ }
+ ```
+
+
+
+ b. 在 `/Gradle Scripts/build.gradle(Module: .app)` 文件中添加如下代码,将声网 RTC SDK 集成到你的 Android 项目中:
+
+ ```java
+ // 配置相芯依赖库
+ allprojects {
+ repositories {
+ maven {
+ url 'http://maven.faceunity.com/repository/maven-public/'
+ allowInsecureProtocol = true
+ }
+ }
+ }
+
+ dependencies {
+ ...
+ // x.y.z,请填写具体的 SDK 版本号,如:4.0.0 或 4.1.0-1。
+ // 通过互动直播产品发版说明获取最新版本号。
+ implementation 'io.agora.rtc:full-sdk:x.y.z'
+ // 集成相芯美颜资源
+ implementation 'com.faceunity:core:8.3.0'
+ implementation 'com.faceunity:model:8.3.0'
+ }
+ ```
+
+3. 将相芯美颜 SDK 集成到你的项目中。请联系相芯技术支持获取美颜 SDK、美颜资源、证书等文件。下载并解压文件,然后添加到美颜项目对应的文件路径下:
+
+ | 文件 | 项目路径 |
+ |-----|-----|
+ | 美妆资源:例如 `naicha.bundle` | app/src/main/assets/beauty_faceunity/makeup |
+ | 贴纸资源:例如 `fashi.bundle` | app/src/main/assets/beauty_faceunity/sticker |
+ | 证书:`authpack.java` | app/src/main/java/io/agora/beauty/demo/authpack.java |
+
+
+4. 将声网场景化 API 集成到你的项目中。添加 [Android/lib_faceunity/src/main/java/io/agora/beautyapi/faceunity](https://github.com/AgoraIO-Community/BeautyAPI/tree/main/Android/lib_faceunity/src/main/java/io/agora/beautyapi/faceunity) 目录下的文件到项目中,具体文件如下:
+ - `utils` 文件夹
+ - `FaceUnityBeautyAPI.kt` 文件
+ - `FaceUnityBeautyAPIImpl` 文件
+
+ 为方便后续代码升级,请不要修改你添加的这些文件的名称。
+
+5. 添加网络及设备权限。
+
+ 在 `/app/Manifests/AndroidManifest.xml` 文件中,在 `` 后面添加如下权限:
+
+ ```xml
+
+
+
+
+
+
+
+
+
+
+
+
+ ```
+
+5. 在 `/Gradle Scripts/proguard-rules.pro` 文件中添加如下行,以防止声网 SDK 的代码被混淆:
+
+ ```java
+ -keep class io.agora.**{*;}
+ -dontwarn javax.**
+ -dontwarn com.google.devtools.build.android.**
+ ```
+
+## 实现美颜
+
+如下[时序图](#api-时序图)展示如何在直播间内实现美颜功能。声网 RTC SDK 承担实时音视频的业务,相芯美颜 SDK 提供美颜功能,声网 Beauty API 封装了两个 SDK 中的 API 调用逻辑以简化你需要实现的代码逻辑。通过 Beauty API,你可以实现基础美颜功能,但是如果你需要更丰富的美颜效果,例如贴纸、美妆风格,你可以直接调用美颜 SDK 中的 API。
+
+
+### 1. 初始化 RtcEngine
+
+调用声网 RTC SDK 中的 `create` 创建并初始化 `RtcEngine` 对象。
+
+```kotlin
+// 初始化声网 RtcEngine
+private val mRtcEngine by lazy {
+ RtcEngine.create(RtcEngineConfig().apply {
+ mContext = applicationContext
+ // 传入你从控制台获取的声网项目的 APP ID
+ mAppId = BuildConfig.AGORA_APP_ID
+ mEventHandler = object : IRtcEngineEventHandler() {}
+ }).apply {
+ // 开启声网 clear_vision 视频插件
+ enableExtension
+ ("agora_video_filters_clear_vision", "clear_vision", true)
+ }
+}
+```
+
+### 2. 初始化美颜 SDK
+
+调用相芯美颜 SDK 的 `registerFURender` 初始化 `FURenderKit` 对象,同时传入如下参数:
+
+- `context`:Android Context(上下文)。
+- `getAuth()`:`getAuth` 方法返回的鉴权字段,格式为 ByteArray。鉴权字段与本地 `authpack.java` 证书文件相关,只有验证通过后,你才能使用相芯美颜 SDK。
+- `object`:事件回调。
+
+初始化美颜 SDK 成功后,在新线程中通过 `loadAIProcessor` 加载 AI 道具。
+
+```kotlin
+object FaceUnityBeautySDK {
+ private val TAG = "FaceUnityBeautySDK"
+
+ private val fuAIKit = FUAIKit.getInstance()
+ val fuRenderKit = FURenderKit.getInstance()
+
+ // AI 道具
+ private val BUNDLE_AI_FACE = "model" + File.separator + "ai_face_processor.bundle"
+ private val BUNDLE_AI_HUMAN = "model" + File.separator + "ai_human_processor.bundle"
+
+ private val workerThread = Executors.newSingleThreadExecutor()
+
+ fun initBeauty(context: Context){
+ // 设置美颜 SDK 日志
+ FURenderManager.setKitDebug(FULogger.LogLevel.TRACE)
+ FURenderManager.setCoreDebug(FULogger.LogLevel.ERROR)
+ // 初始化美颜 SDK
+ // 需传入美颜 SDK 鉴权字段并设置美颜 SDK 事件监听
+ FURenderManager.registerFURender(context, getAuth(), object : OperateCallback {
+ override fun onSuccess(code: Int, msg: String) {
+ Log.i(TAG, "FURenderManager onSuccess -- code=$code, msg=$msg")
+ if (code == OPERATE_SUCCESS_AUTH) {
+ faceunity.fuSetUseTexAsync(1)
+ // 如果初始化美颜 SDK 成功,在新线程中加载 AI 道具
+ workerThread.submit {
+ fuAIKit.loadAIProcessor(BUNDLE_AI_FACE, FUAITypeEnum.FUAITYPE_FACEPROCESSOR)
+ fuAIKit.loadAIProcessor(BUNDLE_AI_HUMAN, FUAITypeEnum.FUAITYPE_HUMAN_PROCESSOR)
+ }
+ }
+ }
+
+ override fun onFail(errCode: Int, errMsg: String) {
+ Log.e(TAG, "FURenderManager onFail -- code=$errCode, msg=$errMsg")
+ }
+ })
+ }
+
+ // 获取美颜 SDK 鉴权字段
+ private fun getAuth(): ByteArray{
+ val authpack = Class.forName("io.agora.beautyapi.demo.authpack")
+ val aMethod = authpack.getDeclaredMethod("A")
+ aMethod.isAccessible = true
+ val authValue = aMethod.invoke(null) as? ByteArray
+ return authValue ?: ByteArray(0)
+ }
+}
+```
+
+### 3. 初始化 Beauty API
+
+调用 `createFaceUnityBeautyAPI` 创建 Beauty API 对象。Beauty API 对象是基于 `FuRenderKit` 对象封装。
+
+
+```kotlin
+// 创建 Beauty API 对象
+private val mFaceUnityApi by lazy {
+ createFaceUnityBeautyAPI()
+}
+```
+
+调用 `initialize` 初始化 Beauty API 对象。你需要在 `config` 参数中传入如下字段:
+
+- `applicationContext`:传入 Android Context(上下文)。
+- `mRtcEngine`:传入之前初始化的 `RtcEngine` 对象。
+- `fuRenderKit`:传入之前初始化的 `FuRenderKit` 对象。
+- `captureMode`:视频的采集模式:
+ - 如果你使用声网模块采集视频,请传入 `CaptureMode.Agora`。
+ - 如果自定义采集视频,请传入 `CaptureMode.Custom`。
+- `statsEnable`:是否开启美颜统计数据回调。`true` 代表开启,`false` 代表不开启。开启后,会有周期性的 `onBeautyStats` 回调事件。
+- `cameraConfig`:设置视频镜像模式。如果在初始化 Beauty API 后你想修改镜像模式,可以调用 Beauty API 的 `updateCameraConfig`。
+- `eventCallback`:你希望监听的回调事件。
+
+```kotlin
+// 初始化 Beauty API 对象
+mFaceUnityApi.initialize(
+ Config(
+ // Android Context(上下文)
+ applicationContext,
+ // RtcEngine
+ mRtcEngine,
+ // 美颜特效管理器
+ fuRenderKit,
+ // 设置视频采集模式
+ // CaptureMode.Agora 意味着使用声网模块采集视频
+ // CaptureMode.Custom 意味着使用开发者自定义采集视频
+ captureMode = if(isCustomCaptureMode) CaptureMode.Custom else CaptureMode.Agora,
+ // 配置视频镜像模式
+ cameraConfig = this.cameraConfig,
+ // 是否开启美颜统计数据
+ // 开启后,会有周期性的 onBeautyStats 回调事件
+ statsEnable = true,
+ // 用于监听 Beauty API 的回调事件
+ eventCallback = object: IEventCallback{
+ override fun onBeautyStats(stats: BeautyStats) {
+ Log.d(TAG, "BeautyStats stats = $stats")
+ }
+ }
+ )
+)
+```
+
+### 4. 设置是否开启美颜
+
+调用 Beauty API 的 `enable` 方法开启美颜。
+
+```kotlin
+mFaceUnityApi.enable(true)
+```
+
+### 5. 开启视频采集
+
+开发者可以使用声网模块采集视频,也可以自定义采集视频。本节介绍在这两种场景下如何开启视频采集。
+
+#### 使用声网模块采集视频
+
+使用声网模块采集视频视频时,你需要先调用 `RtcEngine` 类的 `enableVideo` 开启声网 SDK 的视频模块,然后调用 Beauty API 的 `setupLocalVideo` 开启本地视图。
+
+
+```kotlin
+// 开启视频模块
+mRtcEngine.enableVideo()
+// 设置本地视图
+mFaceUnityApi.setupLocalVideo(mBinding.localVideoView, Constants.RENDER_MODE_FIT)
+```
+
+#### 自定义视频采集
+
+自定义视频采集时,你需要先调用 `RtcEngine` 类的 `enableVideo` 开启声网 SDK 的视频模块,然后通过 `RtcEngine` 类的 `registerVideoFrameObserver` 注册原始视频数据观测器并在其中实现 `onCaptureVideoFrame` 函数。
+
+通过 Beauty API 的 `onFrame` 函数,你可以将外部自采集的视频数据传入并进行处理。当处理结果不为 `SKIPPED`(忽略)时,用自采集的视频数据替代 `onCaptureVideoFrame` 函数中的 `VideoFrame`,并传入声网 SDK。
+
+
+```kotlin
+// 开启视频模块
+mRtcEngine.enableVideo()
+// 注册原始视频数据观测器
+// 自定义视频采集时,即 CaptureMode 为 Custom 时,你需要注册原始视频观测器
+mRtcEngine.registerVideoFrameObserver(object : IVideoFrameObserver {
+
+ override fun onCaptureVideoFrame(
+ sourceType: Int,
+ videoFrame: VideoFrame?
+ ) = when (mFaceUnityApi.onFrame(videoFrame!!)) {
+ // 当处理结果为 SKIPPED(忽略)时,代表你丢帧,即外部自采集的视频数据不传入声网 SDK
+ // 当处理结果为其他时,外部自采集的视频数据传入声网 SDK
+ ErrorCode.ERROR_FRAME_SKIPPED.value -> false
+ else -> true
+ }
+
+ // 设置是否对原始视频数据作镜像处理
+ override fun getMirrorApplied() = mFaceUnityApi.getMirrorApplied()
+
+ // 设置观测点为本地采集时的视频数据
+ override fun getObservedFramePosition() = IVideoFrameObserver.POSITION_POST_CAPTURER
+
+ // override 视频观测器中的其他回调函数
+ ...
+})
+```
+
+
+### 6. 加入频道
+
+调用 `RtcEngine` 类的 `joinChannel` 加入频道,同时传入如下参数:
+
+- `token`:用于鉴权的动态密钥。如果在[创建声网项目](#创建声网项目)时启用**调试模式**,那么 token 传空。如果启用**安全模式**,那么你先参考[使用 Token 鉴权](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/token_server_android_ng?platform=Android)在你的业务服务端生成 Token,然后在这个参数中传入。
+- `channelId`:频道名。
+- `options`:频道媒体设置选项。
+
+```kotlin
+mRtcEngine.joinChannel(null, mChannelName, 0, ChannelMediaOptions().apply {
+ // 设置频道场景为直播
+ channelProfile = Constants.CHANNEL_PROFILE_LIVE_BROADCASTING
+ // 设置用户角色为主播,主播可以在频道里发布和订阅音视频流
+ clientRoleType = Constants.CLIENT_ROLE_BROADCASTER
+ // 设置是否发布摄像头采集的视频流(适用于使用声网模块采集视频的情况)
+ publishCameraTrack = true
+ // 设置是否发布自定义采集的视频流(适用于自定义采集视频的情况)
+ publishCustomVideoTrack = false
+ // 设置是否发布麦克风采集的音频流
+ publishMicrophoneTrack = false
+ // 设置进入频道时是否自动订阅频道内其他用户的音频流
+ autoSubscribeAudio = false
+ // 设置进入频道时是否自动订阅频道内其他用户的视频流
+ autoSubscribeVideo = true
+})
+```
+
+
+### 7. 设置美颜效果
+
+调用 Beauty API 中 `setBeautyPreset` 方法设置使用的美颜参数的类型:
+
+- `DEFAULT`:默认且推荐的美颜参数。
+- `CUSTOM`:开发者自定义的美颜参数。
+
+不同的美颜参数会带来不同的美颜效果。如果你没有特殊偏好,推荐你使用 `DEFAULT`。
+
+```kotlin
+mFaceUnityApi.setBeautyPreset(if (enable) BeautyPreset.DEFAULT else BeautyPreset.CUSTOM)
+```
+通过 Beauty API 的 setBeautyPreset
方法,你可以实现基础美颜功能。但是如果你需要更丰富的美颜效果,例如贴纸、美妆风格,你可以直接调用美颜 SDK 中的 API。
+
+### 8. 离开频道
+
+调用 `RtcEngine` 类的 `leaveChannel` 离开频道。
+
+```kotlin
+// 离开 RTC 频道
+mRtcEngine.leaveChannel()
+```
+
+### 9. 销毁资源
+
+调用 Beauty API 的 `release` 销毁 Beauty API。
+
+```kotlin
+mFaceUnityApi.release()
+```
+
+调用美颜 SDK 的 `destroy` 销毁 `FURenderKit`。
+
+```kotlin
+FURenderKit.destroy()
+```
+
+调用 `RtcEngine` 的 `destroy` 销毁 `RtcEngine`。
+
+```kotlin
+RtcEngine.destroy()
+```
+
+
+### API 时序图
+
+![](https://web-cdn.agora.io/docs-files/1692606503301)
\ No newline at end of file
diff --git "a/markdown/beauty/\347\233\270\350\212\257/beauty_integration_faceunity_ios.md" "b/markdown/beauty/\347\233\270\350\212\257/beauty_integration_faceunity_ios.md"
new file mode 100644
index 00000000000..050899649b4
--- /dev/null
+++ "b/markdown/beauty/\347\233\270\350\212\257/beauty_integration_faceunity_ios.md"
@@ -0,0 +1,313 @@
+本文介绍如何通过声网场景化 API 集成相芯美颜到实时音视频中。
+
+## 示例项目
+
+声网在 GitHub 上提供开源 [BeautyAPI](https://github.com/AgoraIO-Community/BeautyAPI/tree/main) 示例项目供你参考。
+
+## 准备开发环境
+
+### 前提条件
+
+- [Git](https://git-scm.com/downloads)
+- [CocoaPods](https://guides.cocoapods.org/using/getting-started.html#getting-started)
+- [Xcode](https://apps.apple.com/cn/app/xcode/id497799835?mt=12) 12.0 及以上
+- iOS 设备,版本 13.0 及以上
+- 有效的苹果开发者账号
+- 有效的声网[开发者账号](https://docs.agora.io/cn/Agora%20Platform/sign_in_and_sign_up)
+- 已联系相芯技术获取最新的美颜 SDK、美颜资源、美颜证书
+
+
+## 创建声网项目
+
+~f42d44d0-2ac7-11ee-b391-19a59cc2656e~
+
+跑通示例项目时,你需要将**鉴权机制**设置为**调试模式:APP ID**。从头搭建 Android 项目集成美颜功能时,声网推荐你将**鉴权机制**设置为**安全模式:APP ID + Token**,以保障安全性。
+
+
+### 创建 iOS 项目
+
+在 Xcode 中进行以下操作,在你的 app 中实现秀场直播功能:
+
+1. [创建一个新的项目](https://help.apple.com/xcode/mac/current/#/dev07db0e578),**Application** 选择 **App**,**Interface** 选择 **Storyboard**,**Language** 选择 **Swift**。
+
+ 如果你没有添加过开发团队信息,会看到 Add account… 按钮。点击该按钮并按照屏幕提示登入 Apple ID,点击 Next,完成后即可选择你的 Apple 账户作为开发团队。
+
+2. 为你的项目设置[自动签名](https://help.apple.com/xcode/mac/current/#/dev23aab79b4)。
+
+3. 设置部署你的 app 的[目标设备](https://help.apple.com/xcode/mac/current/#/deve69552ee5)。
+
+4. 添加项目的设备权限。在项目导航栏中打开 `info.plist` 文件,编辑[属性列表](https://help.apple.com/xcode/mac/current/#/dev3f399a2a6),添加以下属性:
+
+ | key | type | value |
+ | -------------------------------------- | ------ | ------------------------------------------------------------ |
+ | Privacy - Microphone Usage Description | String | 使用麦克风的目的,例如 for a live interactive streaming |
+ | Privacy - Camera Usage Description | String | 使用摄像头的目的,例如 for a live interactive streaming |
+
+
+
+5. 将相芯美颜 SDK 集成到你的项目中。请联系相芯技术支持获取美颜 SDK、美颜资源、证书等文件。下载并解压文件,然后添加到美颜项目对应的文件路径下:
+
+ | 文件 | 项目路径 |
+ |------------------|----------------|
+ | FaceUnity/Lib/Resources | iOS/FULib |
+ | 证书:authpack.h | iOS/BeautyAPi/FUBeauty/authpack.h |
+
+6. 将声网场景化 API 集成到你的项目中。添加 [iOS/BeautyAPi/BeautyAPI](https://github.com/AgoraIO-Community/BeautyAPI/tree/main/iOS/BeautyAPi/BeautyAPI) 目录下的文件到项目中,具体文件如下:
+
+ - `Render/FURender` 文件夹
+ - `FURender` 文件夹
+ - `BeautyAPI.h` 文件
+ - `BeautyAPI.m` 文件
+ - `BeautyConfig.h` 文件
+ - `BeautyConfig.m` 文件
+
+ 为方便后续代码升级,请不要修改你添加的这些文件的名称。
+
+7. 将声网 RTC SDK 和相芯美颜依赖库集成到你的项目。开始前请确保你已安装 CocoaPods,如尚未安装 CocoaPods,参考 [Getting Started with CocoaPods](https://guides.cocoapods.org/using/getting-started.html#getting-started) 安装说明。
+
+ 1. 在终端里进入项目根目录,并运行 `pod init` 命令。项目文件夹下会生成一个 `Podfile` 文本文件。
+ 2. 打开 `Podfile` 文件,修改文件为如下内容。注意将 `Your App` 替换为你的 Target 名称。
+
+ ```shell
+ platform :ios, '9.0'
+ # 替换成你的 target 名称
+ target 'Your App' do
+ # x.y.z 请填写具体的 SDK 版本号,如 4.0.1 或 4.0.0.4
+ # 可通过互动直播发版说明获取最新版本号
+ pod 'AgoraRtcEngine_iOS', 'x.y.z'
+ # 配置相芯美颜的依赖库
+ pod 'fuLib', :path => 'fu.podspec'
+ end
+ ```
+
+
+8. 在终端内运行 pod install
命令安装声网 RTC SDK 和相芯美颜依赖。成功安装后,Terminal 中会显示 Pod installation complete!
。
+
+9. 成功安装后,项目文件夹下会生成一个后缀为 .xcworkspace
的文件,通过 Xcode 打开该文件进行后续操作。
+
+## 实现美颜
+
+如下[时序图](#api-时序图)展示如何在直播间内实现美颜功能。声网 RTC SDK 承担实时音视频的业务,相芯美颜 SDK 提供美颜功能,声网 Beauty API 封装了两个 SDK 中的 API 调用逻辑以简化你需要实现的代码逻辑。通过 Beauty API,你可以实现基础美颜功能,但是如果你需要更丰富的美颜效果,例如贴纸、美妆风格,你可以直接调用美颜 SDK 中的 API。
+
+### 1. 初始化 AgoraRtcEngineKit
+
+调用声网 RTC SDK 中的 `sharedEngineWithConfig` 创建并初始化 `AgoraRtcEngineKit` 对象。同时调用 `enableVideo` 开启声网 SDK 的视频模块。
+
+```swift
+// 初始化声网 RtcEngine
+private lazy var rtcEngine: AgoraRtcEngineKit = {
+ let config = AgoraRtcEngineConfig()
+ // 传入你从控制台获取的声网项目的 APP ID
+ config.appId = KeyCenter.AppId
+ config.channelProfile = .liveBroadcasting
+ let rtc = AgoraRtcEngineKit.sharedEngine(with: config, delegate: self)
+ // 设置用户角色为主播,主播可以发送音视频流也可以接收音视频流
+ rtc.setClientRole(.broadcaster)
+ // 开启 SDK 音频模块
+ rtc.enableAudio()
+ // 开启 SDK 视频模块
+ rtc.enableVideo()
+ // 设置默认音频路由为扬声器
+ rtc.setDefaultAudioRouteToSpeakerphone(true)
+ return rtc
+}()
+```
+
+### 2. 初始化美颜和 Beauty API
+
+创建 `FUBeautyRender` 和 Beauty API 对象。Beauty API 对象是基于 `FUBeautyRender` 对象封装。
+
+
+```swift
+private lazy var fuRender = FUBeautyRender()
+private lazy var beautyAPI = BeautyAPI()
+```
+
+
+调用 `initialize` 初始化 Beauty API 对象。你需要在 `config` 参数中传入如下字段:
+
+- `AgoraRtcEngineKit`:传入之前初始化的 `AgoraRtcEngineKit` 对象。
+- `beautyRender`:传入之前初始化的 `FUBeautyRender` 对象。
+- `captureMode`:视频的采集模式:
+ - 如果你使用声网模块采集视频,请传入 `CaptureMode.Agora`。
+ - 如果自定义采集视频,请传入 `CaptureMode.Custom`。
+- `statsEnable`:是否开启美颜统计数据回调。`true` 代表开启,`false` 代表不开启。开启后,会有周期性回调事件。
+- `statsDuration`:美颜统计数据回调的周期。单位为秒。
+- `eventCallback`:监听的美颜统计数据回调事件。
+
+
+```swift
+let config = BeautyConfig()
+// AgoraRtcEngineKit
+config.rtcEngine = rtcEngine
+// 设置视频采集模式
+// .agora 意味着使用声网模块采集视频
+// .custom 意味着使用开发者自定义采集视频
+config.captureMode = capture == "Custom" ? .custom : .agora
+// FUBeautyRender
+config.beautyRender = fuRender
+// 是否开启美颜统计数据
+// 开启后,会有周期性回调事件
+config.statsEnable = false
+// 设置美颜统计数据的统计区间为 1 秒(默认)
+config.statsDuration = 1
+// Beauty API 的回调事件
+config.eventCallback = { stats in
+ print("min == \(stats.minCostMs)")
+ print("max == \(stats.maxCostMs)")
+ print("averageCostMs == \(stats.averageCostMs)")
+}
+
+// 初始化 Beauty API 对象
+let result = beautyAPI.initialize(config)
+if result != 0 {
+ print("initialize error == \(result)")
+}
+```
+
+
+### 3. 设置是否开启美颜
+
+调用 Beauty API 的 `enable` 方法开启美颜。
+
+```kotlin
+beautyAPI.enable(true)
+```
+
+### 4. 开启视频采集
+
+开发者可以使用声网模块采集视频,也可以自定义采集视频。本节介绍在这两种场景下如何开启视频采集。
+
+#### 使用声网模块采集视频
+
+使用声网模块采集视频视频时,调用 Beauty API 的 `setupLocalVideo` 开启本地视图。
+
+```swift
+// 设置本地视图
+beautyAPI.setupLocalVideo(localView, renderMode: .hidden)
+```
+
+
+#### 自定义视频采集
+
+自定义视频采集时,你需要通过 `AgoraRtcEngineKit` 类的 `setVideoFrameDelegate` 注册原始视频数据观测器并在其中实现 `onCaptureVideoFrame` 函数。
+
+通过 Beauty API 的 `onFrame` 函数,你可以将外部自采集的视频数据传入并进行处理。
+
+
+```swift
+if capture == "Custom" {
+ // 注册原始视频数据观测器
+ // 自定义视频采集时,即 CaptureMode 为 Custom 时,你需要注册原始视频观测器
+ rtcEngine.setVideoFrameDelegate(self)
+}
+
+extension BeautyViewController: AgoraVideoFrameDelegate {
+ func onCapture(_ videoFrame: AgoraOutputVideoFrame, sourceType: AgoraVideoSourceType) -> Bool {
+ // 将外部自采集的视频数据传入声网 SDK
+ guard let pixelBuffer = videoFrame.pixelBuffer else { return true }
+ beautyAPI.onFrame(pixelBuffer) { pixelBuffer in
+ videoFrame.pixelBuffer = pixelBuffer
+ }
+
+ return true
+ }
+
+ // 设置是否对原始视频数据作镜像处理
+ func getMirrorApplied() -> Bool {
+ beautyAPI.getMirrorApplied()
+ }
+
+ // 设置观测点为本地采集时的视频数据
+ func getObservedFramePosition() -> AgoraVideoFramePosition {
+ .postCapture
+ }
+
+ // 实现视频观测器中的其他回调函数
+ ...
+}
+```
+
+
+
+### 5. 加入频道
+
+调用 `AgoraRtcEngineKit` 类的 `joinChannelByToken` 加入频道,同时传入如下参数:
+
+- `token`:用于鉴权的动态密钥。如果在[创建声网项目](#创建声网项目)时启用**调试模式**,那么 token 传空。如果启用**安全模式**,那么你先参考[使用 Token 鉴权](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/token_server_android_ng?platform=Android)在你的业务服务端生成 Token,然后在这个参数中传入。
+- `channelId`:频道名。
+- `mediaOptions`:频道媒体设置选项。
+
+
+
+```swift
+let mediaOption = AgoraRtcChannelMediaOptions()
+mediaOption.clientRoleType = isBroadcast ? .broadcaster : .audience
+// 设置进入频道时是否自动订阅频道内其他用户的音频流
+mediaOption.autoSubscribeAudio = true
+// 设置进入频道时是否自动订阅频道内其他用户的视频流
+mediaOption.autoSubscribeVideo = true
+// 设置是否发布摄像头采集的视频流(适用于使用声网模块采集视频的情况)
+// 用户角色为主播时,设置发布
+// 用户角色为观众时,设置不发布
+mediaOption.publishCameraTrack = mediaOption.clientRoleType == .broadcaster
+// 设置是否发布自定义采集的视频流(适用于自定义采集视频的情况)
+mediaOption.publishCustomVideoTrack = false
+// 设置是否发布麦克风采集的音频流
+// 用户角色为主播时,设置发布
+// 用户角色为观众时,设置不发布
+mediaOption.publishMicrophoneTrack = mediaOption.clientRoleType == .broadcaster
+
+// 加入频道
+let result = rtcEngine.joinChannel(byToken: nil, channelId: channelName ?? "", uid: 0, mediaOptions: mediaOption)
+if result != 0 {
+ print("join failed")
+}
+```
+
+
+### 6. 设置美颜效果
+
+调用 Beauty API 中 `setBeautyPreset` 方法设置使用的美颜参数的类型:
+
+- `BeautyPresetModeDefault`:默认且推荐的美颜参数。
+- `BeautyPresetModeCustom`:开发者自定义的美颜参数。
+
+不同的美颜参数会带来不同的美颜效果。如果你没有特殊偏好,推荐你使用 `BeautyPresetModeDefault`。
+
+```kotlin
+beautyAPI.setBeautyPreset(.default)
+```
+
+通过 Beauty API 的 setBeautyPreset
方法,你可以实现基础美颜功能。但是如果你需要更丰富的美颜效果,例如贴纸、美妆风格,你可以直接调用美颜 SDK 中的 API。
+
+### 7. 离开频道
+
+调用 `AgoraRtcEngineKit` 类的 `leaveChannel` 离开频道。
+
+```kotlin
+// 离开 RTC 频道
+rtcEngine.leaveChannel()
+```
+
+
+### 8. 销毁资源
+
+调用 Beauty API 的 `destroy` 销毁 Beauty API。
+
+```kotlin
+beautyAPI.destroy()
+```
+
+Beauty API 自 1.0.2 版起,已将存在笔误的 `destory` 方法名修正为 `destroy`。
+
+调用 `AgoraRtcEngineKit` 的 `destroy` 销毁 `AgoraRtcEngineKit`。
+
+```kotlin
+AgoraRtcEngineKit.destroy()
+```
+
+
+### API 时序图
+
+![](https://web-cdn.agora.io/docs-files/1693995863450)
\ No newline at end of file
diff --git "a/markdown/beauty/\347\233\270\350\212\257/beauty_run_github_project_faceunity_android.md" "b/markdown/beauty/\347\233\270\350\212\257/beauty_run_github_project_faceunity_android.md"
new file mode 100644
index 00000000000..ee79cd1b402
--- /dev/null
+++ "b/markdown/beauty/\347\233\270\350\212\257/beauty_run_github_project_faceunity_android.md"
@@ -0,0 +1,75 @@
+声网在 GitHub 上提供开源 [BeautyAPI](https://github.com/AgoraIO-Community/BeautyAPI/tree/main) 示例项目供你参考。本文介绍如何快速跑通该示例项目,体验相芯美颜效果。
+
+## 前提条件
+
+- [Git](https://git-scm.com/downloads)
+- [Java Development Kit](https://www.oracle.com/java/technologies/javase-downloads.html) 11
+- [Android Studio](https://developer.android.com/studio/) 3.5 及以上
+- Android 手机,版本 Android 5.0(API Level 21)及以上
+- 有效的声网[开发者账号](https://docs.agora.io/cn/Agora%20Platform/sign_in_and_sign_up)
+
+声网推荐使用真机运行项目。部分模拟机可能存在功能缺失或者性能问题。
+
+
+## 创建声网项目
+
+~f42d44d0-2ac7-11ee-b391-19a59cc2656e~
+
+
+## 克隆仓库
+
+运行以下命令克隆仓库到本地:
+
+```shell
+git clone git@github.com:AgoraIO-Community/BeautyAPI.git
+```
+
+## 集成第三方美颜 SDK
+
+1. 联系相芯技术支持获取最新的美颜资源、美颜证书。
+
+2. 下载并解压美颜资源,然后将资源中如下文件添加到美颜示例项目对应的文件路径下:
+
+ | SDK 文件 | 项目路径 |
+ |-----|-----|
+ | 美妆资源:例如 `naicha.bundle` | app/src/main/assets/beauty_faceunity/makeup |
+ | 贴纸资源:例如 `fashi.bundle` | app/src/main/assets/beauty_faceunity/sticker |
+ | 证书:`authpack.java` | app/src/main/java/io/agora/beauty/demo/authpack.java |
+
+3. 在 `app/build.gradle` 文件中,将 `applicationId` 修改为你的包名,例如 `com.example.app`。包名用于在设备上唯一标识应用程序。在开发应用时,你需要设置包名。在此处设置的包名需要与你申请美颜 SDK 时提供的包名一致。
+
+ ```java
+ android {
+ defaultConfig {
+ applicationId "io.agora.entfull"
+ ...
+ }
+ }
+ ```
+
+## 配置示例项目
+
+运行美颜项目前,你需要在 `local.properties` 文件中添加并设置如下参数:
+
+```shell
+AGORA_APP_ID = "YOUR_APP_ID"
+```
+
+你可以在[创建声网项目](#create)后,从控制台获取参数的值,详情如下:
+
+| 参数 | 描述 | 获取方式 |
+|----|----|----|
+| `AGORA_APP_ID` | 声网项目的 App ID | [获取 App ID](https://docportal.shengwang.cn/cn/Agora%20Platform/get_appid_token?platform=All%20Platforms#获取-app-id) |
+
+
+## 编译并运行示例项目
+
+1. 开启 Android 设备的开发者选项,打开 USB 调试,通过 USB 连接线将 Android 设备接入电脑。
+
+2. 用 Android Studio 打开 `BeautyAPI/Android` 文件夹。
+
+3. 在 Android Studio 中,点击 **Sync Project with Gradle Files** 按钮,以让项目与 Gradle 文件同步。
+
+4. 待同步成功后,点击 `Run 'app'`。片刻后,美颜应用便会安装到你的 Android 设备上。
+
+5. 打开美颜应用,进行体验。
diff --git "a/markdown/beauty/\347\233\270\350\212\257/beauty_run_github_project_faceunity_ios.md" "b/markdown/beauty/\347\233\270\350\212\257/beauty_run_github_project_faceunity_ios.md"
new file mode 100644
index 00000000000..59f6c80acef
--- /dev/null
+++ "b/markdown/beauty/\347\233\270\350\212\257/beauty_run_github_project_faceunity_ios.md"
@@ -0,0 +1,69 @@
+声网在 GitHub 上提供开源 [BeautyAPI](https://github.com/AgoraIO-Community/BeautyAPI/tree/main) 示例项目供你参考。本文介绍如何快速跑通该示例项目,体验相芯美颜效果。
+
+## 前提条件
+
+- [Git](https://git-scm.com/downloads)
+- [CocoaPods](https://guides.cocoapods.org/using/getting-started.html#getting-started)
+- [Xcode](https://apps.apple.com/cn/app/xcode/id497799835?mt=12) 13.0 及以上
+- iOS 设备,版本 11.0 及以上
+- 有效的苹果开发者账号
+- 有效的声网[开发者账号](https://docs.agora.io/cn/Agora%20Platform/sign_in_and_sign_up)
+
+声网推荐使用真机运行项目。部分模拟机可能存在功能缺失或者性能问题。
+
+
+## 创建声网项目
+
+~f42d44d0-2ac7-11ee-b391-19a59cc2656e~
+
+## 克隆仓库
+
+运行以下命令克隆仓库到本地:
+
+```shell
+git clone git@github.com:AgoraIO-Usecase/agora-ent-scenarios.git
+```
+
+## 集成第三方美颜 SDK
+
+1. 联系相芯技术支持获取最新的美颜资源、美颜证书。
+
+2. 下载并解压美颜资源,然后将如下文件添加到美颜示例项目对应的文件路径下:
+
+ |文件 | 项目路径 |
+ |-----|-----|
+ | FaceUnity/Lib/Resources | iOS/FULib |
+ | 证书:authpack.h | iOS/BeautyAPi/FUBeauty/authpack.h |
+
+
+## 配置示例项目
+
+1. 运行美颜项目前,你需要在 `iOS/BeautyAPi/KeyCenter.swift` 文件中设置如下参数:
+
+ ```swift
+ static let AppId: String = <#YOUR_APP_ID#>
+ ```
+
+ 你可以在[创建声网项目](#create)后,从控制台获取这些参数的值,详情如下:
+
+ | 参数 | 描述 | 获取方式 |
+ |----|----|----|
+ | `AppId` | 声网项目的 App ID | [获取 App ID](https://docportal.shengwang.cn/cn/Agora%20Platform/get_appid_token?platform=All%20Platforms#获取-app-id) |
+
+
+2. 在 `BeautyAPI/iOS` 目录下运行 `pod install`,然后等待依赖库安装完成。
+
+
+## 编译并运行示例项目
+
+![](https://web-cdn.agora.io/docs-files/1690276905446)
+
+1. 连接上 iOS 设备后,点击 `BeautyAPi.xcodeproj` 文件以通过 Xcode 打开项目,并在 **iOS Device** 选项中勾选上你的 iOS 设备。
+
+2. 在项目 **TARGETS** 下的 **Signing & Capabilities** 界面勾选 **Automatically manage signing**,配置你的苹果开发者账号和 **Bundle Identifier**。Bundle ID 用于在设备上唯一标识应用程序。在开发应用时,你需要设置 Bundle ID。在此处设置的 Bundle ID 需要与你申请商汤美颜 SDK 时提供的 Bundle ID 一致。
+
+3. 点击 开始编译。
+
+4. 编译成功后,你的 iOS 设备上会出现美颜应用。在 iOS 系统设置中将该应用设为信任开发者后你才能打开应用。
+
+5. 打开美颜应用,进行体验。
\ No newline at end of file
diff --git "a/markdown/beauty/\347\233\270\350\212\257Android\346\227\266\345\272\217\345\233\276.wsd" "b/markdown/beauty/\347\233\270\350\212\257Android\346\227\266\345\272\217\345\233\276.wsd"
new file mode 100644
index 00000000000..633b143d2d2
--- /dev/null
+++ "b/markdown/beauty/\347\233\270\350\212\257Android\346\227\266\345\272\217\345\233\276.wsd"
@@ -0,0 +1,46 @@
+@startuml
+autonumber
+title 美颜场景化 API (Beauty API) 时序图
+participant "App" as app
+participant "声网 RTC SDK" as rtc
+participant "Beauty API" as api
+participant "相芯美颜 SDK" as beauty
+app -> app: 进入预览和直播间
+== 初始化 RtcEngine ==
+app -> rtc: RtcEngine.create \n创建并初始化 RtcEngine 对象
+== 初始化美颜 SDK ==
+app -> beauty: registerFURender \n初始化 FURenderKit
+app -> beauty: loadAIProcessor \n加载 AI 道具
+== 初始化 Beauty API ==
+app -> api: createFaceUnityBeautyAPI \n创建 Beauty API 对象
+alt #WhiteSmoke 使用声网模块采集视频
+app -> api: initialize(captureMode.**Agora**) \n初始化 Beauty API 对象
+end
+alt #AntiqueWhite 自定义视频采集
+app -> api: initialize(captureMode.**Custom**) \n初始化 Beauty API 对象
+end
+== 开启美颜 ==
+app -> api: enable
+== 开启视频采集 ==
+app -> rtc: enableVideo \n开启视频模块
+alt #WhiteSmoke 使用声网模块采集视频
+app -> rtc: setupLocalVideo \n设置本地视图
+end
+alt #AntiqueWhite 开发者自定义视频采集
+app -> rtc: registerVideoFrameObserver \n注册原始视频数据观测器
+api -->> rtc: onFrame \n传递原始视频数据
+rtc -->> app: onCaptureVideoFrame \n传递原始视频数据
+end
+== 加入频道 ==
+app -> rtc: joinChannel
+== 设置美颜效果 ==
+app -> api: setBeautyPreset \n设置是否使用默认且推荐的美颜参数
+app -> beauty: 如需更多美颜效果,例如贴纸、美妆风格,可直接调用美颜 SDK 的 API
+== 离开频道 ==
+app -> rtc: leaveChannel
+== 销毁资源 ==
+app -> api: release \n销毁 Beauty API 对象
+app -> beauty: destroy \n销毁 FURenderKit 对象
+app -> rtc: destroy \n销毁 RtcEngine 对象
+app -> app: 退出预览和直播间
+@enduml
\ No newline at end of file
diff --git "a/markdown/beauty/\347\233\270\350\212\257iOS\346\227\266\345\272\217\345\233\276.wsd" "b/markdown/beauty/\347\233\270\350\212\257iOS\346\227\266\345\272\217\345\233\276.wsd"
new file mode 100644
index 00000000000..4d4f6b4433f
--- /dev/null
+++ "b/markdown/beauty/\347\233\270\350\212\257iOS\346\227\266\345\272\217\345\233\276.wsd"
@@ -0,0 +1,44 @@
+@startuml
+autonumber
+title 美颜场景化 API (Beauty API) 时序图
+participant "App" as app
+participant "声网 RTC SDK" as rtc
+participant "Beauty API" as api
+participant "相芯美颜 SDK" as beauty
+app -> app: 进入预览和直播间
+== 初始化 AgoraRtcEngineKit ==
+app -> rtc: sharedEngineWithConfig \n创建并初始化 AgoraRtcEngineKit 对象
+== 初始化美颜 SDK ==
+app -> beauty: 创建并初始化 FUBeautyRender
+== 初始化 Beauty API ==
+app -> api: 创建 Beauty API 对象
+alt #WhiteSmoke 使用声网模块采集视频
+app -> api: initialize(captureMode.**Agora**) \n初始化 Beauty API 对象
+end
+alt #AntiqueWhite 自定义视频采集
+app -> api: initialize(captureMode.**Custom**) \n初始化 Beauty API 对象
+end
+app -> rtc: enableVideo \n开启视频模块
+== 开启美颜 ==
+app -> api: enable
+== 开启视频采集 ==
+alt #WhiteSmoke 使用声网模块采集视频
+app -> rtc: setupLocalVideo \n设置本地视图
+end
+alt #AntiqueWhite 开发者自定义视频采集
+app -> rtc: setVideoFrameDelegate \n注册原始视频数据观测器
+api -->> rtc: onFrame \n传递原始视频数据
+rtc -->> app: onCaptureVideoFrame \n传递原始视频数据
+end
+== 加入频道 ==
+app -> rtc: joinChannelByToken
+== 设置美颜效果 ==
+app -> api: setBeautyPreset \n设置是否使用默认且推荐的美颜参数
+app -> beauty: 如需更多美颜效果,例如贴纸、美妆风格,可直接调用美颜 SDK 的 API
+== 离开频道 ==
+app -> rtc: leaveChannel
+== 销毁资源 ==
+app -> api: destroy \n销毁 Beauty API 对象
+app -> rtc: destroy \n销毁 AgoraRtcEngineKit 对象
+app -> app: 退出预览和直播间
+@enduml
\ No newline at end of file
diff --git a/markdown/showroom/resource_download.md b/markdown/showroom/resource_download.md
index 4beb2648680..f13619e3fde 100644
--- a/markdown/showroom/resource_download.md
+++ b/markdown/showroom/resource_download.md
@@ -5,5 +5,5 @@
|------|-------|
| Demo 应用 | [下载声动互娱](/cn/showroom/downloads) |
| GitHub 示例项目 | [Android 项目](https://github.com/AgoraIO-Usecase/agora-ent-scenarios/tree/v3.0.0.1-all-Android/Android/scenes/show)[iOS 项目](https://github.com/AgoraIO-Usecase/agora-ent-scenarios/tree/v3.0.0-all-iOS/iOS/AgoraEntScenarios/Scenes/Show) |
-| 声网视频 SDK | [下载声网视频 SDK](/cn/live-streaming-premium-4.x/downloads?platform=All%20Platforms) |
+| 声网 RTC SDK | [下载声网 RTC SDK](/cn/live-streaming-premium-4.x/downloads?platform=All%20Platforms) |
| 第三方美颜 SDK | 联系第三方技术支持获取 |
\ No newline at end of file
diff --git a/markdown/showroom/showroom_integration_android.md b/markdown/showroom/showroom_integration_android.md
index f870aadb1c8..23e9afd76c1 100644
--- a/markdown/showroom/showroom_integration_android.md
+++ b/markdown/showroom/showroom_integration_android.md
@@ -28,7 +28,7 @@
创建项目后,Android Studio 会自动开始同步 gradle, 稍等片刻至同步成功后再进行下一步操作。
-2. 使用 Maven Central 将声网视频 SDK 集成到你的项目中。
+2. 使用 Maven Central 将声网 RTC SDK 集成到你的项目中。
a. 在 `/Gradle Scripts/build.gradle(Project: )` 文件中添加如下代码,添加 Maven Central 依赖:
@@ -51,7 +51,7 @@
- b. 在 `/Gradle Scripts/build.gradle(Module: .app)` 文件中添加如下代码,将声网视频 SDK 集成到你的 Android 项目中:
+ b. 在 `/Gradle Scripts/build.gradle(Module: .app)` 文件中添加如下代码,将声网 RTC SDK 集成到你的 Android 项目中:
```java
...
@@ -93,7 +93,7 @@
## 实现秀场直播
-如下[时序图](#api-时序图)如何创建直播间、加入直播间、PK 连麦、观众连麦、退出直播间。声网 RTC SDK 承担实时音视频的业务,声网云服务承担信令消息和数据存储的业务。本节会详细介绍如何调用 RTC SDK 的 API 完成这些逻辑,但是信令消息的逻辑需要你参考时序图和[示例项目](https://github.com/AgoraIO-Usecase/agora-ent-scenarios/tree/v3.0.0.1-all-Android/Android/scenes/show)自行实现。
+如下[时序图](#api-时序图)展示如何创建直播间、加入直播间、PK 连麦、观众连麦、退出直播间。声网 RTC SDK 承担实时音视频的业务,声网云服务承担信令消息和数据存储的业务。本节会详细介绍如何调用 RTC SDK 的 API 完成这些逻辑,但是信令消息的逻辑需要你参考时序图和[示例项目](https://github.com/AgoraIO-Usecase/agora-ent-scenarios/tree/v3.0.0.1-all-Android/Android/scenes/show)自行实现。
声网云服务为内部自研服务,暂不对外提供。你可以调用声网云服务的 API 用于测试,但是对于正式环境,声网建议你参考文档自行实现相似的一套服务。如需协助,请
提交工单。
diff --git a/markdown/showroom/showroom_integration_ios.md b/markdown/showroom/showroom_integration_ios.md
index 941b8d7a672..a4f2a2affbc 100644
--- a/markdown/showroom/showroom_integration_ios.md
+++ b/markdown/showroom/showroom_integration_ios.md
@@ -43,7 +43,7 @@
-5. 将声网视频 SDK 集成到你的项目。开始前请确保你已安装 CocoaPods,如尚未安装 CocoaPods,参考 [Getting Started with CocoaPods](https://guides.cocoapods.org/using/getting-started.html#getting-started) 安装说明。
+5. 将声网 RTC SDK 集成到你的项目。开始前请确保你已安装 CocoaPods,如尚未安装 CocoaPods,参考 [Getting Started with CocoaPods](https://guides.cocoapods.org/using/getting-started.html#getting-started) 安装说明。
1. 在终端里进入项目根目录,并运行 `pod init` 命令。项目文件夹下会生成一个 `Podfile` 文本文件。
2. 打开 `Podfile` 文件,修改文件为如下内容。注意将 `Your App` 替换为你的 Target 名称。
@@ -65,7 +65,7 @@
## 实现秀场直播
-如下[时序图](#api-时序图)中展示了如何创建直播间、加入直播间、PK 连麦、观众连麦、退出直播间。声网 RTC SDK 承担实时音视频的业务,声网云服务承担信令消息和数据存储的业务。本节会详细介绍如何调用 RTC SDK 的 API 完成这些逻辑,但是信令消息的逻辑需要你参考时序图和[示例项目](https://github.com/AgoraIO-Usecase/agora-ent-scenarios/tree/v3.0.0-all-iOS/iOS/AgoraEntScenarios/Scenes/Show)自行实现。
+如下[时序图](#api-时序图)展示如何创建直播间、加入直播间、PK 连麦、观众连麦、退出直播间。声网 RTC SDK 承担实时音视频的业务,声网云服务承担信令消息和数据存储的业务。本节会详细介绍如何调用 RTC SDK 的 API 完成这些逻辑,但是信令消息的逻辑需要你参考时序图和[示例项目](https://github.com/AgoraIO-Usecase/agora-ent-scenarios/tree/v3.0.0-all-iOS/iOS/AgoraEntScenarios/Scenes/Show)自行实现。
声网云服务为内部自研服务,暂不对外提供。你可以调用声网云服务的 API 用于测试,但是对于正式环境,声网建议你参考文档自行实现相似的一套服务。如需协助,请
提交工单。