diff --git "a/markdown/beauty/\345\205\266\344\273\226/beauty_overview.md" "b/markdown/beauty/\345\205\266\344\273\226/beauty_overview.md" new file mode 100644 index 00000000000..fd7e47ff5d6 --- /dev/null +++ "b/markdown/beauty/\345\205\266\344\273\226/beauty_overview.md" @@ -0,0 +1,37 @@ +实时音视频互动中,美颜功能可以让用户展现更好的精神面貌,并提供有趣的贴纸特效。声网与第三方厂商合作,开发了声网美颜场景化 API,使开发者能够方便地集成美颜功能。声网美颜场景化 API,也称为 Beauty API,封装了声网 RTC SDK 和第三方美颜 SDK 的 API 调用逻辑,开发者只需几行代码就能在声网的实时音视频互动中使用第三方提供的丰富美颜功能。 + +## 获取资源 + +声网目前已与商汤美颜、字节火山美颜、相芯美颜合作,提供美颜场景化 API,开发者可以根据自己的需求选择不同厂商进行集成。集成过程中,你可以参考如下资源: + +|美颜厂商 | 美颜场景化 API 版本号 |GitHub 示例项目 | 参考文档 | +|-----|-----------|---------------|------------| +| 商汤 | 1.0.1.1|
setBeautyPreset
方法,你可以实现基础美颜功能。但是如果你还需要更丰富的美颜效果,例如贴纸、美妆风格,你可以直接调用美颜 SDK 中的 API。pod install
命令安装声网 RTC SDK 和商汤美颜依赖。
+
+9. 成功安装后,Terminal 中会显示 Pod installation complete!
。项目文件夹下会生成一个后缀为 .xcworkspace
的文件,通过 Xcode 打开该文件进行后续操作。
+
+## 实现美颜
+
+本节展示如何在直播间内实现美颜功能,参考 [API 时序图](#api-时序图)可查看总览。声网 RTC SDK 承担实时音视频的业务,商汤美颜 SDK 提供美颜功能,声网 Beauty API 封装了两个 SDK 中的 API 调用逻辑以简化你需要实现的代码逻辑。通过 Beauty API,你可以实现基础美颜功能,但是如果你还需要更丰富的美颜效果,例如贴纸、美妆风格,你可以直接调用美颜 SDK 中的 API。
+
+### 1. 初始化 AgoraRtcEngineKit
+
+调用声网 RTC SDK 中的 `sharedEngineWithConfig` 创建并初始化 `AgoraRtcEngineKit` 对象。调用 `enableVideo` 开启声网 SDK 的视频模块。
+
+```swift
+// 初始化 AgoraRtcEngineKit
+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
+
+创建 SenseBeautyRender 和 Beauty API 对象。Beauty API 对象基于 `SenseBeautyRender` 对象封装。
+
+
+```swift
+private lazy var senseRender = SenseBeautyRender()
+private lazy var beautyAPI = BeautyAPI()
+```
+
+
+调用 `initialize` 初始化 Beauty API 对象。你需要在 `config` 参数中传入如下字段:
+
+- `AgoraRtcEngineKit`:传入之前初始化的 `AgoraRtcEngineKit` 对象。
+- `beautyRender`:传入之前初始化的 `SenseBeautyRender` 对象。
+- `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
+// SenseBeautyRender
+config.beautyRender = senseRender
+// 是否开启美颜统计数据
+// 开启后,会有周期性回调事件
+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` 方法并将参数设为 `true` 开启美颜。
+
+```swift
+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.isFrontCamera
+ }
+
+ // 设置观测点为本地采集时的视频数据
+ func getObservedFramePosition() -> AgoraVideoFramePosition {
+ .postCapture
+ }
+
+ // 实现视频观测器中的其他回调函数
+ ...
+}
+```
+
+
+
+### 5. 加入频道
+
+调用 `AgoraRtcEngineKit` 类的 `joinChannelByToken` 加入频道,同时传入如下参数:
+
+- `token`:用于鉴权的动态密钥。如果在[创建声网项目](#创建声网项目)时启用**调试模式**,那么将 `token` 参数传空。如果启用**安全模式**,那么你先参考[使用 Token 鉴权](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/token_server_ios_ng?platform=iOS)在你的业务服务端生成 Token,然后将生成的 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`。
+
+```swift
+beautyAPI.setBeautyPreset(.default)
+```
+
+setBeautyPreset
方法,你可以实现基础美颜功能。但是如果你还需要更丰富的美颜效果,例如贴纸、美妆风格,你可以直接调用美颜 SDK 中的 API。destory
方法的命名存在笔误,会在 1.0.2 版本修正。setBeautyPreset
方法,你可以实现基础美颜功能。但是如果你还需要更丰富的美颜效果,例如贴纸、美妆风格,你可以直接调用美颜 SDK 中的 API。pod install
命令安装声网 RTC SDK 和商汤美颜依赖。
+
+9. 成功安装后,Terminal 中会显示 Pod installation complete!
。项目文件夹下会生成一个后缀为 .xcworkspace
的文件,通过 Xcode 打开该文件进行后续操作。
+
+## 实现美颜
+
+本节展示如何在直播间内实现美颜功能,参考 [API 时序图](#api-时序图)可查看总览。声网 RTC SDK 承担实时音视频的业务,商汤美颜 SDK 提供美颜功能,声网 Beauty API 封装了两个 SDK 中的 API 调用逻辑以简化你需要实现的代码逻辑。通过 Beauty API,你可以实现基础美颜功能,但是如果你还需要更丰富的美颜效果,例如贴纸、美妆风格,你可以直接调用美颜 SDK 中的 API。
+
+### 1. 初始化 AgoraRtcEngineKit
+
+调用声网 RTC SDK 中的 `sharedEngineWithConfig` 创建并初始化 `AgoraRtcEngineKit` 对象。调用 `enableVideo` 开启声网 SDK 的视频模块。
+
+```swift
+// 初始化 AgoraRtcEngineKit
+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
+
+创建 SenseBeautyRender 和 Beauty API 对象。Beauty API 对象基于 `SenseBeautyRender` 对象封装。
+
+
+```swift
+private lazy var senseRender = SenseBeautyRender()
+private lazy var beautyAPI = BeautyAPI()
+```
+
+
+调用 `initialize` 初始化 Beauty API 对象。你需要在 `config` 参数中传入如下字段:
+
+- `AgoraRtcEngineKit`:传入之前初始化的 `AgoraRtcEngineKit` 对象。
+- `beautyRender`:传入之前初始化的 `SenseBeautyRender` 对象。
+- `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
+// SenseBeautyRender
+config.beautyRender = senseRender
+// 是否开启美颜统计数据
+// 开启后,会有周期性回调事件
+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` 方法并将参数设为 `true` 开启美颜。
+
+```swift
+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_ios_ng?platform=iOS)在你的业务服务端生成 Token,然后将生成的 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`。
+
+```swift
+beautyAPI.setBeautyPreset(.default)
+```
+
+setBeautyPreset
方法,你可以实现基础美颜功能。但是如果你还需要更丰富的美颜效果,例如贴纸、美妆风格,你可以直接调用美颜 SDK 中的 API。destory
方法名修正为 destroy
。setBeautyPreset
方法,你可以实现基础美颜功能。但是如果你还需要更丰富的美颜效果,例如贴纸、美妆风格,你可以直接调用美颜 SDK 中的 API。pod install
命令安装声网 RTC SDK 和字节火山美颜依赖。
+
+9. 成功安装后,Terminal 中会显示 Pod installation complete!
。项目文件夹下会生成一个后缀为 .xcworkspace
的文件,通过 Xcode 打开该文件进行后续操作。
+
+## 实现美颜
+
+本节展示如何在直播间内实现美颜功能,参考 [API 时序图](#api-时序图)可查看总览。声网 RTC SDK 承担实时音视频的业务,字节火山美颜 SDK 提供美颜功能,声网 Beauty API 封装了两个 SDK 中的 API 调用逻辑以简化你需要实现的代码逻辑。通过 Beauty API,你可以实现基础美颜功能,但是如果你还需要更丰富的美颜效果,例如贴纸、美妆风格,你可以直接调用美颜 SDK 中的 API。
+
+### 1. 初始化 AgoraRtcEngineKit
+
+调用声网 RTC SDK 中的 `sharedEngineWithConfig` 创建并初始化 `AgoraRtcEngineKit` 对象。调用 `enableVideo` 开启声网 SDK 的视频模块。
+
+```swift
+// 初始化 AgoraRtcEngineKit
+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` 方法并将参数设为 `true` 开启美颜。
+
+```swift
+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_ios_ng?platform=iOS)在你的业务服务端生成 Token,然后将生成的 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`。
+
+```swift
+beautyAPI.setBeautyPreset(.default)
+```
+
+setBeautyPreset
方法,你可以实现基础美颜功能。但是如果你还需要更丰富的美颜效果,例如贴纸、美妆风格,你可以直接调用美颜 SDK 中的 API。destory
方法名修正为 destroy
。SDK 文件 | +项目路径 | +
---|---|
resource/LicenseBag.bundle | +app/src/main/assets/beauty_bytedance | +
resource/ModelResource.bundle | +|
resource/ComposeMakeup.bundle | +|
resource/StickerResource.bundle | +|
resource/StickerResource.bundle | +
setBeautyPreset
方法,你可以实现基础美颜功能。但是如果你还需要更丰富的美颜效果,例如贴纸、美妆风格,你可以直接调用美颜 SDK 中的 API。pod install
命令安装声网 RTC SDK 和相芯美颜依赖。
+
+9. 成功安装后,Terminal 中会显示 Pod installation complete!
。项目文件夹下会生成一个后缀为 .xcworkspace
的文件,通过 Xcode 打开该文件进行后续操作。
+
+## 实现美颜
+
+本节展示如何在直播间内实现美颜功能,参考 [API 时序图](#api-时序图)可查看总览。声网 RTC SDK 承担实时音视频的业务,相芯美颜 SDK 提供美颜功能,声网 Beauty API 封装了两个 SDK 中的 API 调用逻辑以简化你需要实现的代码逻辑。通过 Beauty API,你可以实现基础美颜功能,但是如果你还需要更丰富的美颜效果,例如贴纸、美妆风格,你可以直接调用美颜 SDK 中的 API。
+
+### 1. 初始化 AgoraRtcEngineKit
+
+调用声网 RTC SDK 中的 `sharedEngineWithConfig` 创建并初始化 `AgoraRtcEngineKit` 对象。调用 `enableVideo` 开启声网 SDK 的视频模块。
+
+```swift
+// 初始化 AgoraRtcEngineKit
+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` 方法并将参数设为 `true` 开启美颜。
+
+```swift
+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_ios_ng?platform=iOS)在你的业务服务端生成 Token,然后将生成的 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`。
+
+```swift
+beautyAPI.setBeautyPreset(.default)
+```
+
+setBeautyPreset
方法,你可以实现基础美颜功能。但是如果你还需要更丰富的美颜效果,例如贴纸、美妆风格,你可以直接调用美颜 SDK 中的 API。destory
方法名修正为 destroy
。