From 24a7c6fe9ea934bbc1dd6419fe92aaba7f494584 Mon Sep 17 00:00:00 2001 From: kelzr Date: Sat, 6 May 2023 14:25:31 +0800 Subject: [PATCH 01/11] [SE] initial --- .../Live-stream Shopping/consideration.md | 0 .../live_stream_shopping_android.md | 0 .../live_stream_shopping_app_download.md | 0 .../live_stream_shopping_ios.md | 0 .../live_stream_shopping_overview.md | 4 +- markdown/Live-stream Shopping/fragment.md | 41 +++++++++++++++++++ .../integration-android.md | 0 .../Live-stream Shopping/integration-ios.md | 0 markdown/Live-stream Shopping/overview.md | 33 +++++++++++++++ 9 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 markdown/Live-stream Shopping/consideration.md rename markdown/Live-stream Shopping/{ => deprecated}/live_stream_shopping_android.md (100%) rename markdown/Live-stream Shopping/{ => deprecated}/live_stream_shopping_app_download.md (100%) rename markdown/Live-stream Shopping/{ => deprecated}/live_stream_shopping_ios.md (100%) rename markdown/Live-stream Shopping/{ => deprecated}/live_stream_shopping_overview.md (97%) create mode 100644 markdown/Live-stream Shopping/fragment.md create mode 100644 markdown/Live-stream Shopping/integration-android.md create mode 100644 markdown/Live-stream Shopping/integration-ios.md create mode 100644 markdown/Live-stream Shopping/overview.md diff --git a/markdown/Live-stream Shopping/consideration.md b/markdown/Live-stream Shopping/consideration.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/markdown/Live-stream Shopping/live_stream_shopping_android.md b/markdown/Live-stream Shopping/deprecated/live_stream_shopping_android.md similarity index 100% rename from markdown/Live-stream Shopping/live_stream_shopping_android.md rename to markdown/Live-stream Shopping/deprecated/live_stream_shopping_android.md diff --git a/markdown/Live-stream Shopping/live_stream_shopping_app_download.md b/markdown/Live-stream Shopping/deprecated/live_stream_shopping_app_download.md similarity index 100% rename from markdown/Live-stream Shopping/live_stream_shopping_app_download.md rename to markdown/Live-stream Shopping/deprecated/live_stream_shopping_app_download.md diff --git a/markdown/Live-stream Shopping/live_stream_shopping_ios.md b/markdown/Live-stream Shopping/deprecated/live_stream_shopping_ios.md similarity index 100% rename from markdown/Live-stream Shopping/live_stream_shopping_ios.md rename to markdown/Live-stream Shopping/deprecated/live_stream_shopping_ios.md diff --git a/markdown/Live-stream Shopping/live_stream_shopping_overview.md b/markdown/Live-stream Shopping/deprecated/live_stream_shopping_overview.md similarity index 97% rename from markdown/Live-stream Shopping/live_stream_shopping_overview.md rename to markdown/Live-stream Shopping/deprecated/live_stream_shopping_overview.md index 45d7554ff57..f60dd1174b6 100644 --- a/markdown/Live-stream Shopping/live_stream_shopping_overview.md +++ b/markdown/Live-stream Shopping/deprecated/live_stream_shopping_overview.md @@ -28,9 +28,9 @@ updatedAt: 2020-11-12 11:05:04 Agora 为电商直播提供如下平台的 Demo,扫描下方二维码下载应用。 -| Android | iOS | +| Android | iOS | | ---------------- | ---------------- | -|[前往下载](./downloads?platform=Android) | [前往下载](./downloads?platform=iOS) | +|[前往下载](./downloads?platform=Android) | [前往下载](./downloads?platform=iOS) | 由于电商直播场景涉及多个用户,我们建议你准备**两台**设备进行体验。完成下载和安装后,参考如下步骤试用 Agora 的电商直播。 diff --git a/markdown/Live-stream Shopping/fragment.md b/markdown/Live-stream Shopping/fragment.md new file mode 100644 index 00000000000..d6dc48fbf6d --- /dev/null +++ b/markdown/Live-stream Shopping/fragment.md @@ -0,0 +1,41 @@ +**超低延时** + +声网 SD-RTN™ 网络节点覆盖全球 200 多个国家和地区,通过就近接入、智能路由等控制策略,保证全球平均端到端延时 < 400 ms。 + +**稳定可靠** + +提供 SLA 质量保证,登录成功率 > 99%,全年可用时间高达 99.99%。 + +**极致弱网对抗能力** + +业界领先的弱网对抗算法,保证在 70% 丢包情况下,音视频通话流畅;70% 丢包情况下,音频通话流畅,真正做到低卡顿、不掉线。 + +当用户网络带宽不足时,声网的网络自适应策略可以实现音频优先、主播优先。 + +**高音质** + +支持 48 kHz 全频带采样,业界领先的 3A 算法(回声消除、噪声抑制、自动增益),在嘈杂环境下也能保持语音清澈,提供高品质的互动体验。 + +**美声和音效** + +直播过程中,主播变声或者使用美音,可以有效地提升互动趣味、增进直播间氛围。声网通过 API 提供丰富的变声、美音音效选择,开发者无需手动配置,就可以选择想要的变声效果。 + +**高清画质** + +支持 1080p 高清视频体验。支持 H.265、超分辨率和感知视频编码,在同等分辨率、帧率情况下,视频占有带宽更低,画质体验更好。 + +**支持第三方服务** + +你可以搭配使用第三方服务,在项目中实现鉴黄、美颜、AR 等功能,提供更丰富好玩的视频直播场景。 + +**质量透明可溯** + +声网通过如下接口及产品,保障实时音视频的质量: + +- 完整的通话质量回调,排除潜在问题,扫清互动障碍; +- [水晶球](https://console.agora.io/analytics/call/search)工具,显示端到端全链路的质量监控数据,直播过程可追溯,提供用户行为、运行状态、QoE/QoS 的质量数据,帮助排查定位问题。 + +**全平台适配** + +- 支持 Windows、macOS、Web、iOS、Android、Electron 等多达 30 种平台和开发架构适配; +- 支持 6000+ 款机形适配,保证全球用户体验的一致性。 \ No newline at end of file diff --git a/markdown/Live-stream Shopping/integration-android.md b/markdown/Live-stream Shopping/integration-android.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/markdown/Live-stream Shopping/integration-ios.md b/markdown/Live-stream Shopping/integration-ios.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/markdown/Live-stream Shopping/overview.md b/markdown/Live-stream Shopping/overview.md new file mode 100644 index 00000000000..affa8fbfa6d --- /dev/null +++ b/markdown/Live-stream Shopping/overview.md @@ -0,0 +1,33 @@ +## 场景描述 + +电商直播是电子商务与视频互动直播相结合的场景。在直播间里,房主向观众介绍商品,提供商品列表和链接;观众看到心仪的商品,可点击链接快速下单。直播过程中,房主可以和另一个直播间的房主进行 PK 连麦,展示各自的商品,激发观众的购买热情,增加直播的趣味性。 + +## 功能列表 + +电商直播场景通常需要实现如下功能: + +| 功能       | 描述 | +| ---------------- | ---------------- | +| 实时音视频互动 | 超低延时下,观众实时接收主播的音视频流,保证流畅的观看体验。 | +| 实时消息互动 | 直播间内的房主和观众使用文字消息实时交流。| +| PK 连麦 | 房主邀请其他房主 PK 连麦。直播间的观众可以在连麦的两个频道间快速跳转,购买心仪的商品,给喜爱的房主投票或刷礼物,增强 PK 气氛。 | +| 商品列表管理 | 房主管理商品的上下架,提供商品链接,以便观众边看边买。 | +| 用户进出频道管理 | 直播间内的房主和观众可以实时了解谁进入或离开了当前的直播间。| + +## 技术方案 + +声网使用声网 RTC SDK、声网云服务共同搭建电商直播场景: + +- RTC SDK:让用户加入 RTC 频道,进行实时音视频互动。 +- 云服务:让用户收发文字消息、礼物、上下架商品、发起上麦邀请等。 + +
声网云服务为内部自研服务,暂不对外提供。声网建议你参考文档自行实现相似的一套服务。如需协助,请提交工单
+ +![](https://web-cdn.agora.io/docs-files/1683354184122) + +![](https://web-cdn.agora.io/docs-files/1683354192966) + + +## 方案优势 + +~abd0fdb0-b128-11ea-aa07-c5bcc14a9a95~ \ No newline at end of file From 27c25910c5078ce5ec8f636b01bcd43ab242fb4a Mon Sep 17 00:00:00 2001 From: kelzr Date: Thu, 11 May 2023 11:23:13 +0800 Subject: [PATCH 02/11] [SE] initial --- markdown/Live-stream Shopping/fragment.md | 13 ++----------- .../Live-stream Shopping/integration-android.md | 14 ++++++++++++++ markdown/Live-stream Shopping/overview.md | 8 ++++---- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/markdown/Live-stream Shopping/fragment.md b/markdown/Live-stream Shopping/fragment.md index d6dc48fbf6d..69f9f1eecb6 100644 --- a/markdown/Live-stream Shopping/fragment.md +++ b/markdown/Live-stream Shopping/fragment.md @@ -16,13 +16,9 @@ 支持 48 kHz 全频带采样,业界领先的 3A 算法(回声消除、噪声抑制、自动增益),在嘈杂环境下也能保持语音清澈,提供高品质的互动体验。 -**美声和音效** - -直播过程中,主播变声或者使用美音,可以有效地提升互动趣味、增进直播间氛围。声网通过 API 提供丰富的变声、美音音效选择,开发者无需手动配置,就可以选择想要的变声效果。 - **高清画质** -支持 1080p 高清视频体验。支持 H.265、超分辨率和感知视频编码,在同等分辨率、帧率情况下,视频占有带宽更低,画质体验更好。 +支持 1080P 高清视频体验。支持 H.265、超分辨率和感知视频编码,在同等分辨率、帧率情况下,视频占有带宽更低,画质体验更好。 **支持第三方服务** @@ -33,9 +29,4 @@ 声网通过如下接口及产品,保障实时音视频的质量: - 完整的通话质量回调,排除潜在问题,扫清互动障碍; -- [水晶球](https://console.agora.io/analytics/call/search)工具,显示端到端全链路的质量监控数据,直播过程可追溯,提供用户行为、运行状态、QoE/QoS 的质量数据,帮助排查定位问题。 - -**全平台适配** - -- 支持 Windows、macOS、Web、iOS、Android、Electron 等多达 30 种平台和开发架构适配; -- 支持 6000+ 款机形适配,保证全球用户体验的一致性。 \ No newline at end of file +- [水晶球](https://console.agora.io/analytics/call/search)工具,显示端到端全链路的质量监控数据,直播过程可追溯,提供用户行为、运行状态、QoE/QoS 的质量数据,帮助排查定位问题。 \ No newline at end of file diff --git a/markdown/Live-stream Shopping/integration-android.md b/markdown/Live-stream Shopping/integration-android.md index e69de29bb2d..e6cc7daa1d3 100644 --- a/markdown/Live-stream Shopping/integration-android.md +++ b/markdown/Live-stream Shopping/integration-android.md @@ -0,0 +1,14 @@ +## 方案概览 + +你可以在教师端和学生端集成[声网 SDK](https://docs.agora.io/cn/Agora%20Platform/terms?platform=All%20Platforms#agora-rtc-sdk)、[声网 RTM SDK](https://docs.agora.io/cn/Agora%20Platform/terms?platform=All%20Platform#agora-rtm-sdk)、[声网互动白板 SDK](https://docs.agora.io/cn/whiteboard/landing-page?platform=Android),并使用[声网云端录制服务](https://docs.agora.io/cn/Agora%20Platform/terms?platform=All%20Platform#cloud-recording)来搭建一对 N 在线小班课场景。 + +![](https://web-cdn.agora.io/docs-files/1677221469890) + +各 SDK 或服务实现的功能如下: + +|声网产品 | 实现功能 | +| :----------------- | :--------------------------------------------------- | +|[声网 SDK](https://docs.agora.io/cn/Video/product_video) | 加入 RTC 频道,进行实时音视频互动。 | +|[声网 RTM SDK](https://docs.agora.io/cn/Real-time-Messaging/product_rtm) | 登录 RTM 系统并加入 RTM 频道,实现收发实时文字消息。 | +|[声网互动白板服务](https://docs.agora.io/cn/whiteboard/product_whiteboard) | 实现互动白板相关功能。 | +|[声网云端录制服务](https://docs.agora.io/cn/cloud-recording/product_cloud_recording) | 录制实时音视频、录制完成后即时回放。 | \ No newline at end of file diff --git a/markdown/Live-stream Shopping/overview.md b/markdown/Live-stream Shopping/overview.md index affa8fbfa6d..871a7cf55c0 100644 --- a/markdown/Live-stream Shopping/overview.md +++ b/markdown/Live-stream Shopping/overview.md @@ -8,7 +8,7 @@ | 功能       | 描述 | | ---------------- | ---------------- | -| 实时音视频互动 | 超低延时下,观众实时接收主播的音视频流,保证流畅的观看体验。 | +| 实时音视频互动 | 超低延时下,观众实时接收房主的音视频流,保证流畅的观看体验。 | | 实时消息互动 | 直播间内的房主和观众使用文字消息实时交流。| | PK 连麦 | 房主邀请其他房主 PK 连麦。直播间的观众可以在连麦的两个频道间快速跳转,购买心仪的商品,给喜爱的房主投票或刷礼物,增强 PK 气氛。 | | 商品列表管理 | 房主管理商品的上下架,提供商品链接,以便观众边看边买。 | @@ -23,11 +23,11 @@
声网云服务为内部自研服务,暂不对外提供。声网建议你参考文档自行实现相似的一套服务。如需协助,请提交工单
-![](https://web-cdn.agora.io/docs-files/1683354184122) +![](https://web-cdn.agora.io/docs-files/1683774790711) -![](https://web-cdn.agora.io/docs-files/1683354192966) +![](https://web-cdn.agora.io/docs-files/1683774804784) ## 方案优势 -~abd0fdb0-b128-11ea-aa07-c5bcc14a9a95~ \ No newline at end of file + frag \ No newline at end of file From 185cfdc45376a5b954c3dc41ed48661f4f793f76 Mon Sep 17 00:00:00 2001 From: kelzr Date: Thu, 11 May 2023 11:55:58 +0800 Subject: [PATCH 03/11] [SE] initial --- .../{ => deprecated}/livecast_app_android.md | 0 .../{ => deprecated}/livecast_app_ios.md | 0 .../livecast_client_android.md | 0 .../{ => deprecated}/livecast_client_ios.md | 0 .../{ => deprecated}/livecast_overview.md | 0 .../{ => deprecated}/run_livecast_android.md | 0 .../{ => deprecated}/run_livecast_ios.md | 0 markdown/livecast/overview.md | 58 +++++++++++++++++++ 8 files changed, 58 insertions(+) rename markdown/livecast/{ => deprecated}/livecast_app_android.md (100%) rename markdown/livecast/{ => deprecated}/livecast_app_ios.md (100%) rename markdown/livecast/{ => deprecated}/livecast_client_android.md (100%) rename markdown/livecast/{ => deprecated}/livecast_client_ios.md (100%) rename markdown/livecast/{ => deprecated}/livecast_overview.md (100%) rename markdown/livecast/{ => deprecated}/run_livecast_android.md (100%) rename markdown/livecast/{ => deprecated}/run_livecast_ios.md (100%) create mode 100644 markdown/livecast/overview.md diff --git a/markdown/livecast/livecast_app_android.md b/markdown/livecast/deprecated/livecast_app_android.md similarity index 100% rename from markdown/livecast/livecast_app_android.md rename to markdown/livecast/deprecated/livecast_app_android.md diff --git a/markdown/livecast/livecast_app_ios.md b/markdown/livecast/deprecated/livecast_app_ios.md similarity index 100% rename from markdown/livecast/livecast_app_ios.md rename to markdown/livecast/deprecated/livecast_app_ios.md diff --git a/markdown/livecast/livecast_client_android.md b/markdown/livecast/deprecated/livecast_client_android.md similarity index 100% rename from markdown/livecast/livecast_client_android.md rename to markdown/livecast/deprecated/livecast_client_android.md diff --git a/markdown/livecast/livecast_client_ios.md b/markdown/livecast/deprecated/livecast_client_ios.md similarity index 100% rename from markdown/livecast/livecast_client_ios.md rename to markdown/livecast/deprecated/livecast_client_ios.md diff --git a/markdown/livecast/livecast_overview.md b/markdown/livecast/deprecated/livecast_overview.md similarity index 100% rename from markdown/livecast/livecast_overview.md rename to markdown/livecast/deprecated/livecast_overview.md diff --git a/markdown/livecast/run_livecast_android.md b/markdown/livecast/deprecated/run_livecast_android.md similarity index 100% rename from markdown/livecast/run_livecast_android.md rename to markdown/livecast/deprecated/run_livecast_android.md diff --git a/markdown/livecast/run_livecast_ios.md b/markdown/livecast/deprecated/run_livecast_ios.md similarity index 100% rename from markdown/livecast/run_livecast_ios.md rename to markdown/livecast/deprecated/run_livecast_ios.md diff --git a/markdown/livecast/overview.md b/markdown/livecast/overview.md new file mode 100644 index 00000000000..54fbe28b333 --- /dev/null +++ b/markdown/livecast/overview.md @@ -0,0 +1,58 @@ +## 场景描述 + +互动播客指在直播房间中进行实时音频互动的场景。互动播客房间有一个房主和多个听众,房间内的麦位数量没有限制,所有用户都能看到麦位的实时状态。房主和听众可以进行以下操作: + +- 房主可以发布音频流,也可以邀请听众发言(“上麦”)或者将听众从麦位上移除(“下麦”)。 +- 普通听众不能发布音频流,只有麦位上的听众(“连麦主播”)可以发布音频流。听众可以通过房主邀请或者主动请求成为连麦主播。 + + +## 功能列表 + +互动播客场景通常需要实现以下功能: + +| 功能 | 描述 | +| :----------- | :----------------------------------------------------------- | +| 实时音频互动 | 超低延时下,听众实时接收房主和连麦主播的音频流,房主和连麦主播实时接收对方的音频流,保证流畅的音频互动。 | +| 麦位控制 | 房主进行上麦、下麦、禁麦操作,同时房间内所有用户都能看到每个麦位的实时状态。 | +| 用户管理 | 维护房间成员列表、用户昵称等。 | + + + +## 技术方案 + +声网使用声网 RTC SDK、声网云服务共同搭建互动播客场景: + +- RTC SDK:让用户加入 RTC 频道,进行实时音频互动。 +- 云服务:让用户收发举手消息等。 + +
声网云服务为内部自研服务,暂不对外提供。声网建议你参考文档自行实现相似的一套服务。如需协助,请提交工单
+ +![](https://web-cdn.agora.io/docs-files/1683775337517) + +## 方案优势 + +声网的互动播客场景具有以下优势: + +**1、全球覆盖,超低延时** + +声网的 SD-RTN™ 网络在全球部署节点,覆盖了 200+ 国家与地区,端到端平均延时低至 200 – 300 ms ,最低 50 ms。 + +**2、超高弹性网络架构** + +声网的 SD-RTN™ 网络采用超高弹性架构设计,能够承受 10 倍以上的负荷,可以缓解流量暴增带来的传输压力。 + +**3、稳定可靠的高质量体验** + +提供 XLA 质量保证,登录成功率 > 99%,全年可用时间高达 99.99%。 + +**4、极致弱网对抗能力** + +业界领先的弱网对抗算法,在 80% 丢包情况下都能保证音频通话流畅,真正做到低卡顿、不掉线。当用户网络带宽不足时,声网的网络自适应策略可以实现音频优先、主播优先。 + +**5、安全合规** + +声网具备 ISO 27001、ISO 27017、ISO 27018 等国际通用的信息安全和个人信息保护认证,符合 GDPR、CCPA、COPPA、HIPAA 、个人信息保护法(草案)等国内外隐私保护法律法规的要求,为用户的信息安全提供稳固保障。 + +**6、高音质** + +支持 48 kHz 全频带采样,采用自研的 NOVA™ 语音引擎和业界领先的 3A 算法(回声消除、噪声抑制、自动增益),在嘈杂环境下也能保持语音清澈,提供高品质的互动体验。 \ No newline at end of file From 457b8edebac7e049a9721de42b4f75317b3f22f2 Mon Sep 17 00:00:00 2001 From: kelzr Date: Thu, 18 May 2023 16:44:38 +0800 Subject: [PATCH 04/11] [LSS] wip --- .../Live-stream Shopping/api-sequence.wsd | 63 +++++ .../integration-android.md | 236 +++++++++++++++++- markdown/Live-stream Shopping/overview.md | 5 +- 3 files changed, 291 insertions(+), 13 deletions(-) create mode 100644 markdown/Live-stream Shopping/api-sequence.wsd diff --git a/markdown/Live-stream Shopping/api-sequence.wsd b/markdown/Live-stream Shopping/api-sequence.wsd new file mode 100644 index 00000000000..6af9ceeb3a6 --- /dev/null +++ b/markdown/Live-stream Shopping/api-sequence.wsd @@ -0,0 +1,63 @@ +@startuml +autonumber +title 电商直播 API 调用时序图 +participant "声网 RTC SDK" as sdk +participant "电商直播 App" as app #White +participant "声网云服务\n(SyncManager)" as cloud +app -> cloud: 获取房间列表 +activate cloud +cloud -->> app: 显示房间列表 +deactivate cloud +== 创建直播间以本地预览直播 == +app -> sdk: create +app -> sdk: setupLocalVideo +app -> sdk: startPreview +app -> cloud: 创建房间 +activate cloud +cloud -->> app: 创建房间成功 +deactivate cloud +app -> sdk: stopPreview +app -> sdk: destory +== 加入直播间 == +app -> cloud: 加入房间 +activate cloud +cloud -->> app: 加入房间成功 +deactivate cloud +app -> cloud: 订阅收到礼物事件 +app -> cloud: 订阅聊天消息事件 +app -> cloud: 订阅用户加入和退出直播间事件 +app -> cloud: 订阅 PK 连麦邀请事件 +app -> sdk: create +app -> sdk: enableVideo +app -> sdk: setupLocalVideo(主播调用) +app -> sdk: setupRemoteVideo(观众调用) +app -> sdk: joinChannel +sdk --> app: onJoinChannelSuccess +== 上架/下架商品 == +app -> cloud: 上架商品 +app -> cloud: 下架商品 +cloud --> app: 商品上架通知 +cloud --> app: 商品下架通知 +== 主播 PK 连麦 == +app -> cloud: 主播 A 发起 PK +cloud --> app: 主播 B 收到 PK 邀请 +app -> cloud: 主播 B 接受 PK 邀请 +cloud --> app: 主播 A 和主播 B 开始 PK +app -> sdk: joinChannelEx(主播加入对方频道) +sdk --> app: onUserJoined +app -> sdk: setupRemoteVideoEx(主播渲染对方的视频) +app -> cloud: 主播 A 和主播 B 结束 PK +cloud --> app: 主播 A 和主播 B 结束 PK +app -> sdk: leaveChannelEx(主播退出对方频道) +== 退出直播间 == +app -> cloud: 主播退出房间 +activate cloud +cloud --> app: 通知所有观众房间已关闭 +deactivate cloud +app -> cloud: 观众退出房间 +activate cloud +cloud --> app: 通知所有观众和主播房间内减少 1 名用户 +deactivate cloud +app -> sdk: leaveChannel +app -> sdk: destroy +@enduml \ No newline at end of file diff --git a/markdown/Live-stream Shopping/integration-android.md b/markdown/Live-stream Shopping/integration-android.md index e6cc7daa1d3..2ca1723b970 100644 --- a/markdown/Live-stream Shopping/integration-android.md +++ b/markdown/Live-stream Shopping/integration-android.md @@ -1,14 +1,230 @@ -## 方案概览 +本文介绍如何实现电商直播场景。 -你可以在教师端和学生端集成[声网 SDK](https://docs.agora.io/cn/Agora%20Platform/terms?platform=All%20Platforms#agora-rtc-sdk)、[声网 RTM SDK](https://docs.agora.io/cn/Agora%20Platform/terms?platform=All%20Platform#agora-rtm-sdk)、[声网互动白板 SDK](https://docs.agora.io/cn/whiteboard/landing-page?platform=Android),并使用[声网云端录制服务](https://docs.agora.io/cn/Agora%20Platform/terms?platform=All%20Platform#cloud-recording)来搭建一对 N 在线小班课场景。 +## 示例项目 -![](https://web-cdn.agora.io/docs-files/1677221469890) +声网在 [Agora-Scenario-Examples](https://github.com/AgoraIO-Usecase/Agora-Scenario-Examples/tree/main) 仓库中提供[电商直播](https://github.com/AgoraIO-Usecase/Agora-Scenario-Examples/tree/main/Android/modules/Shopping)源代码供你参考。 -各 SDK 或服务实现的功能如下: +## 业务流程图 -|声网产品 | 实现功能 | -| :----------------- | :--------------------------------------------------- | -|[声网 SDK](https://docs.agora.io/cn/Video/product_video) | 加入 RTC 频道,进行实时音视频互动。 | -|[声网 RTM SDK](https://docs.agora.io/cn/Real-time-Messaging/product_rtm) | 登录 RTM 系统并加入 RTM 频道,实现收发实时文字消息。 | -|[声网互动白板服务](https://docs.agora.io/cn/whiteboard/product_whiteboard) | 实现互动白板相关功能。 | -|[声网云端录制服务](https://docs.agora.io/cn/cloud-recording/product_cloud_recording) | 录制实时音视频、录制完成后即时回放。 | \ No newline at end of file +本节介绍电商直播涉及到的通用业务流程,包含主播和观众的实时音视频互动、主播之间的跨直播间 PK 连麦。 + +### 实时互动 + +![](https://web-cdn.agora.io/docs-files/1684397470563) + +### PK 连麦 + +![](https://web-cdn.agora.io/docs-files/1684397483079) + + +## 准备开发环境 + +### 前提条件 + +- Android Studio 4.1 以上版本。 +- Android API 级别 16 或以上。 +- 两台运行 Android 4.1 或以上版本的移动设备。 +- 可以访问互联网的计算机。确保你的网络环境没有部署防火墙,否则无法正常使用声网服务。 +- 有效的[声网账户](https://console.agora.io/)和声网项目,请参考[开始使用声网平台](https://docs.agora.io/cn/Agora%20Platform/get_appid_token?platform=All%20Platforms),从声网控制台获取以下信息: + - App ID:声网随机生成的字符串,用于识别你的 app。 + - 临时 Token:你的 app 客户端加入频道时会使用 Token 对用户进行鉴权。临时 Token 的有效期为 24 小时。 + - 频道名称:用于标识直播频道的字符串。 + +### 创建项目 + +按照以下步骤准备开发环境: + +1. 如需创建新项目,在 **Android Studio** 里,依次选择 **Phone and Tablet > Empty Activity**,创建 [Android 项目](https://developer.android.com/studio/projects/create-project)。 + +
创建项目后,Android Studio 会自动开始同步 gradle, 稍等片刻至同步成功后再进行下一步操作。
+ +2. 使用 Maven Central 将声网视频 SDK 集成到你的项目中。 + + a. 在 `/Gradle Scripts/build.gradle(Project: )` 文件中添加如下代码,添加 Maven Central 依赖: + + ```java + buildscript { + repositories { + ... + mavenCentral() + } + ... + } + + allprojects { + repositories { + ... + mavenCentral() + } + } + ``` + +
如果你的 Android 项目设置了 dependencyResolutionManagement,添加 Maven Central 依赖的方式可能存在差异。
+ + b. 在 `/Gradle Scripts/build.gradle(Module: .app)` 文件中添加如下代码,将声网视频 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. 添加网络及设备权限。 + + 在 `/app/Manifests/AndroidManifest.xml` 文件中,在 `` 后面添加如下权限: + + ```xml + + + + + + + + + + + + + ``` + +4. 在 `/Gradle Scripts/proguard-rules.pro` 文件中添加如下行,以防止声网 SDK 的代码被混淆: + + ```java + -keep class io.agora.**{*;} + ``` + +## 实现电商直播 + +本节介绍集成电商直播的 API 时序和关键步骤。 + +
声网云服务为内部自研服务,暂不对外提供。声网建议你参考文档自行实现相似的一套服务。如需协助,请提交工单
+ + + + +### 预览直播 + + +```java +try { + rtcEngine = RtcEngine.create(this, getString(R.string.rtc_app_id), new IRtcEngineEventHandler() {}); + FrameLayout surfaceViewContainer = findViewById(R.id.surface_view_container); + SurfaceView videoView = new SurfaceView(this); + surfaceViewContainer.removeAllViews(); + surfaceViewContainer.addView(videoView); + rtcEngine.setupLocalVideo(new VideoCanvas(videoView, Constants.RENDER_MODE_HIDDEN)); + rtcEngine.startPreview(); +} catch (Exception e) { + e.printStackTrace(); +} +``` + +### 加入直播间 + +```java +try { + rtcEngine = (RtcEngineEx) RtcEngine.create(this, getString(R.string.rtc_app_id), new IRtcEngineEventHandler() { + ... + }); + rtcEngine.enableVideo(); + rtcEngine.enableAudio(); + + rtcEngine.setChannelProfile(Constants.CHANNEL_PROFILE_LIVE_BROADCASTING); + + // Room owner render local video + SurfaceView videoView = new SurfaceView(this); + mBinding.localVideoContainer.removeAllViews(); + mBinding.localVideoContainer.addView(videoView); + rtcEngine.setupLocalVideo(new VideoCanvas(videoView, Constants.RENDER_MODE_HIDDEN)); + + // Audience render remote video + SurfaceView videoView = new SurfaceView(AudienceDetailActivity.this); + mBinding.localVideoContainer.removeAllViews(); + mBinding.localVideoContainer.addView(videoView); + rtcEngine.setupRemoteVideo(new VideoCanvas(videoView, Constants.RENDER_MODE_HIDDEN, uid)); + + // join channel + ChannelMediaOptions options = new ChannelMediaOptions(); + options.clientRoleType = Constants.CLIENT_ROLE_BROADCASTER; + options.publishMicrophoneTrack = true; + options.publishCameraTrack = true; + options.autoSubscribeVideo = true; + options.autoSubscribeAudio = true; + int uid = Integer.parseInt(RoomManager.getCacheUserId()); + TokenGenerator.gen(this, roomInfo.roomId, uid, ret -> rtcEngine.joinChannel(ret, roomInfo.roomId, uid, options)); +} catch (Exception e) { + e.printStackTrace(); +} +``` + +### 开始 PK 连麦 + +```java +exChannelConnection = new RtcConnection(); +exChannelConnection.localUid = new Random(System.currentTimeMillis()).nextInt(1000) + 10000; +exChannelConnection.channelId = exChannelId; +rtcEngine.setVideoEncoderConfigurationEx(io.agora.scene.shopping.Constants.encoderConfiguration, exChannelConnection); +options = new ChannelMediaOptions(); +options.clientRoleType = Constants.CLIENT_ROLE_AUDIENCE; +options.autoSubscribeAudio = true; +options.autoSubscribeVideo = true; +TokenGenerator.gen(this, exChannelConnection.channelId, exChannelConnection.localUid, new TokenGenerator.OnTokenGenCallback() { + @Override + public void onTokenGen(String ret) { + rtcEngine.joinChannelEx(ret, exChannelConnection, options, new IRtcEngineEventHandler() { + @Override + public void onUserJoined(int uid, int elapsed) { + super.onUserJoined(uid, elapsed); + runOnUiThread(() -> { + mBinding.pkVideoContainer.setVisibility(View.VISIBLE); + mBinding.ivPkIcon.setVisibility(View.VISIBLE); + mBinding.btnStopPk.setVisibility(View.VISIBLE); + SurfaceView videoView = new SurfaceView(HostDetailActivity.this); + mBinding.pkVideoContainer.removeAllViews(); + mBinding.pkVideoContainer.addView(videoView); + rtcEngine.setupRemoteVideoEx(new VideoCanvas(videoView, Constants.RENDER_MODE_HIDDEN, uid), exChannelConnection); + }); + } + @Override + public void onUserOffline(int uid, int reason) { + super.onUserOffline(uid, reason); + runOnUiThread(() -> { + mBinding.pkVideoContainer.setVisibility(View.GONE); + mBinding.pkVideoContainer.removeAllViews(); + mBinding.ivPkIcon.setVisibility(View.GONE); + mBinding.btnStopPk.setVisibility(View.GONE); + endPK(); + }); + } + }); + } +``` + +### 结束 PK 连麦 + +```java +mBinding.pkVideoContainer.setVisibility(View.GONE); +mBinding.pkVideoContainer.removeAllViews(); +mBinding.ivPkIcon.setVisibility(View.GONE); +mBinding.btnStopPk.setVisibility(View.GONE); +if (exChannelConnection != null) { + rtcEngine.leaveChannelEx(exChannelConnection); + exChannelConnection = null; +} +``` + +### 退出直播间 + +```java +if (exChannelConnection != null) { + rtcEngine.leaveChannelEx(exChannelConnection); + exChannelConnection = null; +} +rtcEngine.leaveChannel(); +RtcEngine.destroy(); +``` \ No newline at end of file diff --git a/markdown/Live-stream Shopping/overview.md b/markdown/Live-stream Shopping/overview.md index 871a7cf55c0..fbc8b1e249f 100644 --- a/markdown/Live-stream Shopping/overview.md +++ b/markdown/Live-stream Shopping/overview.md @@ -16,12 +16,11 @@ ## 技术方案 -声网使用声网 RTC SDK、声网云服务共同搭建电商直播场景: +声网使用声网 RTC SDK、声网云服务(SyncManager)共同搭建电商直播场景: -- RTC SDK:让用户加入 RTC 频道,进行实时音视频互动。 +- RTC SDK:让用户加入 RTC 频道,进行实时音视频互动和 PK 连麦。 - 云服务:让用户收发文字消息、礼物、上下架商品、发起上麦邀请等。 -
声网云服务为内部自研服务,暂不对外提供。声网建议你参考文档自行实现相似的一套服务。如需协助,请提交工单
![](https://web-cdn.agora.io/docs-files/1683774790711) From 15f5b4f6ce64dbb8871d3f6fb1069256064401ad Mon Sep 17 00:00:00 2001 From: kelzr Date: Thu, 18 May 2023 18:50:19 +0800 Subject: [PATCH 05/11] [LSS] wip --- .../Live-stream Shopping/api-sequence.wsd | 4 +- .../integration-android.md | 46 +++++++++++++++++-- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/markdown/Live-stream Shopping/api-sequence.wsd b/markdown/Live-stream Shopping/api-sequence.wsd index 6af9ceeb3a6..f2961b9c9fe 100644 --- a/markdown/Live-stream Shopping/api-sequence.wsd +++ b/markdown/Live-stream Shopping/api-sequence.wsd @@ -43,9 +43,9 @@ app -> cloud: 主播 A 发起 PK cloud --> app: 主播 B 收到 PK 邀请 app -> cloud: 主播 B 接受 PK 邀请 cloud --> app: 主播 A 和主播 B 开始 PK -app -> sdk: joinChannelEx(主播加入对方频道) +app -> sdk: joinChannelEx(主播和观众加入对方主播房间) sdk --> app: onUserJoined -app -> sdk: setupRemoteVideoEx(主播渲染对方的视频) +app -> sdk: setupRemoteVideoEx(主播和观众渲染对方主播的视频) app -> cloud: 主播 A 和主播 B 结束 PK cloud --> app: 主播 A 和主播 B 结束 PK app -> sdk: leaveChannelEx(主播退出对方频道) diff --git a/markdown/Live-stream Shopping/integration-android.md b/markdown/Live-stream Shopping/integration-android.md index 2ca1723b970..6a168f68552 100644 --- a/markdown/Live-stream Shopping/integration-android.md +++ b/markdown/Live-stream Shopping/integration-android.md @@ -109,15 +109,24 @@ ### 预览直播 +调用如下方法,创建直播间并开启本地预览: + +- create +- setupLocalVideo +- startPreview + ```java try { + // 创建 RtcEngine 引擎 rtcEngine = RtcEngine.create(this, getString(R.string.rtc_app_id), new IRtcEngineEventHandler() {}); FrameLayout surfaceViewContainer = findViewById(R.id.surface_view_container); SurfaceView videoView = new SurfaceView(this); surfaceViewContainer.removeAllViews(); surfaceViewContainer.addView(videoView); + // 开启本地视频 rtcEngine.setupLocalVideo(new VideoCanvas(videoView, Constants.RENDER_MODE_HIDDEN)); + // 开启本地预览 rtcEngine.startPreview(); } catch (Exception e) { e.printStackTrace(); @@ -126,29 +135,40 @@ try { ### 加入直播间 +你可以使用声网 RTC SDK 的 create 方法创建一个 RtcEngine 引擎,再通过 joinChannel 和 setChannelProfile 方法让用户加入一个频道场景为 LIVE_BROADCASTING 的频道。频道意味着电商直播业务中的直播间。用户在频道内可以进行实时音视频互动。RTC 频道内的用户有两种角色: + +- 主播:可以发送和接收音视频流。直播间的房主即为主播。 +- 观众:只可以接收音视频流。 + +你需要在主播端渲染本地视频,在观众端渲染远端视频(即主播的视频)。 + ```java try { + // 创建 RtcEngine 引擎 rtcEngine = (RtcEngineEx) RtcEngine.create(this, getString(R.string.rtc_app_id), new IRtcEngineEventHandler() { ... }); + + // 开启视频和音频 rtcEngine.enableVideo(); rtcEngine.enableAudio(); + // 设置频道场景为直播 rtcEngine.setChannelProfile(Constants.CHANNEL_PROFILE_LIVE_BROADCASTING); - // Room owner render local video + // 主播端渲染本地视频 SurfaceView videoView = new SurfaceView(this); mBinding.localVideoContainer.removeAllViews(); mBinding.localVideoContainer.addView(videoView); rtcEngine.setupLocalVideo(new VideoCanvas(videoView, Constants.RENDER_MODE_HIDDEN)); - // Audience render remote video + // 观众端渲染远端视频,即渲染主播的视频 SurfaceView videoView = new SurfaceView(AudienceDetailActivity.this); mBinding.localVideoContainer.removeAllViews(); mBinding.localVideoContainer.addView(videoView); rtcEngine.setupRemoteVideo(new VideoCanvas(videoView, Constants.RENDER_MODE_HIDDEN, uid)); - // join channel + // 加入频道 ChannelMediaOptions options = new ChannelMediaOptions(); options.clientRoleType = Constants.CLIENT_ROLE_BROADCASTER; options.publishMicrophoneTrack = true; @@ -164,18 +184,33 @@ try { ### 开始 PK 连麦 + +房主跨直播间 PK 连麦意味着不同频道内的主播加入对方频道进行连麦。当房间内用户收到房主 PK 连麦的信令消息后,房间内用户的代码逻辑如下: + +- 房间 A,即频道 A: + - 房主 A 通过 joinChannelEx 加入频道 B,并且设置订阅频道 B 内音视频流,但不发送音视频流。同时通过 setupRemoteVideoEx 渲染频道 B 中主播的视频。 + - 观众通过 joinChannelEx 加入频道 B,并且设置订阅频道 B 内音视频流,但不发送音视频流。同时通过 setupRemoteVideoEx 渲染频道 B 中主播的视频。 +- 房间 B,即频道 B: + - 房主 B 通过 joinChannelEx 加入频道 B,并且设置订阅频道 B 内音视频流,但不发送音视频流。同时通过 setupRemoteVideoEx 渲染频道 A 中主播的视频。 + - 观众通过 joinChannelEx 加入频道 B,并且设置订阅频道 B 内音视频流,但不发送音视频流。同时通过 setupRemoteVideoEx 渲染频道 A 中主播的视频。 + +总结来说,观众可以同时接受房间 A 和 B 的直播流,因此可以同时看到两个房间的房主。房主仅在自己的房间发流,在对方的房间内不发流仅收流,因此,房主可以在对方房间看到对方。 + + ```java exChannelConnection = new RtcConnection(); exChannelConnection.localUid = new Random(System.currentTimeMillis()).nextInt(1000) + 10000; exChannelConnection.channelId = exChannelId; rtcEngine.setVideoEncoderConfigurationEx(io.agora.scene.shopping.Constants.encoderConfiguration, exChannelConnection); options = new ChannelMediaOptions(); +// 加入对方频道时,订阅音视频流,但是不发送音视频流 options.clientRoleType = Constants.CLIENT_ROLE_AUDIENCE; options.autoSubscribeAudio = true; options.autoSubscribeVideo = true; TokenGenerator.gen(this, exChannelConnection.channelId, exChannelConnection.localUid, new TokenGenerator.OnTokenGenCallback() { @Override public void onTokenGen(String ret) { + // 加入对方频道以 PK 连麦 rtcEngine.joinChannelEx(ret, exChannelConnection, options, new IRtcEngineEventHandler() { @Override public void onUserJoined(int uid, int elapsed) { @@ -187,6 +222,7 @@ TokenGenerator.gen(this, exChannelConnection.channelId, exChannelConnection.loca SurfaceView videoView = new SurfaceView(HostDetailActivity.this); mBinding.pkVideoContainer.removeAllViews(); mBinding.pkVideoContainer.addView(videoView); + // 渲染对方房主的视频 rtcEngine.setupRemoteVideoEx(new VideoCanvas(videoView, Constants.RENDER_MODE_HIDDEN, uid), exChannelConnection); }); } @@ -207,6 +243,8 @@ TokenGenerator.gen(this, exChannelConnection.channelId, exChannelConnection.loca ### 结束 PK 连麦 +结束 PK 连麦时,房间内用户都需要调用 leaveChannelEx 离开对方房间。 + ```java mBinding.pkVideoContainer.setVisibility(View.GONE); mBinding.pkVideoContainer.removeAllViews(); @@ -220,6 +258,8 @@ if (exChannelConnection != null) { ### 退出直播间 +退出直播间时,房间内用户都需要调用 leaveChannel 离开房间。如果不再加入房间,还可以调用 destroy 销毁房间。 + ```java if (exChannelConnection != null) { rtcEngine.leaveChannelEx(exChannelConnection); From 1bd522793e542e6bbedf9ec0f5865461ec7754af Mon Sep 17 00:00:00 2001 From: kelzr Date: Fri, 19 May 2023 18:38:28 +0800 Subject: [PATCH 06/11] [LSS] android done --- .../Live-stream Shopping/api-sequence.wsd | 2 +- .../integration-android.md | 50 ++++++++++--------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/markdown/Live-stream Shopping/api-sequence.wsd b/markdown/Live-stream Shopping/api-sequence.wsd index f2961b9c9fe..37d3de1d8a7 100644 --- a/markdown/Live-stream Shopping/api-sequence.wsd +++ b/markdown/Live-stream Shopping/api-sequence.wsd @@ -48,7 +48,7 @@ sdk --> app: onUserJoined app -> sdk: setupRemoteVideoEx(主播和观众渲染对方主播的视频) app -> cloud: 主播 A 和主播 B 结束 PK cloud --> app: 主播 A 和主播 B 结束 PK -app -> sdk: leaveChannelEx(主播退出对方频道) +app -> sdk: leaveChannelEx(主播和观众退出对方频道) == 退出直播间 == app -> cloud: 主播退出房间 activate cloud diff --git a/markdown/Live-stream Shopping/integration-android.md b/markdown/Live-stream Shopping/integration-android.md index 6a168f68552..638bc80af0d 100644 --- a/markdown/Live-stream Shopping/integration-android.md +++ b/markdown/Live-stream Shopping/integration-android.md @@ -10,10 +10,14 @@ ### 实时互动 +房主进入直播间,开始上架商品,进行电商直播。用户可以查看商品列表进行下单。 + ![](https://web-cdn.agora.io/docs-files/1684397470563) ### PK 连麦 +房主邀请另一个房间的房主开始 PK 连麦。用户可以看到两个房主 PK 连麦直播的画面。 + ![](https://web-cdn.agora.io/docs-files/1684397483079) @@ -68,7 +72,7 @@ dependencies { ... // x.y.z,请填写具体的 SDK 版本号,如:4.0.0 或 4.1.0-1。 - // 通过发版说明获取最新版本号。 + // 通过互动直播产品发版说明获取最新版本号。 implementation 'io.agora.rtc:full-sdk:x.y.z' } ``` @@ -100,20 +104,19 @@ ## 实现电商直播 -本节介绍集成电商直播的 API 时序和关键步骤。 +如下时序图中展示了如何预览直播、加入直播间、上下架商品、PK 连麦、退出直播间。声网 RTC SDK 承担实时音视频的业务,声网云服务承担信令消息的业务。本节会详细介绍如何调用 RTC SDK 的 API 完成这些逻辑,但是信令消息的逻辑需要你参考时序图自行实现。
声网云服务为内部自研服务,暂不对外提供。声网建议你参考文档自行实现相似的一套服务。如需协助,请提交工单
- +![](https://web-cdn.agora.io/docs-files/1684484123337) +### 1. 预览直播 -### 预览直播 +房主进入直播间前一般需要预览本地直播视频。你可以调用如下方法,创建 `RtcEngine` 引擎并开启本地视频预览: -调用如下方法,创建直播间并开启本地预览: - -- create -- setupLocalVideo -- startPreview +- [`create`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_create): 创建 RtcEngine 引擎。 +- [`setupLocalVideo`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_video_process.html#api_irtcengine_setuplocalvideo): 初始化本地视图。 +- [`startPreview`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_video_process.html#api_irtcengine_startpreview): 开启视频预览。 ```java @@ -133,9 +136,9 @@ try { } ``` -### 加入直播间 +### 2. 加入直播间 -你可以使用声网 RTC SDK 的 create 方法创建一个 RtcEngine 引擎,再通过 joinChannel 和 setChannelProfile 方法让用户加入一个频道场景为 LIVE_BROADCASTING 的频道。频道意味着电商直播业务中的直播间。用户在频道内可以进行实时音视频互动。RTC 频道内的用户有两种角色: +你可以使用声网 RTC SDK 的 [`create`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_create) 方法创建一个 RtcEngine 引擎,再通过 [`joinChannel`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_joinchannel2) 和 [`setChannelProfile`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_setchannelprofile) 方法让用户加入一个频道场景为 `LIVE_BROADCASTING` 的频道。频道对应直播间中的音视频,云服务对应直播间中的信令消息。用户在频道内可以进行实时音视频互动。频道内的用户有两种角色: - 主播:可以发送和接收音视频流。直播间的房主即为主播。 - 观众:只可以接收音视频流。 @@ -182,19 +185,18 @@ try { } ``` -### 开始 PK 连麦 - +### 3. 开始 PK 连麦 房主跨直播间 PK 连麦意味着不同频道内的主播加入对方频道进行连麦。当房间内用户收到房主 PK 连麦的信令消息后,房间内用户的代码逻辑如下: -- 房间 A,即频道 A: - - 房主 A 通过 joinChannelEx 加入频道 B,并且设置订阅频道 B 内音视频流,但不发送音视频流。同时通过 setupRemoteVideoEx 渲染频道 B 中主播的视频。 - - 观众通过 joinChannelEx 加入频道 B,并且设置订阅频道 B 内音视频流,但不发送音视频流。同时通过 setupRemoteVideoEx 渲染频道 B 中主播的视频。 -- 房间 B,即频道 B: - - 房主 B 通过 joinChannelEx 加入频道 B,并且设置订阅频道 B 内音视频流,但不发送音视频流。同时通过 setupRemoteVideoEx 渲染频道 A 中主播的视频。 - - 观众通过 joinChannelEx 加入频道 B,并且设置订阅频道 B 内音视频流,但不发送音视频流。同时通过 setupRemoteVideoEx 渲染频道 A 中主播的视频。 +- 房间 A: + - 房主 A 通过 [`joinChannelEx`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_multi_channel.html#api_irtcengineex_joinchannelex) 加入频道 B,并且设置订阅频道 B 内音视频流,但不发送音视频流。同时通过 [`setupRemoteVideoEx`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_multi_channel.html#api_irtcengineex_setupremotevideoex) 渲染频道 B 中主播的视频。 + - 观众通过 `joinChannelEx` 加入频道 B,并且设置订阅频道 B 内音视频流,但不发送音视频流。同时通过 `setupRemoteVideoEx` 渲染频道 B 中主播的视频。 +- 房间 B: + - 房主 B 通过 `joinChannelEx` 加入频道 A,并且设置订阅频道 A 内音视频流,但不发送音视频流。同时通过 `setupRemoteVideoEx` 渲染频道 A 中主播的视频。 + - 观众通过 `joinChannelEx` 加入频道 A,并且设置订阅频道 A 内音视频流,但不发送音视频流。同时通过 `setupRemoteVideoEx` 渲染频道 A 中主播的视频。 -总结来说,观众可以同时接受房间 A 和 B 的直播流,因此可以同时看到两个房间的房主。房主仅在自己的房间发流,在对方的房间内不发流仅收流,因此,房主可以在对方房间看到对方。 +完成这些逻辑后,观众可以同时接收频道 A 和 B 的音视频流,因此可以同时看到两个房间的房主。房主仅在自己的频道发流,在对方的频道内不发流仅收流,因此,房主可以(在对方频道)看到对方,达到连麦的效果。 ```java @@ -241,9 +243,9 @@ TokenGenerator.gen(this, exChannelConnection.channelId, exChannelConnection.loca } ``` -### 结束 PK 连麦 +### 4. 结束 PK 连麦 -结束 PK 连麦时,房间内用户都需要调用 leaveChannelEx 离开对方房间。 +结束 PK 连麦时,房间内用户都需要调用 `leaveChannelEx` 离开对方频道。 ```java mBinding.pkVideoContainer.setVisibility(View.GONE); @@ -256,9 +258,9 @@ if (exChannelConnection != null) { } ``` -### 退出直播间 +### 5. 退出直播间 -退出直播间时,房间内用户都需要调用 leaveChannel 离开房间。如果不再加入房间,还可以调用 destroy 销毁房间。 +直播结束,所有用户退出直播间时都需要调用 [`leaveChannel`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_leavechannel) 离开频道。如果不再加入房间,还可以调用 [`destroy`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_release) 销毁 `RtcEngine` 引擎。 ```java if (exChannelConnection != null) { From 6366222a6c5ed85774840a33191a4653ab705a3e Mon Sep 17 00:00:00 2001 From: kelzr Date: Mon, 22 May 2023 16:51:59 +0800 Subject: [PATCH 07/11] [LSS] ios wip --- .../Live-stream Shopping/api-sequence-ios.wsd | 63 +++++++ .../integration-android.md | 2 +- .../Live-stream Shopping/integration-ios.md | 174 ++++++++++++++++++ 3 files changed, 238 insertions(+), 1 deletion(-) create mode 100644 markdown/Live-stream Shopping/api-sequence-ios.wsd diff --git a/markdown/Live-stream Shopping/api-sequence-ios.wsd b/markdown/Live-stream Shopping/api-sequence-ios.wsd new file mode 100644 index 00000000000..96ecffdc0b5 --- /dev/null +++ b/markdown/Live-stream Shopping/api-sequence-ios.wsd @@ -0,0 +1,63 @@ +@startuml +autonumber +title 电商直播 API 调用时序图 +participant "声网 RTC SDK" as sdk +participant "电商直播 App" as app #White +participant "声网云服务\n(SyncManager)" as cloud +app -> cloud: 获取房间列表 +activate cloud +cloud -->> app: 显示房间列表 +deactivate cloud +== 创建直播间以本地预览直播 == +app -> sdk: sharedEngineWithConfig +app -> sdk: setupLocalVideo +app -> sdk: startPreview +app -> cloud: 创建房间 +activate cloud +cloud -->> app: 创建房间成功 +deactivate cloud +app -> sdk: stopPreview +app -> sdk: destory +== 加入直播间 == +app -> cloud: 加入房间 +activate cloud +cloud -->> app: 加入房间成功 +deactivate cloud +app -> cloud: 订阅收到礼物事件 +app -> cloud: 订阅聊天消息事件 +app -> cloud: 订阅用户加入和退出直播间事件 +app -> cloud: 订阅 PK 连麦邀请事件 +app -> sdk: sharedEngineWithConfig +app -> sdk: enableVideo +app -> sdk: setupLocalVideo(主播调用) +app -> sdk: setupRemoteVideo(观众调用) +app -> sdk: joinChannelByToken +sdk --> app: didJoinChannel +== 上架/下架商品 == +app -> cloud: 上架商品 +app -> cloud: 下架商品 +cloud --> app: 商品上架通知 +cloud --> app: 商品下架通知 +== 主播 PK 连麦 == +app -> cloud: 主播 A 发起 PK +cloud --> app: 主播 B 收到 PK 邀请 +app -> cloud: 主播 B 接受 PK 邀请 +cloud --> app: 主播 A 和主播 B 开始 PK +app -> sdk: joinChannelExByToken(主播和观众加入对方主播房间) +sdk --> app: didJoinedOfUid +app -> sdk: setupRemoteVideoEx(主播和观众渲染对方主播的视频) +app -> cloud: 主播 A 和主播 B 结束 PK +cloud --> app: 主播 A 和主播 B 结束 PK +app -> sdk: leaveChannelEx(主播和观众退出对方频道) +== 退出直播间 == +app -> cloud: 主播退出房间 +activate cloud +cloud --> app: 通知所有观众房间已关闭 +deactivate cloud +app -> cloud: 观众退出房间 +activate cloud +cloud --> app: 通知所有观众和主播房间内减少 1 名用户 +deactivate cloud +app -> sdk: leaveChannel +app -> sdk: destroy +@enduml \ No newline at end of file diff --git a/markdown/Live-stream Shopping/integration-android.md b/markdown/Live-stream Shopping/integration-android.md index 638bc80af0d..45d7a1f51aa 100644 --- a/markdown/Live-stream Shopping/integration-android.md +++ b/markdown/Live-stream Shopping/integration-android.md @@ -245,7 +245,7 @@ TokenGenerator.gen(this, exChannelConnection.channelId, exChannelConnection.loca ### 4. 结束 PK 连麦 -结束 PK 连麦时,房间内用户都需要调用 `leaveChannelEx` 离开对方频道。 +结束 PK 连麦时,房间内用户都需要调用 [`leaveChannelEx`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_multi_channel.html#api_irtcengineex_leavechannelex) 离开对方频道。 ```java mBinding.pkVideoContainer.setVisibility(View.GONE); diff --git a/markdown/Live-stream Shopping/integration-ios.md b/markdown/Live-stream Shopping/integration-ios.md index e69de29bb2d..cb32f895c4b 100644 --- a/markdown/Live-stream Shopping/integration-ios.md +++ b/markdown/Live-stream Shopping/integration-ios.md @@ -0,0 +1,174 @@ +本文介绍如何实现电商直播场景。 + +## 示例项目 + +声网在 [Agora-Scenario-Examples](https://github.com/AgoraIO-Usecase/Agora-Scenario-Examples/tree/main) 仓库中提供[电商直播](https://github.com/AgoraIO-Usecase/Agora-Scenario-Examples/tree/main/iOS/Agora%20Scenarios/Scenes/Shopping)源代码供你参考。 + +## 业务流程图 + +本节介绍电商直播涉及到的通用业务流程,包含主播和观众的实时音视频互动、主播之间的跨直播间 PK 连麦。 + +### 实时互动 + +房主进入直播间,开始上架商品,进行电商直播。用户可以查看商品列表进行下单。 + +![](https://web-cdn.agora.io/docs-files/1684397470563) + +### PK 连麦 + +房主邀请另一个房间的房主开始 PK 连麦。用户可以看到两个房主 PK 连麦直播的画面。 + +![](https://web-cdn.agora.io/docs-files/1684397483079) + + +## 准备开发环境 + +### 前提条件 + + + +### 创建项目 + + + +## 实现电商直播 + +如下时序图中展示了如何预览直播、加入直播间、上下架商品、PK 连麦、退出直播间。声网 RTC SDK 承担实时音视频的业务,声网云服务承担信令消息的业务。本节会详细介绍如何调用 RTC SDK 的 API 完成这些逻辑,但是信令消息的逻辑需要你参考时序图自行实现。 + +
声网云服务为内部自研服务,暂不对外提供。声网建议你参考文档自行实现相似的一套服务。如需协助,请提交工单
+ +![](https://web-cdn.agora.io/docs-files/1684744943721) + +### 1. 预览直播 + +房主进入直播间前一般需要预览本地直播视频。你可以调用如下方法,创建 `RtcEngine` 引擎并开启本地视频预览: + +- [`create`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_create): 创建 RtcEngine 引擎。 +- [`setupLocalVideo`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_video_process.html#api_irtcengine_setuplocalvideo): 初始化本地视图。 +- [`startPreview`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_video_process.html#api_irtcengine_startpreview): 开启视频预览。 + + +```swift +// 创建 RtcEngine 引擎 +agoraKit = AgoraRtcEngineKit.sharedEngine(with: rtcEngineConfig, delegate: self) +agoraKit?.setClientRole(getRole(uid: currentUserId)) +// 开启视频 +agoraKit?.enableVideo() +agoraKit?.enableAudio() +agoraKit?.setDefaultAudioRouteToSpeakerphone(true) +// 开启本地预览 +agoraKit?.startPreview() +``` + +### 2. 加入直播间 #TODO 为什么是 joinChannelEx 不是非 Ex + +你可以使用声网 RTC SDK 的 [`create`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_create) 方法创建一个 RtcEngine 引擎,再通过 [`joinChannel`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_joinchannel2) 和 [`setChannelProfile`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_setchannelprofile) 方法让用户加入一个频道场景为 `LIVE_BROADCASTING` 的频道。频道对应直播间中的音视频,云服务对应直播间中的信令消息。用户在频道内可以进行实时音视频互动。频道内的用户有两种角色: + +- 主播:可以发送和接收音视频流。直播间的房主即为主播。 +- 观众:只可以接收音视频流。 + +你需要在主播端渲染本地视频,在观众端渲染远端视频(即主播的视频)。 + +```swift +let connection = AgoraRtcConnection() +connection.channelId = channelName +connection.localUid = uid + +let channelMediaOptions = AgoraRtcChannelMediaOptions() +channelMediaOptions.clientRoleType = .broadcaster +channelMediaOptions.publishMicrophoneTrack = true +channelMediaOptions.publishCameraTrack = true +channelMediaOptions.autoSubscribeVideo = true +channelMediaOptions.autoSubscribeAudio = true + +// 加入频道 +let joinResult = agoraKit?.joinChannelEx(byToken: KeyCenter.Token, connection: connection, delegate: self, mediaOptions: channelMediaOptions, joinSuccess: nil) +if joinResult != 0 { + print("join fail") + return +} + +// 主播端渲染本地视频 +let canvas = AgoraRtcVideoCanvas() +canvas.uid = uid +canvas.renderMode = .hidden +agoraKit?.setupLocalVideo(canvas) + + +// 观众端渲染远端视频,即渲染主播的视频 +let canvas = AgoraRtcVideoCanvas() +canvas.uid = remoteUid +canvas.renderMode = .hidden + + +let remoteConnection = AgoraRtcConnection() +remoteConnection.channelId = channelName +remoteConnection.localUid = uid +agoraKit?.setupRemoteVideoEx(canvas, connection: remoteConnection) +``` + +### 3. 开始 PK 连麦 + +房主跨直播间 PK 连麦意味着不同频道内的主播加入对方频道进行连麦。当房间内用户收到房主 PK 连麦的信令消息后,房间内用户的代码逻辑如下: + +- 房间 A: + - 房主 A 通过 [`joinChannelEx`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_multi_channel.html#api_irtcengineex_joinchannelex) 加入频道 B,并且设置订阅频道 B 内音视频流,但不发送音视频流。同时通过 [`setupRemoteVideoEx`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_multi_channel.html#api_irtcengineex_setupremotevideoex) 渲染频道 B 中主播的视频。 + - 观众通过 `joinChannelEx` 加入频道 B,并且设置订阅频道 B 内音视频流,但不发送音视频流。同时通过 `setupRemoteVideoEx` 渲染频道 B 中主播的视频。 +- 房间 B: + - 房主 B 通过 `joinChannelEx` 加入频道 A,并且设置订阅频道 A 内音视频流,但不发送音视频流。同时通过 `setupRemoteVideoEx` 渲染频道 A 中主播的视频。 + - 观众通过 `joinChannelEx` 加入频道 A,并且设置订阅频道 A 内音视频流,但不发送音视频流。同时通过 `setupRemoteVideoEx` 渲染频道 A 中主播的视频。 + +完成这些逻辑后,观众可以同时接收频道 A 和 B 的音视频流,因此可以同时看到两个房间的房主。房主仅在自己的频道发流,在对方的频道内不发流仅收流,因此,房主可以(在对方频道)看到对方,达到连麦的效果。 + + +```swift +let connection = AgoraRtcConnection() +connection.channelId = channelName +connection.localUid = uid + +// 加入对方频道时,订阅音视频流,但是不发送音视频流 +let channelMediaOptions = AgoraRtcChannelMediaOptions() +channelMediaOptions.clientRoleType = .audience +channelMediaOptions.publishMicrophoneTrack = false +channelMediaOptions.publishCameraTrack = false +channelMediaOptions.autoSubscribeVideo = true +channelMediaOptions.autoSubscribeAudio = true + +// 加入对方频道以 PK 连麦 +let joinResult = agoraKit?.joinChannelEx(byToken: KeyCenter.Token, connection: connection, delegate: self, mediaOptions: channelMediaOptions, joinSuccess: nil) +if joinResult != 0 { + print("join fail") + return +} + + +// 渲染对方房主的视频 +let canvas = AgoraRtcVideoCanvas() +canvas.uid = remoteUid +canvas.renderMode = .hidden + +let remoteConnection = AgoraRtcConnection() +remoteConnection.channelId = channelName +remoteConnection.localUid = uid +agoraKit?.setupRemoteVideoEx(canvas, connection: remoteConnection) +``` + +### 4. 结束 PK 连麦 + +结束 PK 连麦时,房间内用户都需要调用 [`leaveChannelEx`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_multi_channel.html#api_irtcengineex_leavechannelex) 离开对方频道。 + +```swift +let connection = AgoraRtcConnection() +connection.channelId = channelName +connection.localUid = uid +agoraKit?.leaveChannelEx(connection, leaveChannelBlock: nil) +``` + +### 5. 退出直播间 + +直播结束,所有用户退出直播间时都需要调用 [`leaveChannel`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_leavechannel) 离开频道。如果不再加入房间,还可以调用 [`destroy`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_release) 销毁 `RtcEngine` 引擎。 + +```swift +agoraKit?.leaveChannel() +AgoraRtcEngineKit.destroy() +``` \ No newline at end of file From 8295c994a1d857a25c28f31660c62b0ddd29f574 Mon Sep 17 00:00:00 2001 From: kelzr Date: Mon, 22 May 2023 16:58:06 +0800 Subject: [PATCH 08/11] [LSS] wip --- markdown/Live-stream Shopping/integration-android.md | 4 ++-- markdown/Live-stream Shopping/integration-ios.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/markdown/Live-stream Shopping/integration-android.md b/markdown/Live-stream Shopping/integration-android.md index 45d7a1f51aa..568169b4b2b 100644 --- a/markdown/Live-stream Shopping/integration-android.md +++ b/markdown/Live-stream Shopping/integration-android.md @@ -114,7 +114,7 @@ 房主进入直播间前一般需要预览本地直播视频。你可以调用如下方法,创建 `RtcEngine` 引擎并开启本地视频预览: -- [`create`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_create): 创建 RtcEngine 引擎。 +- [`create`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_create): 创建 `RtcEngine` 引擎。 - [`setupLocalVideo`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_video_process.html#api_irtcengine_setuplocalvideo): 初始化本地视图。 - [`startPreview`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_video_process.html#api_irtcengine_startpreview): 开启视频预览。 @@ -138,7 +138,7 @@ try { ### 2. 加入直播间 -你可以使用声网 RTC SDK 的 [`create`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_create) 方法创建一个 RtcEngine 引擎,再通过 [`joinChannel`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_joinchannel2) 和 [`setChannelProfile`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_setchannelprofile) 方法让用户加入一个频道场景为 `LIVE_BROADCASTING` 的频道。频道对应直播间中的音视频,云服务对应直播间中的信令消息。用户在频道内可以进行实时音视频互动。频道内的用户有两种角色: +你可以使用声网 RTC SDK 的 [`create`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_create) 方法创建一个 `RtcEngine` 引擎,再通过 [`joinChannel`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_joinchannel2) 和 [`setChannelProfile`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_setchannelprofile) 方法让用户加入一个频道场景为 `LIVE_BROADCASTING` 的频道。频道对应直播间中的音视频,云服务对应直播间中的信令消息。用户在频道内可以进行实时音视频互动。频道内的用户有两种角色: - 主播:可以发送和接收音视频流。直播间的房主即为主播。 - 观众:只可以接收音视频流。 diff --git a/markdown/Live-stream Shopping/integration-ios.md b/markdown/Live-stream Shopping/integration-ios.md index cb32f895c4b..7a46d6ea6ba 100644 --- a/markdown/Live-stream Shopping/integration-ios.md +++ b/markdown/Live-stream Shopping/integration-ios.md @@ -43,7 +43,7 @@ 房主进入直播间前一般需要预览本地直播视频。你可以调用如下方法,创建 `RtcEngine` 引擎并开启本地视频预览: -- [`create`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_create): 创建 RtcEngine 引擎。 +- [`create`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_create): 创建 `RtcEngine` 引擎。 - [`setupLocalVideo`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_video_process.html#api_irtcengine_setuplocalvideo): 初始化本地视图。 - [`startPreview`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_video_process.html#api_irtcengine_startpreview): 开启视频预览。 @@ -62,7 +62,7 @@ agoraKit?.startPreview() ### 2. 加入直播间 #TODO 为什么是 joinChannelEx 不是非 Ex -你可以使用声网 RTC SDK 的 [`create`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_create) 方法创建一个 RtcEngine 引擎,再通过 [`joinChannel`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_joinchannel2) 和 [`setChannelProfile`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_setchannelprofile) 方法让用户加入一个频道场景为 `LIVE_BROADCASTING` 的频道。频道对应直播间中的音视频,云服务对应直播间中的信令消息。用户在频道内可以进行实时音视频互动。频道内的用户有两种角色: +你可以使用声网 RTC SDK 的 [`create`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_create) 方法创建一个 `RtcEngine` 引擎,再通过 [`joinChannel`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_joinchannel2) 和 [`setChannelProfile`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_setchannelprofile) 方法让用户加入一个频道场景为 `LIVE_BROADCASTING` 的频道。频道对应直播间中的音视频,云服务对应直播间中的信令消息。用户在频道内可以进行实时音视频互动。频道内的用户有两种角色: - 主播:可以发送和接收音视频流。直播间的房主即为主播。 - 观众:只可以接收音视频流。 From ed1a61f44c29a5455f1d2ce2bc20deba0e2bea81 Mon Sep 17 00:00:00 2001 From: kelzr Date: Mon, 22 May 2023 17:15:12 +0800 Subject: [PATCH 09/11] [LSS] wip --- .../Live-stream Shopping/integration-ios.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/markdown/Live-stream Shopping/integration-ios.md b/markdown/Live-stream Shopping/integration-ios.md index 7a46d6ea6ba..be48c78dc82 100644 --- a/markdown/Live-stream Shopping/integration-ios.md +++ b/markdown/Live-stream Shopping/integration-ios.md @@ -41,15 +41,15 @@ ### 1. 预览直播 -房主进入直播间前一般需要预览本地直播视频。你可以调用如下方法,创建 `RtcEngine` 引擎并开启本地视频预览: +房主进入直播间前一般需要预览本地直播视频。你可以调用如下方法,创建 `AgoraRtcEngineKit` 并开启本地视频预览: -- [`create`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_create): 创建 `RtcEngine` 引擎。 -- [`setupLocalVideo`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_video_process.html#api_irtcengine_setuplocalvideo): 初始化本地视图。 -- [`startPreview`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_video_process.html#api_irtcengine_startpreview): 开启视频预览。 +- [`sharedEngineWithConfig`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/ios_ng/API/toc_core_method.html#api_irtcengine_initialize): 创建 `AgoraRtcEngineKit`。 +- [`setupLocalVideo`](): 初始化本地视图。#TODO enableVideo?时序图是否要改? +- [`startPreview`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/ios_ng/API/toc_video_process.html#api_irtcengine_startpreview): 开启视频预览。 ```swift -// 创建 RtcEngine 引擎 +// 创建 AgoraRtcEngineKit agoraKit = AgoraRtcEngineKit.sharedEngine(with: rtcEngineConfig, delegate: self) agoraKit?.setClientRole(getRole(uid: currentUserId)) // 开启视频 @@ -62,7 +62,7 @@ agoraKit?.startPreview() ### 2. 加入直播间 #TODO 为什么是 joinChannelEx 不是非 Ex -你可以使用声网 RTC SDK 的 [`create`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_create) 方法创建一个 `RtcEngine` 引擎,再通过 [`joinChannel`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_joinchannel2) 和 [`setChannelProfile`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_setchannelprofile) 方法让用户加入一个频道场景为 `LIVE_BROADCASTING` 的频道。频道对应直播间中的音视频,云服务对应直播间中的信令消息。用户在频道内可以进行实时音视频互动。频道内的用户有两种角色: +你可以使用声网 RTC SDK 的 [`sharedEngineWithConfig`]() 方法创建一个 `AgoraRtcEngineKit`,再通过 [`joinChannel`]() 和 [`setChannelProfile`]() 方法让用户加入一个频道场景为 `LiveBroadcasting` 的频道。频道对应直播间中的音视频,云服务对应直播间中的信令消息。用户在频道内可以进行实时音视频互动。频道内的用户有两种角色:#TODO 这里和 Android 不同 - 主播:可以发送和接收音视频流。直播间的房主即为主播。 - 观众:只可以接收音视频流。 @@ -112,7 +112,7 @@ agoraKit?.setupRemoteVideoEx(canvas, connection: remoteConnection) 房主跨直播间 PK 连麦意味着不同频道内的主播加入对方频道进行连麦。当房间内用户收到房主 PK 连麦的信令消息后,房间内用户的代码逻辑如下: - 房间 A: - - 房主 A 通过 [`joinChannelEx`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_multi_channel.html#api_irtcengineex_joinchannelex) 加入频道 B,并且设置订阅频道 B 内音视频流,但不发送音视频流。同时通过 [`setupRemoteVideoEx`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_multi_channel.html#api_irtcengineex_setupremotevideoex) 渲染频道 B 中主播的视频。 + - 房主 A 通过 [`joinChannelEx`]() 加入频道 B,并且设置订阅频道 B 内音视频流,但不发送音视频流。同时通过 [`setupRemoteVideoEx`]() 渲染频道 B 中主播的视频。 - 观众通过 `joinChannelEx` 加入频道 B,并且设置订阅频道 B 内音视频流,但不发送音视频流。同时通过 `setupRemoteVideoEx` 渲染频道 B 中主播的视频。 - 房间 B: - 房主 B 通过 `joinChannelEx` 加入频道 A,并且设置订阅频道 A 内音视频流,但不发送音视频流。同时通过 `setupRemoteVideoEx` 渲染频道 A 中主播的视频。 @@ -155,7 +155,7 @@ agoraKit?.setupRemoteVideoEx(canvas, connection: remoteConnection) ### 4. 结束 PK 连麦 -结束 PK 连麦时,房间内用户都需要调用 [`leaveChannelEx`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_multi_channel.html#api_irtcengineex_leavechannelex) 离开对方频道。 +结束 PK 连麦时,房间内用户都需要调用 [`leaveChannelEx`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/ios_ng/API/toc_multi_channel.html#api_irtcengineex_leavechannelex) 离开对方频道。 ```swift let connection = AgoraRtcConnection() @@ -166,7 +166,7 @@ agoraKit?.leaveChannelEx(connection, leaveChannelBlock: nil) ### 5. 退出直播间 -直播结束,所有用户退出直播间时都需要调用 [`leaveChannel`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_leavechannel) 离开频道。如果不再加入房间,还可以调用 [`destroy`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_release) 销毁 `RtcEngine` 引擎。 +直播结束,所有用户退出直播间时都需要调用 [`leaveChannel`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/ios_ng/API/toc_core_method.html#api_irtcengine_leavechannel) 离开频道。如果不再加入房间,还可以调用 [`destroy`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/ios_ng/API/toc_core_method.html#api_irtcengine_release) 销毁 `AgoraRtcEngineKit`。 ```swift agoraKit?.leaveChannel() From ebc9e3a6a61af00d416f30481b5a6c8a66953200 Mon Sep 17 00:00:00 2001 From: kelzr Date: Mon, 22 May 2023 17:24:31 +0800 Subject: [PATCH 10/11] [LSS] wip --- markdown/Live-stream Shopping/integration-android.md | 2 +- markdown/Live-stream Shopping/integration-ios.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/markdown/Live-stream Shopping/integration-android.md b/markdown/Live-stream Shopping/integration-android.md index 568169b4b2b..4aa5d873806 100644 --- a/markdown/Live-stream Shopping/integration-android.md +++ b/markdown/Live-stream Shopping/integration-android.md @@ -143,7 +143,7 @@ try { - 主播:可以发送和接收音视频流。直播间的房主即为主播。 - 观众:只可以接收音视频流。 -你需要在主播端渲染本地视频,在观众端渲染远端视频(即主播的视频)。 +你需要调用 `setupLocalVideo` 在主播端渲染本地视频,调用 `setupRemoteVideo` 在观众端渲染远端视频(即主播的视频)。#TODO add link ```java try { diff --git a/markdown/Live-stream Shopping/integration-ios.md b/markdown/Live-stream Shopping/integration-ios.md index be48c78dc82..04302302d8b 100644 --- a/markdown/Live-stream Shopping/integration-ios.md +++ b/markdown/Live-stream Shopping/integration-ios.md @@ -67,7 +67,7 @@ agoraKit?.startPreview() - 主播:可以发送和接收音视频流。直播间的房主即为主播。 - 观众:只可以接收音视频流。 -你需要在主播端渲染本地视频,在观众端渲染远端视频(即主播的视频)。 +你需要调用 `setupLocalVideo` 在主播端渲染本地视频,调用 `setupRemoteVideo` 在观众端渲染远端视频(即主播的视频)。#TODO 这里和 Android 不同 ```swift let connection = AgoraRtcConnection() From 12f4168ca54e496a1cc3faf83c662659ad9cadf7 Mon Sep 17 00:00:00 2001 From: kelzr Date: Tue, 23 May 2023 18:09:11 +0800 Subject: [PATCH 11/11] [LSS] wip --- markdown/Live-stream Shopping/integration-android.md | 6 ++++-- markdown/Live-stream Shopping/integration-ios.md | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/markdown/Live-stream Shopping/integration-android.md b/markdown/Live-stream Shopping/integration-android.md index 4aa5d873806..56388c1ef55 100644 --- a/markdown/Live-stream Shopping/integration-android.md +++ b/markdown/Live-stream Shopping/integration-android.md @@ -100,11 +100,13 @@ ```java -keep class io.agora.**{*;} + -dontwarn javax.** + -dontwarn com.google.devtools.build.android.** ``` ## 实现电商直播 -如下时序图中展示了如何预览直播、加入直播间、上下架商品、PK 连麦、退出直播间。声网 RTC SDK 承担实时音视频的业务,声网云服务承担信令消息的业务。本节会详细介绍如何调用 RTC SDK 的 API 完成这些逻辑,但是信令消息的逻辑需要你参考时序图自行实现。 +如下时序图中展示了如何预览直播、加入直播间、上下架商品、PK 连麦、退出直播间。声网 RTC SDK 承担实时音视频的业务,声网云服务承担信令消息和数据存储的业务。本节会详细介绍如何调用 RTC SDK 的 API 完成这些逻辑,但是信令消息的逻辑需要你参考时序图自行实现。
声网云服务为内部自研服务,暂不对外提供。声网建议你参考文档自行实现相似的一套服务。如需协助,请提交工单
@@ -138,7 +140,7 @@ try { ### 2. 加入直播间 -你可以使用声网 RTC SDK 的 [`create`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_create) 方法创建一个 `RtcEngine` 引擎,再通过 [`joinChannel`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_joinchannel2) 和 [`setChannelProfile`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_setchannelprofile) 方法让用户加入一个频道场景为 `LIVE_BROADCASTING` 的频道。频道对应直播间中的音视频,云服务对应直播间中的信令消息。用户在频道内可以进行实时音视频互动。频道内的用户有两种角色: +你可以使用声网 RTC SDK 的 [`create`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_create) 方法创建一个 `RtcEngine` 引擎,再通过 [`joinChannel`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_joinchannel2) 和 [`setChannelProfile`](https://docportal.shengwang.cn/cn/live-streaming-premium-4.x/API%20Reference/java_ng/API/toc_core_method.html#api_irtcengine_setchannelprofile) 方法让用户加入一个频道场景为 `LIVE_BROADCASTING` 的频道。频道用于传输直播间中的音视频流,云服务用于传输直播间中的信令消息和存储数据。用户在频道内可以进行实时音视频互动。频道内的用户有两种角色: - 主播:可以发送和接收音视频流。直播间的房主即为主播。 - 观众:只可以接收音视频流。 diff --git a/markdown/Live-stream Shopping/integration-ios.md b/markdown/Live-stream Shopping/integration-ios.md index 04302302d8b..20e29840506 100644 --- a/markdown/Live-stream Shopping/integration-ios.md +++ b/markdown/Live-stream Shopping/integration-ios.md @@ -33,7 +33,7 @@ ## 实现电商直播 -如下时序图中展示了如何预览直播、加入直播间、上下架商品、PK 连麦、退出直播间。声网 RTC SDK 承担实时音视频的业务,声网云服务承担信令消息的业务。本节会详细介绍如何调用 RTC SDK 的 API 完成这些逻辑,但是信令消息的逻辑需要你参考时序图自行实现。 +如下时序图中展示了如何预览直播、加入直播间、上下架商品、PK 连麦、退出直播间。声网 RTC SDK 承担实时音视频的业务,声网云服务承担信令消息和数据存储的业务。本节会详细介绍如何调用 RTC SDK 的 API 完成这些逻辑,但是信令消息的逻辑需要你参考时序图自行实现。
声网云服务为内部自研服务,暂不对外提供。声网建议你参考文档自行实现相似的一套服务。如需协助,请提交工单
@@ -62,7 +62,7 @@ agoraKit?.startPreview() ### 2. 加入直播间 #TODO 为什么是 joinChannelEx 不是非 Ex -你可以使用声网 RTC SDK 的 [`sharedEngineWithConfig`]() 方法创建一个 `AgoraRtcEngineKit`,再通过 [`joinChannel`]() 和 [`setChannelProfile`]() 方法让用户加入一个频道场景为 `LiveBroadcasting` 的频道。频道对应直播间中的音视频,云服务对应直播间中的信令消息。用户在频道内可以进行实时音视频互动。频道内的用户有两种角色:#TODO 这里和 Android 不同 +你可以使用声网 RTC SDK 的 [`sharedEngineWithConfig`]() 方法创建一个 `AgoraRtcEngineKit`,再通过 [`joinChannel`]() 和 [`setChannelProfile`]() 方法让用户加入一个频道场景为 `LiveBroadcasting` 的频道。频道用于传输直播间中的音视频流,云服务用于传输直播间中的信令消息和存储数据。用户在频道内可以进行实时音视频互动。频道内的用户有两种角色:#TODO 这里和 Android 不同 - 主播:可以发送和接收音视频流。直播间的房主即为主播。 - 观众:只可以接收音视频流。