diff --git a/Group-Video/OpenVideoCall-Android/README.md b/Group-Video/OpenVideoCall-Android/README.md
index 48113b77..ed60f8d7 100755
--- a/Group-Video/OpenVideoCall-Android/README.md
+++ b/Group-Video/OpenVideoCall-Android/README.md
@@ -39,6 +39,10 @@ To build and run the sample application, get an App ID:
<#YOUR TOKEN#>
```
+> To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+>
+> Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
+
### Integrate the Agora Video SDK
The SDK must be integrated into the sample project before it can opened and built. There are two methods for integrating the Agora Video SDK into the sample project. The first method uses JCenter to automatically integrate the SDK files. The second method requires you to manually copy the SDK files to the project.
@@ -69,7 +73,7 @@ Copy from SDK|Copy to Project Folder
**x86** folder|**/app/src/main/jniLibs** folder
**armeabi-v7a** folder|**/app/src/main/jniLibs** folder
-
+
### Run the Application
diff --git a/Group-Video/OpenVideoCall-Android/README.zh.md b/Group-Video/OpenVideoCall-Android/README.zh.md
index cf0d4596..54a41040 100644
--- a/Group-Video/OpenVideoCall-Android/README.zh.md
+++ b/Group-Video/OpenVideoCall-Android/README.zh.md
@@ -40,6 +40,10 @@
<#YOUR TOKEN#>
```
+> 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+>
+> 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
+
### 集成 Agora 视频 SDK
集成方式有以下两种:
diff --git a/Group-Video/OpenVideoCall-Android/app/src/main/AndroidManifest.xml b/Group-Video/OpenVideoCall-Android/app/src/main/AndroidManifest.xml
index 1bd900d8..86144710 100644
--- a/Group-Video/OpenVideoCall-Android/app/src/main/AndroidManifest.xml
+++ b/Group-Video/OpenVideoCall-Android/app/src/main/AndroidManifest.xml
@@ -7,7 +7,6 @@
-
0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, ConstantApp.PERMISSION_REQ_ID_WRITE_EXTERNAL_STORAGE);
permissionGranted();
} else {
finish();
}
break;
}
- case ConstantApp.PERMISSION_REQ_ID_WRITE_EXTERNAL_STORAGE: {
- if (grantResults.length > 0
- && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- } else {
- finish();
- }
- break;
- }
}
}
diff --git a/Group-Video/OpenVideoCall-Android/app/src/main/java/io/agora/openvcall/ui/CallActivity.java b/Group-Video/OpenVideoCall-Android/app/src/main/java/io/agora/openvcall/ui/CallActivity.java
index 47787fd1..d79c2022 100644
--- a/Group-Video/OpenVideoCall-Android/app/src/main/java/io/agora/openvcall/ui/CallActivity.java
+++ b/Group-Video/OpenVideoCall-Android/app/src/main/java/io/agora/openvcall/ui/CallActivity.java
@@ -524,6 +524,7 @@ public void onMixingAudioClicked(View view) {
@Override
public void onUserJoined(int uid) {
log.debug("onUserJoined " + (uid & 0xFFFFFFFFL));
+ doRenderRemoteUi(uid);
runOnUiThread(new Runnable() {
@Override
@@ -537,7 +538,6 @@ public void run() {
public void onFirstRemoteVideoDecoded(int uid, int width, int height, int elapsed) {
log.debug("onFirstRemoteVideoDecoded " + (uid & 0xFFFFFFFFL) + " " + width + " " + height + " " + elapsed);
- doRenderRemoteUi(uid);
}
private void doRenderRemoteUi(final int uid) {
diff --git a/Group-Video/OpenVideoCall-Linux/README.md b/Group-Video/OpenVideoCall-Linux/README.md
index 081d19ac..3d2914de 100644
--- a/Group-Video/OpenVideoCall-Linux/README.md
+++ b/Group-Video/OpenVideoCall-Linux/README.md
@@ -1,89 +1,94 @@
-# Open Video Call Linux
-
-*Read this in other languages: [中文](README.zh.md)*
-
-The Open Video Call Linux Sample App is an open-source demo that will help you get video chat integrated directly into your Linux applications using the Agora Video SDK.
-
-With this sample app, you can:
-
-- Join / leave channel
-- Mute / unmute audio
-- Enable / disable video
-- Change camera
-- Setup resolution, frame rate and bit rate
-
-This demo is written in **C++**
-
-Agora Video SDK supports iOS / Android / Windows / macOS etc. You can find demos of these platform here:
-
-- [OpenVideoCall-Android](https://github.com/AgoraIO/Basic-Video-Call/tree/master/Group-Video/OpenVideoCall-Android)
-- [OpenVideoCall-iOS](https://github.com/AgoraIO/Basic-Video-Call/tree/master/Group-Video/OpenVideoCall-iOS)
-- [OpenVideoCall-macOS](https://github.com/AgoraIO/Basic-Video-Call/tree/master/Group-Video/OpenVideoCall-macOS)
-- [OpenVideoCall-Windows](https://github.com/AgoraIO/Basic-Video-Call/tree/master/Group-Video/OpenVideoCall-Windows)
-
-## Running the App
-First, create a developer account at [Agora.io](https://dashboard.agora.io/signin/), and obtain an App ID. set appID in run.sh
-
-```
---appId "Your app ID"
-```
-
-Next, download the **Agora Video SDK** from [Agora.io SDK](https://www.agora.io/en/blog/download/).
-Unzip the downloaded SDK package and copy
-- libagora_rtc_sdk.so
-
-to the "OpenVideoCall/libs" folder in project(the old one may be over written).
-
-configue parameters in run.sh.
-Using 'make' command to build the demo. Using ./run.sh to run demo
-openVideoCall is a commandline demo. Commands as follows:
-- open
-
- open video call
-- close
-
- close video call
-- enable_video
-
- enable/disable video, 'enable_video 0' means disable video, 'enable_video 1' means enable video
-- enable_audio
-
- enable/disable audio, 'enable_audio 0' means disable audio, 'enable_audio 1' means enable audio
-- enable_local_video
-
- enable/disable local video, 'enable_local_video 0' means disable local video(local camera), 'enable_local_video 1' means enable local video
-- mute_local_video
-
- mute/unmute local video, 'mute_local_video 0' means unmute local video(local camera), 'mute_local_video 1' means mute local video
-- mute_local_audio
-
- mute/unmute local audio, 'mute_local_audio 0' means unmute local audio(local audio device), 'mute_local_audio 1' means mute local audio
-- print_device_info
-
- print video and audio device info
-- set_cur_camera
-
- set current carmera,'set_cur_camera deviceId' you can get deviceID by print_device_info
-- exit
-
- exit app
-
-## Developer Environment Requirements
-* Ubuntu 12.04 x64 or higher
-* CentOS 7 or higher
-* gcc 4.8 or higher
-
-
-## Contact Us
-
-- For potential issues, take a look at our [FAQ](https://docs.agora.io/en/faq) first
-- Dive into [Agora SDK Samples](https://github.com/AgoraIO) to see more tutorials
-- Take a look at [Agora Use Case](https://github.com/AgoraIO-usecase) for more complicated real use case
-- Repositories managed by developer communities can be found at [Agora Community](https://github.com/AgoraIO-Community)
-- You can find full API documentation at [Document Center](https://docs.agora.io/en/)
-- If you encounter problems during integration, you can ask question in [Stack Overflow](https://stackoverflow.com/questions/tagged/agora.io)
-- You can file bugs about this sample at [issue](https://github.com/AgoraIO/Basic-Video-Call/issues)
-
-## License
-
-The MIT License (MIT).
+# Open Video Call Linux
+
+*Read this in other languages: [中文](README.zh.md)*
+
+The Open Video Call Linux Sample App is an open-source demo that will help you get video chat integrated directly into your Linux applications using the Agora Video SDK.
+
+With this sample app, you can:
+
+- Join / leave channel
+- Mute / unmute audio
+- Enable / disable video
+- Change camera
+- Setup resolution, frame rate and bit rate
+
+This demo is written in **C++**
+
+Agora Video SDK supports iOS / Android / Windows / macOS etc. You can find demos of these platform here:
+
+- [OpenVideoCall-Android](https://github.com/AgoraIO/Basic-Video-Call/tree/master/Group-Video/OpenVideoCall-Android)
+- [OpenVideoCall-iOS](https://github.com/AgoraIO/Basic-Video-Call/tree/master/Group-Video/OpenVideoCall-iOS)
+- [OpenVideoCall-macOS](https://github.com/AgoraIO/Basic-Video-Call/tree/master/Group-Video/OpenVideoCall-macOS)
+- [OpenVideoCall-Windows](https://github.com/AgoraIO/Basic-Video-Call/tree/master/Group-Video/OpenVideoCall-Windows)
+
+## Running the App
+First, create a developer account at [Agora.io](https://dashboard.agora.io/signin/), and obtain an App ID. set appID in run.sh
+
+```
+--appId "Your app ID"
+```
+
+> To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+>
+> Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
+
+Next, download the **Agora Video SDK** from [Agora.io SDK](https://www.agora.io/en/blog/download/).
+Unzip the downloaded SDK package and copy
+
+- libagora_rtc_sdk.so
+
+to the "OpenVideoCall/libs" folder in project(the old one may be over written).
+
+configue parameters in run.sh.
+Using 'make' command to build the demo. Using ./run.sh to run demo
+openVideoCall is a commandline demo. Commands as follows:
+- open
+
+ open video call
+- close
+
+ close video call
+- enable_video
+
+ enable/disable video, 'enable_video 0' means disable video, 'enable_video 1' means enable video
+- enable_audio
+
+ enable/disable audio, 'enable_audio 0' means disable audio, 'enable_audio 1' means enable audio
+- enable_local_video
+
+ enable/disable local video, 'enable_local_video 0' means disable local video(local camera), 'enable_local_video 1' means enable local video
+- mute_local_video
+
+ mute/unmute local video, 'mute_local_video 0' means unmute local video(local camera), 'mute_local_video 1' means mute local video
+- mute_local_audio
+
+ mute/unmute local audio, 'mute_local_audio 0' means unmute local audio(local audio device), 'mute_local_audio 1' means mute local audio
+- print_device_info
+
+ print video and audio device info
+- set_cur_camera
+
+ set current carmera,'set_cur_camera deviceId' you can get deviceID by print_device_info
+- exit
+
+ exit app
+
+## Developer Environment Requirements
+* Ubuntu 12.04 x64 or higher
+* CentOS 7 or higher
+* gcc 4.8 or higher
+
+
+## Contact Us
+
+- For potential issues, take a look at our [FAQ](https://docs.agora.io/en/faq) first
+- Dive into [Agora SDK Samples](https://github.com/AgoraIO) to see more tutorials
+- Take a look at [Agora Use Case](https://github.com/AgoraIO-usecase) for more complicated real use case
+- Repositories managed by developer communities can be found at [Agora Community](https://github.com/AgoraIO-Community)
+- You can find full API documentation at [Document Center](https://docs.agora.io/en/)
+- If you encounter problems during integration, you can ask question in [Stack Overflow](https://stackoverflow.com/questions/tagged/agora.io)
+- You can file bugs about this sample at [issue](https://github.com/AgoraIO/Basic-Video-Call/issues)
+
+## License
+
+The MIT License (MIT).
diff --git a/Group-Video/OpenVideoCall-Linux/README.zh.md b/Group-Video/OpenVideoCall-Linux/README.zh.md
index 5b958c10..4019782f 100644
--- a/Group-Video/OpenVideoCall-Linux/README.zh.md
+++ b/Group-Video/OpenVideoCall-Linux/README.zh.md
@@ -1,85 +1,89 @@
-# Open Video Call Linux
-
-*Read this in other languages: [English](README.md)*
-
-这个开源示例项目演示了如何快速集成Agora视频SDK,实现多人视频通话。
-
-在这个示例项目中包含了以下功能:
-
-- 加入通话和离开通话;
-- 静音和解除静音;
-- 关闭摄像头和打开摄像头;
-- 切换摄像头;
-- 选择分辨率、码率和帧率;
-
-Agora视频SDK支持 iOS / Android / Windows / macOS/ Linux 等多个平台,你可以查看对应各平台的示例项目:
-
-- [OpenVideoCall-Android](https://github.com/AgoraIO/Basic-Video-Call/tree/master/Group-Video/OpenVideoCall-Android)
-- [OpenVideoCall-Windows](https://github.com/AgoraIO/Basic-Video-Call/tree/master/Group-Video/OpenVideoCall-Windows)
-- [OpenVideoCall-macOS](https://github.com/AgoraIO/Basic-Video-Call/tree/master/Group-Video/OpenVideoCall-macOS)
-- [OpenVideoCall-iOS](https://github.com/AgoraIO/Basic-Video-Call/tree/master/Group-Video/OpenVideoCall-iOS)
-
-## 运行示例程序
-首先在 [Agora.io 注册](https://dashboard.agora.io/cn/signup/) 注册账号,并创建自己的测试项目,获取到 AppID。将 AppID 填写进 run.sh
-
-```
---appId "your app ID"
-```
-
-然后在 [Agora.io SDK](https://www.agora.io/cn/blog/download/) 下载 **视频通话 + 直播 SDK**,解压后将其中**libs**文件夹下的
-
-- libagora_rtc_sdk.so
-
-两个文件复制到本项目的 “OpenVideoCall/libs” 文件夹下。
-在sample/OpenVideoCall下 输入命令 make, 便可编译生成openVideoCall demo。在run.sh中配置执行demo所需要的参数。
-openVideoCall 为命令行程序。使用方法如下:
-command:
-- open
- 开启通话。
-- close
- 关闭通话。
-- enable_video
- 打开/关闭 全局视频功能,enable_video 0 为关闭视频功能,enable_video 1为打开视频功能
-- enable_audio
- 打开/关闭 全局音频功能
-- enable_local_video
- 打开/关闭 本地视频功能,enable_local_video 0 为关闭视频功能,enable_local_video 1为打开视频功能
-- mute_local_video
- 打开/关闭 本地视频流发送,mute_local_video 0 为打开本地视频流发送,mute_local_video 1为关闭本地视频流发送
-- mute_local_audio
- 打开/关闭 本地音频流发送,mute_local_video 0 为打开本地音频流发送,mute_local_video 1为关闭本地音频流发送
-- print_device_info
- 打印设备信息
-- set_cur_camera
- 设置当前工作的摄像头,set_cur_camera ‘device id ’ ,device id可以通过print_device_info 得到
-- print_callback
- 打开/关闭 本地回调打印,print_callback 1 为打开本地音频流发送,print_call back 0 为关闭本地音频流发送^M^M
-
-- exit
- 退出程序
-
-## 系统运行环境
-* OS:
- - Ubuntu 12.04 x64 或更高版本
- - CentOS 7 以上版本
-
-* CPU:
- - x86_64
-* Compiler:
- - gcc 4.8 and above
-
-
-## 联系我们
-
-- 如果你遇到了困难,可以先参阅 [常见问题](https://docs.agora.io/cn/faq)
-- 如果你想了解更多官方示例,可以参考 [官方SDK示例](https://github.com/AgoraIO)
-- 如果你想了解声网SDK在复杂场景下的应用,可以参考 [官方场景案例](https://github.com/AgoraIO-usecase)
-- 如果你想了解声网的一些社区开发者维护的项目,可以查看 [社区](https://github.com/AgoraIO-Community)
-- 完整的 API 文档见 [文档中心](https://docs.agora.io/cn/)
-- 若遇到问题需要开发者帮助,你可以到 [开发者社区](https://rtcdeveloper.com/) 提问
-- 如果需要售后技术支持, 你可以在 [Agora Dashboard](https://dashboard.agora.io) 提交工单
-- 如果发现了示例代码的 bug,欢迎提交 [issue](https://github.com/AgoraIO/Basic-Video-Call/issues)
-
-## 代码许可
-
-The MIT License (MIT).
+# Open Video Call Linux
+
+*Read this in other languages: [English](README.md)*
+
+这个开源示例项目演示了如何快速集成Agora视频SDK,实现多人视频通话。
+
+在这个示例项目中包含了以下功能:
+
+- 加入通话和离开通话;
+- 静音和解除静音;
+- 关闭摄像头和打开摄像头;
+- 切换摄像头;
+- 选择分辨率、码率和帧率;
+
+Agora视频SDK支持 iOS / Android / Windows / macOS/ Linux 等多个平台,你可以查看对应各平台的示例项目:
+
+- [OpenVideoCall-Android](https://github.com/AgoraIO/Basic-Video-Call/tree/master/Group-Video/OpenVideoCall-Android)
+- [OpenVideoCall-Windows](https://github.com/AgoraIO/Basic-Video-Call/tree/master/Group-Video/OpenVideoCall-Windows)
+- [OpenVideoCall-macOS](https://github.com/AgoraIO/Basic-Video-Call/tree/master/Group-Video/OpenVideoCall-macOS)
+- [OpenVideoCall-iOS](https://github.com/AgoraIO/Basic-Video-Call/tree/master/Group-Video/OpenVideoCall-iOS)
+
+## 运行示例程序
+首先在 [Agora.io 注册](https://dashboard.agora.io/cn/signup/) 注册账号,并创建自己的测试项目,获取到 AppID。将 AppID 填写进 run.sh
+
+```
+--appId "your app ID"
+```
+
+> 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+>
+> 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
+
+然后在 [Agora.io SDK](https://www.agora.io/cn/blog/download/) 下载 **视频通话 + 直播 SDK**,解压后将其中**libs**文件夹下的
+
+- libagora_rtc_sdk.so
+
+两个文件复制到本项目的 “OpenVideoCall/libs” 文件夹下。
+在sample/OpenVideoCall下 输入命令 make, 便可编译生成openVideoCall demo。在run.sh中配置执行demo所需要的参数。
+openVideoCall 为命令行程序。使用方法如下:
+command:
+- open
+ 开启通话。
+- close
+ 关闭通话。
+- enable_video
+ 打开/关闭 全局视频功能,enable_video 0 为关闭视频功能,enable_video 1为打开视频功能
+- enable_audio
+ 打开/关闭 全局音频功能
+- enable_local_video
+ 打开/关闭 本地视频功能,enable_local_video 0 为关闭视频功能,enable_local_video 1为打开视频功能
+- mute_local_video
+ 打开/关闭 本地视频流发送,mute_local_video 0 为打开本地视频流发送,mute_local_video 1为关闭本地视频流发送
+- mute_local_audio
+ 打开/关闭 本地音频流发送,mute_local_video 0 为打开本地音频流发送,mute_local_video 1为关闭本地音频流发送
+- print_device_info
+ 打印设备信息
+- set_cur_camera
+ 设置当前工作的摄像头,set_cur_camera ‘device id ’ ,device id可以通过print_device_info 得到
+- print_callback
+ 打开/关闭 本地回调打印,print_callback 1 为打开本地音频流发送,print_call back 0 为关闭本地音频流发送^M^M
+
+- exit
+ 退出程序
+
+## 系统运行环境
+* OS:
+ - Ubuntu 12.04 x64 或更高版本
+ - CentOS 7 以上版本
+
+* CPU:
+ - x86_64
+* Compiler:
+ - gcc 4.8 and above
+
+
+## 联系我们
+
+- 如果你遇到了困难,可以先参阅 [常见问题](https://docs.agora.io/cn/faq)
+- 如果你想了解更多官方示例,可以参考 [官方SDK示例](https://github.com/AgoraIO)
+- 如果你想了解声网SDK在复杂场景下的应用,可以参考 [官方场景案例](https://github.com/AgoraIO-usecase)
+- 如果你想了解声网的一些社区开发者维护的项目,可以查看 [社区](https://github.com/AgoraIO-Community)
+- 完整的 API 文档见 [文档中心](https://docs.agora.io/cn/)
+- 若遇到问题需要开发者帮助,你可以到 [开发者社区](https://rtcdeveloper.com/) 提问
+- 如果需要售后技术支持, 你可以在 [Agora Dashboard](https://dashboard.agora.io) 提交工单
+- 如果发现了示例代码的 bug,欢迎提交 [issue](https://github.com/AgoraIO/Basic-Video-Call/issues)
+
+## 代码许可
+
+The MIT License (MIT).
diff --git a/Group-Video/OpenVideoCall-Web/README.md b/Group-Video/OpenVideoCall-Web/README.md
index fb1772a6..2f42ca5c 100755
--- a/Group-Video/OpenVideoCall-Web/README.md
+++ b/Group-Video/OpenVideoCall-Web/README.md
@@ -32,6 +32,10 @@ To build and run the sample application, get an App ID:
export const Token = "<#YOUR TEMP TOKEN HERE#>";
```
+> To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+>
+> Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
+
### Install dependencies and integrate the Agora Video SDK
diff --git a/Group-Video/OpenVideoCall-Web/README.zh.md b/Group-Video/OpenVideoCall-Web/README.zh.md
index 4a594bc5..042ec488 100644
--- a/Group-Video/OpenVideoCall-Web/README.zh.md
+++ b/Group-Video/OpenVideoCall-Web/README.zh.md
@@ -31,6 +31,10 @@
export const Token = "<#YOUR TEMP TOKEN HERE#>";
```
+> 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+>
+> 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
+
### 集成 Agora 视频 SDK
1. 在Terminal中,在您的项目根目录输入`install`命令以安装项目依赖
diff --git a/Group-Video/OpenVideoCall-Windows-MFC/README.md b/Group-Video/OpenVideoCall-Windows-MFC/README.md
index 0ff181d2..4d749476 100644
--- a/Group-Video/OpenVideoCall-Windows-MFC/README.md
+++ b/Group-Video/OpenVideoCall-Windows-MFC/README.md
@@ -48,6 +48,10 @@ To build and run the sample application, get an App ID:
#define APP_ID _T("Your App ID")
```
+> To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+>
+> Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
+
### Integrate the Agora Video SDK
1. Download the **Agora Video SDK** from [Agora.io SDK](https://www.agora.io/en/blog/download/). Unzip the downloaded SDK package and copy the files under **libs\include**, to the project folder **OpenVideoCall-Windows-MFC\sdk\include** (create if not exist). Then copy the **dll** file and **lib** file under **libs\x86**, to **sdk\dll** and **sdk\lib** respectively.
diff --git a/Group-Video/OpenVideoCall-Windows-MFC/README.zh.md b/Group-Video/OpenVideoCall-Windows-MFC/README.zh.md
index c2690020..6db3d4d3 100644
--- a/Group-Video/OpenVideoCall-Windows-MFC/README.zh.md
+++ b/Group-Video/OpenVideoCall-Windows-MFC/README.zh.md
@@ -46,6 +46,10 @@ Agora 视频 SDK 支持 iOS / Android / Windows / macOS 等多个平台,你可
#define APP_ID _T("Your App ID")
```
+> 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+>
+> 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
+
### 集成 Agora 视频 SDK
1. 在 [Agora.io SDK](https://www.agora.io/cn/blog/download/) 下载 **视频通话 + 直播 SDK**,解压后将 **libs\include** 中的文件,复制到 **OpenVideoCall-Windows-MFC** 下的 **sdk\include** 文件夹下(如无该文件夹需新建)。并将 **libs\x86** 下的 **dll** 和 **lib** 文件分别复制到 **sdk\dll** 和 **sdk\lib** 文件夹下。
diff --git a/Group-Video/OpenVideoCall-Windows/README.md b/Group-Video/OpenVideoCall-Windows/README.md
index b383bf45..07a306cf 100644
--- a/Group-Video/OpenVideoCall-Windows/README.md
+++ b/Group-Video/OpenVideoCall-Windows/README.md
@@ -37,12 +37,16 @@ First, create a developer account at [Agora.io](https://dashboard.agora.io/signi
* #define APP_ID _T("Your App ID")
+> To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+>
+> Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
+
Next, download the **Agora Video SDK** from [Agora.io SDK](https://www.agora.io/en/download/). Unzip the downloaded SDK package and copy the **sdk** to the project folder(the old one may be over written).
Finally, Open OpenVideoCall.pro with your Qt5.6(or higher) and build current project and run.
* If you don't fill appid in the code file,you can place a file named AgoraConfigOpenVideoCall.ini in the executable path.The file content:
-
+
[BaseInfo]
AppId=xxxx
diff --git a/Group-Video/OpenVideoCall-Windows/README.zh.md b/Group-Video/OpenVideoCall-Windows/README.zh.md
index c32a0aa5..ae74bcbd 100644
--- a/Group-Video/OpenVideoCall-Windows/README.zh.md
+++ b/Group-Video/OpenVideoCall-Windows/README.zh.md
@@ -37,6 +37,10 @@ Agora 视频 SDK 支持 iOS / Android / Windows / macOS 等多个平台,你可
* #define APP_ID _T("Your App ID")
+> 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+>
+> 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
+
然后在 [Agora.io SDK](https://www.agora.io/cn/download/) 下载 **视频通话 + 直播 SDK**,并解压SDK包,将 **libs** 文件夹复制到项目文件夹(旧文件夹可能会被覆盖)。最后使用 QT5.6 打开 OpenVideoCall.pro,编译整个解决方案即可运行
* 如果不在代码里填写appid,也可以在运行目录下放置一个AgoraConfigOpenVideoCall.ini文件,文件内容:
diff --git a/Group-Video/OpenVideoCall-iOS-Objective-C/OpenVideoCall.xcodeproj/project.pbxproj b/Group-Video/OpenVideoCall-iOS-Objective-C/OpenVideoCall.xcodeproj/project.pbxproj
index 13438b22..0cb6c3b9 100644
--- a/Group-Video/OpenVideoCall-iOS-Objective-C/OpenVideoCall.xcodeproj/project.pbxproj
+++ b/Group-Video/OpenVideoCall-iOS-Objective-C/OpenVideoCall.xcodeproj/project.pbxproj
@@ -3,16 +3,10 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 46;
+ objectVersion = 52;
objects = {
/* Begin PBXBuildFile section */
- 03CE910325436185009945C0 /* Agorafdkaac.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03CE90FE2543616C009945C0 /* Agorafdkaac.framework */; };
- 03CE910425436185009945C0 /* Agorafdkaac.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 03CE90FE2543616C009945C0 /* Agorafdkaac.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
- 03CE910525436185009945C0 /* Agoraffmpeg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03CE90FF2543616C009945C0 /* Agoraffmpeg.framework */; };
- 03CE910625436185009945C0 /* Agoraffmpeg.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 03CE90FF2543616C009945C0 /* Agoraffmpeg.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
- 03CE910725436186009945C0 /* AgoraSoundTouch.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03CE90FD2543616C009945C0 /* AgoraSoundTouch.framework */; };
- 03CE910825436186009945C0 /* AgoraSoundTouch.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 03CE90FD2543616C009945C0 /* AgoraSoundTouch.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
076C59771DDDBC3500F813E2 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 076C59761DDDBC3500F813E2 /* main.m */; };
076C597A1DDDBC3500F813E2 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 076C59791DDDBC3500F813E2 /* AppDelegate.m */; };
076C59821DDDBC3500F813E2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 076C59811DDDBC3500F813E2 /* Assets.xcassets */; };
@@ -28,11 +22,22 @@
3832FA5F227FC9DA00E50E69 /* FileCenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 3832FA5E227FC9DA00E50E69 /* FileCenter.m */; };
3832FA67227FF94300E50E69 /* Them.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 3832FA66227FF94200E50E69 /* Them.mp3 */; };
38EF7E902368269600A6A483 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 38EF7E8F2368269600A6A483 /* README.md */; };
+ 8B4B011A26088A06004EF20F /* AgoraSoundTouch.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B4B011326088A05004EF20F /* AgoraSoundTouch.xcframework */; };
+ 8B4B012126088DFD004EF20F /* AgoraAIDenoiseExtension.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B4B011726088A06004EF20F /* AgoraAIDenoiseExtension.xcframework */; };
+ 8B4B012226088DFD004EF20F /* AgoraAIDenoiseExtension.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B4B011726088A06004EF20F /* AgoraAIDenoiseExtension.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 8B4B012426088DFE004EF20F /* AgoraCore.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B4B011226088A05004EF20F /* AgoraCore.xcframework */; };
+ 8B4B012526088DFE004EF20F /* AgoraCore.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B4B011226088A05004EF20F /* AgoraCore.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 8B4B012626088DFF004EF20F /* AgoraDav1dExtension.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B4B011526088A05004EF20F /* AgoraDav1dExtension.xcframework */; };
+ 8B4B012726088DFF004EF20F /* AgoraDav1dExtension.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B4B011526088A05004EF20F /* AgoraDav1dExtension.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 8B4B012826088E00004EF20F /* Agorafdkaac.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B4B011626088A05004EF20F /* Agorafdkaac.xcframework */; };
+ 8B4B012926088E00004EF20F /* Agorafdkaac.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B4B011626088A05004EF20F /* Agorafdkaac.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 8B4B012A26088E01004EF20F /* Agoraffmpeg.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B4B011826088A06004EF20F /* Agoraffmpeg.xcframework */; };
+ 8B4B012B26088E02004EF20F /* Agoraffmpeg.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B4B011826088A06004EF20F /* Agoraffmpeg.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 8B4B012C26088E03004EF20F /* AgoraRtcKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B4B011426088A05004EF20F /* AgoraRtcKit.xcframework */; };
+ 8B4B012D26088E03004EF20F /* AgoraRtcKit.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B4B011426088A05004EF20F /* AgoraRtcKit.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
A7327ECE1FC7B5E300882882 /* Encryption.m in Sources */ = {isa = PBXBuildFile; fileRef = A7327ECD1FC7B5E300882882 /* Encryption.m */; };
A7327ED41FC7C7DB00882882 /* MessageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = A7327ED31FC7C7DB00882882 /* MessageCell.m */; };
A7327ED71FC7C7EE00882882 /* Message.m in Sources */ = {isa = PBXBuildFile; fileRef = A7327ED61FC7C7EE00882882 /* Message.m */; };
- A79114A0246D127400E77A35 /* AgoraRtcKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A76C26C5238684C20047E150 /* AgoraRtcKit.framework */; };
- A79114A1246D127400E77A35 /* AgoraRtcKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A76C26C5238684C20047E150 /* AgoraRtcKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
A7FB1B6222A638500027986E /* Settings.m in Sources */ = {isa = PBXBuildFile; fileRef = A7FB1B6122A638500027986E /* Settings.m */; };
A7FB1B6822A640680027986E /* CommonExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = A7FB1B6722A640680027986E /* CommonExtension.m */; };
A7FB1B6B22A6437B0027986E /* MediaCharater.m in Sources */ = {isa = PBXBuildFile; fileRef = A7FB1B6A22A6437B0027986E /* MediaCharater.m */; };
@@ -44,16 +49,18 @@
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
- A791149F246D127300E77A35 /* Embed Frameworks */ = {
+ 8B4B012326088DFD004EF20F /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
- A79114A1246D127400E77A35 /* AgoraRtcKit.framework in Embed Frameworks */,
- 03CE910625436185009945C0 /* Agoraffmpeg.framework in Embed Frameworks */,
- 03CE910425436185009945C0 /* Agorafdkaac.framework in Embed Frameworks */,
- 03CE910825436186009945C0 /* AgoraSoundTouch.framework in Embed Frameworks */,
+ 8B4B012726088DFF004EF20F /* AgoraDav1dExtension.xcframework in Embed Frameworks */,
+ 8B4B012226088DFD004EF20F /* AgoraAIDenoiseExtension.xcframework in Embed Frameworks */,
+ 8B4B012926088E00004EF20F /* Agorafdkaac.xcframework in Embed Frameworks */,
+ 8B4B012526088DFE004EF20F /* AgoraCore.xcframework in Embed Frameworks */,
+ 8B4B012B26088E02004EF20F /* Agoraffmpeg.xcframework in Embed Frameworks */,
+ 8B4B012D26088E03004EF20F /* AgoraRtcKit.xcframework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
@@ -61,9 +68,6 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
- 03CE90FD2543616C009945C0 /* AgoraSoundTouch.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AgoraSoundTouch.framework; sourceTree = ""; };
- 03CE90FE2543616C009945C0 /* Agorafdkaac.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Agorafdkaac.framework; sourceTree = ""; };
- 03CE90FF2543616C009945C0 /* Agoraffmpeg.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Agoraffmpeg.framework; sourceTree = ""; };
076C59721DDDBC3500F813E2 /* OpenVideoCall.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OpenVideoCall.app; sourceTree = BUILT_PRODUCTS_DIR; };
076C59761DDDBC3500F813E2 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
076C59781DDDBC3500F813E2 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
@@ -101,6 +105,13 @@
385F305A2122CB13005D5301 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
38D619352250BF34004A6C87 /* CoreML.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreML.framework; path = System/Library/Frameworks/CoreML.framework; sourceTree = SDKROOT; };
38EF7E8F2368269600A6A483 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; };
+ 8B4B011226088A05004EF20F /* AgoraCore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = AgoraCore.xcframework; sourceTree = ""; };
+ 8B4B011326088A05004EF20F /* AgoraSoundTouch.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = AgoraSoundTouch.xcframework; sourceTree = ""; };
+ 8B4B011426088A05004EF20F /* AgoraRtcKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = AgoraRtcKit.xcframework; sourceTree = ""; };
+ 8B4B011526088A05004EF20F /* AgoraDav1dExtension.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = AgoraDav1dExtension.xcframework; sourceTree = ""; };
+ 8B4B011626088A05004EF20F /* Agorafdkaac.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = Agorafdkaac.xcframework; sourceTree = ""; };
+ 8B4B011726088A06004EF20F /* AgoraAIDenoiseExtension.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = AgoraAIDenoiseExtension.xcframework; sourceTree = ""; };
+ 8B4B011826088A06004EF20F /* Agoraffmpeg.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = Agoraffmpeg.xcframework; sourceTree = ""; };
A7327ECC1FC7B5E300882882 /* Encryption.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Encryption.h; sourceTree = ""; };
A7327ECD1FC7B5E300882882 /* Encryption.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Encryption.m; sourceTree = ""; };
A7327ED21FC7C7DB00882882 /* MessageCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MessageCell.h; sourceTree = ""; };
@@ -109,7 +120,6 @@
A7327ED61FC7C7EE00882882 /* Message.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Message.m; sourceTree = ""; };
A76C26C5238684C20047E150 /* AgoraRtcKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraRtcKit.framework; path = OpenVideoCall/AgoraRtcKit.framework; sourceTree = ""; };
A76C26C6238684C20047E150 /* AgoraRtcCryptoLoader.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraRtcCryptoLoader.framework; path = OpenVideoCall/AgoraRtcCryptoLoader.framework; sourceTree = ""; };
- A76C26CD238684CB0047E150 /* AgoraRtcKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AgoraRtcKit.framework; sourceTree = ""; };
A7733D6324079BEF00483870 /* libcrypto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcrypto.a; path = OpenVideoCall/libcrypto.a; sourceTree = ""; };
A7733D6B24079C2B00483870 /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; };
A7FB1B6022A638500027986E /* Settings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Settings.h; sourceTree = ""; };
@@ -134,10 +144,13 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 03CE910525436185009945C0 /* Agoraffmpeg.framework in Frameworks */,
- A79114A0246D127400E77A35 /* AgoraRtcKit.framework in Frameworks */,
- 03CE910325436185009945C0 /* Agorafdkaac.framework in Frameworks */,
- 03CE910725436186009945C0 /* AgoraSoundTouch.framework in Frameworks */,
+ 8B4B012126088DFD004EF20F /* AgoraAIDenoiseExtension.xcframework in Frameworks */,
+ 8B4B012826088E00004EF20F /* Agorafdkaac.xcframework in Frameworks */,
+ 8B4B012C26088E03004EF20F /* AgoraRtcKit.xcframework in Frameworks */,
+ 8B4B011A26088A06004EF20F /* AgoraSoundTouch.xcframework in Frameworks */,
+ 8B4B012626088DFF004EF20F /* AgoraDav1dExtension.xcframework in Frameworks */,
+ 8B4B012426088DFE004EF20F /* AgoraCore.xcframework in Frameworks */,
+ 8B4B012A26088E01004EF20F /* Agoraffmpeg.xcframework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -165,14 +178,17 @@
076C59741DDDBC3500F813E2 /* OpenVideoCall */ = {
isa = PBXGroup;
children = (
- 03CE90FE2543616C009945C0 /* Agorafdkaac.framework */,
- 03CE90FF2543616C009945C0 /* Agoraffmpeg.framework */,
- 03CE90FD2543616C009945C0 /* AgoraSoundTouch.framework */,
+ 8B4B011726088A06004EF20F /* AgoraAIDenoiseExtension.xcframework */,
+ 8B4B011226088A05004EF20F /* AgoraCore.xcframework */,
+ 8B4B011526088A05004EF20F /* AgoraDav1dExtension.xcframework */,
+ 8B4B011626088A05004EF20F /* Agorafdkaac.xcframework */,
+ 8B4B011826088A06004EF20F /* Agoraffmpeg.xcframework */,
+ 8B4B011426088A05004EF20F /* AgoraRtcKit.xcframework */,
+ 8B4B011326088A05004EF20F /* AgoraSoundTouch.xcframework */,
076C598F1DDDBCFE00F813E2 /* Controllers */,
076C59901DDDBD0600F813E2 /* Views */,
076C59911DDDBD0D00F813E2 /* Models */,
076C59751DDDBC3500F813E2 /* Supporting Files */,
- A76C26CD238684CB0047E150 /* AgoraRtcKit.framework */,
);
path = OpenVideoCall;
sourceTree = "";
@@ -282,7 +298,7 @@
076C596E1DDDBC3500F813E2 /* Sources */,
076C596F1DDDBC3500F813E2 /* Frameworks */,
076C59701DDDBC3500F813E2 /* Resources */,
- A791149F246D127300E77A35 /* Embed Frameworks */,
+ 8B4B012326088DFD004EF20F /* Embed Frameworks */,
);
buildRules = (
);
@@ -517,7 +533,10 @@
);
INFOPLIST_FILE = OpenVideoCall/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/OpenVideoCall",
@@ -544,7 +563,10 @@
);
INFOPLIST_FILE = OpenVideoCall/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/OpenVideoCall",
diff --git a/Group-Video/OpenVideoCall-iOS-Objective-C/OpenVideoCall/RoomViewController.m b/Group-Video/OpenVideoCall-iOS-Objective-C/OpenVideoCall/RoomViewController.m
index 24b7b871..104d2a1f 100644
--- a/Group-Video/OpenVideoCall-iOS-Objective-C/OpenVideoCall/RoomViewController.m
+++ b/Group-Video/OpenVideoCall-iOS-Objective-C/OpenVideoCall/RoomViewController.m
@@ -351,6 +351,10 @@ - (void)rtcEngine:(AgoraRtcEngineKit *)engine didOccurError:(AgoraErrorCode)erro
- (void)rtcEngine:(AgoraRtcEngineKit *)engine firstRemoteVideoDecodedOfUid:(NSUInteger)uid size:(CGSize)size elapsed:(NSInteger)elapsed {
VideoSession *userSession = [self videoSessionOfUid:uid];
userSession.size = size;
+}
+
+- (void)rtcEngine:(AgoraRtcEngineKit *)engine didJoinedOfUid:(NSUInteger)uid elapsed:(NSInteger)elapsed {
+ VideoSession *userSession = [self videoSessionOfUid:uid];
[self.agoraKit setupRemoteVideo:userSession.canvas];
}
diff --git a/Group-Video/OpenVideoCall-iOS-Objective-C/README.md b/Group-Video/OpenVideoCall-iOS-Objective-C/README.md
index 74ede945..cff50d20 100644
--- a/Group-Video/OpenVideoCall-iOS-Objective-C/README.md
+++ b/Group-Video/OpenVideoCall-iOS-Objective-C/README.md
@@ -53,6 +53,10 @@ To build and run the sample application, get an App Id:
}
```
+> To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+>
+> Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
+
### Integrate the Agora Video SDK
1. Download the [Agora Video SDK](https://www.agora.io/en/download/). Unzip the downloaded SDK package and copy the following files from the SDK `libs` folder into the sample application `OpenVideoCall` folder.
diff --git a/Group-Video/OpenVideoCall-iOS-Objective-C/README.zh.md b/Group-Video/OpenVideoCall-iOS-Objective-C/README.zh.md
index 65f4a28e..c6509e64 100644
--- a/Group-Video/OpenVideoCall-iOS-Objective-C/README.zh.md
+++ b/Group-Video/OpenVideoCall-iOS-Objective-C/README.zh.md
@@ -53,13 +53,17 @@ iOS 系统版本升级至 14.0 版本后,用户首次使用集成了声网 iOS
}
```
+> 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+>
+> 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
+
### 集成 Agora 视频 SDK
1. 在 [Agora.io SDK](https://www.agora.io/cn/blog/download/) 下载 **视频通话 + 直播 SDK**,解压后将其中**libs**文件夹中的下列文件拷贝到本项目的 OpenVideoCall 文件夹下。
- AgoraRtcKit.framework
- AgoraRtcCryptoLoader.framework
-
+
2. 打开 Xcode 后,运行本项目。
## 联系我们
diff --git a/Group-Video/OpenVideoCall-iOS/OpenVideoCall.xcodeproj/project.pbxproj b/Group-Video/OpenVideoCall-iOS/OpenVideoCall.xcodeproj/project.pbxproj
index ed003221..bc7bbe22 100644
--- a/Group-Video/OpenVideoCall-iOS/OpenVideoCall.xcodeproj/project.pbxproj
+++ b/Group-Video/OpenVideoCall-iOS/OpenVideoCall.xcodeproj/project.pbxproj
@@ -503,7 +503,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development: Qianze Zhang (3C9KJFP729)";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development: Qianze Zhang (3C9KJFP729)";
- DEVELOPMENT_TEAM = JDPG69R49Z;
+ DEVELOPMENT_TEAM = GM72UGLGZW;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@@ -522,7 +522,7 @@
PRODUCT_BUNDLE_IDENTIFIER = io.agora.OpenVideoCall;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
- PROVISIONING_PROFILE_SPECIFIER = AgoraLab2020;
+ PROVISIONING_PROFILE_SPECIFIER = App;
SWIFT_OBJC_BRIDGING_HEADER = "";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
@@ -538,7 +538,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development: Qianze Zhang (3C9KJFP729)";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development: Qianze Zhang (3C9KJFP729)";
- DEVELOPMENT_TEAM = JDPG69R49Z;
+ DEVELOPMENT_TEAM = GM72UGLGZW;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@@ -557,7 +557,7 @@
PRODUCT_BUNDLE_IDENTIFIER = io.agora.OpenVideoCall;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
- PROVISIONING_PROFILE_SPECIFIER = AgoraLab2020;
+ PROVISIONING_PROFILE_SPECIFIER = App;
SWIFT_OBJC_BRIDGING_HEADER = "";
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
SWIFT_VERSION = 4.2;
diff --git a/Group-Video/OpenVideoCall-iOS/OpenVideoCall/RoomViewController.swift b/Group-Video/OpenVideoCall-iOS/OpenVideoCall/RoomViewController.swift
index d56cda48..bdeae2b7 100644
--- a/Group-Video/OpenVideoCall-iOS/OpenVideoCall/RoomViewController.swift
+++ b/Group-Video/OpenVideoCall-iOS/OpenVideoCall/RoomViewController.swift
@@ -285,8 +285,11 @@ extension RoomViewController: AgoraRtcEngineDelegate {
alert(string: "Occur error: \(errorCode.rawValue)")
}
- // first remote video frame
- func rtcEngine(_ engine: AgoraRtcEngineKit, firstRemoteVideoDecodedOfUid uid: UInt, size: CGSize, elapsed: Int) {
+ /// callback when a remote user is leaving the channel, note audience in live broadcast mode will NOT trigger this event
+ /// @param uid uid of remote joined user
+ /// @param reason reason why this user left, note this event may be triggered when the remote user
+ /// become an audience in live broadcasting profile
+ func rtcEngine(_ engine: AgoraRtcEngineKit, didOfflineOfUid uid: UInt, reason: AgoraUserOfflineReason) {
guard videoSessions.count <= maxVideoSession else {
return
}
diff --git a/Group-Video/OpenVideoCall-iOS/README.md b/Group-Video/OpenVideoCall-iOS/README.md
index da922af5..bec03228 100755
--- a/Group-Video/OpenVideoCall-iOS/README.md
+++ b/Group-Video/OpenVideoCall-iOS/README.md
@@ -48,6 +48,10 @@ To build and run the sample application, get an App Id:
static var Token: String? = <#Temp Access Token#>
```
+> To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+>
+> Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
+
### Integrate the Agora Video SDK
1. Download the [Agora Video SDK](https://www.agora.io/en/download/). Unzip the downloaded SDK package and copy the following files from the SDK `libs` folder into the sample application `OpenVideoCall` folder.
diff --git a/Group-Video/OpenVideoCall-iOS/README.zh.md b/Group-Video/OpenVideoCall-iOS/README.zh.md
index 8ac7e14b..0fd13dc1 100644
--- a/Group-Video/OpenVideoCall-iOS/README.zh.md
+++ b/Group-Video/OpenVideoCall-iOS/README.zh.md
@@ -49,6 +49,10 @@ static let AppId: String = <#Your App Id#>
static var Token: String? = <#Temp Access Token#>
```
+> 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+>
+> 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
+
### 集成 Agora 视频 SDK
1. 在 [Agora.io SDK](https://www.agora.io/cn/blog/download/) 下载 **视频通话 + 直播 SDK**,解压后将其中**libs**文件夹中的下列文件拷贝到本项目的 OpenVideoCall 文件夹下。
diff --git a/Group-Video/OpenVideoCall-macOS/OpenVideoCall/RoomViewController.swift b/Group-Video/OpenVideoCall-macOS/OpenVideoCall/RoomViewController.swift
index fba9a961..abdeca60 100644
--- a/Group-Video/OpenVideoCall-macOS/OpenVideoCall/RoomViewController.swift
+++ b/Group-Video/OpenVideoCall-macOS/OpenVideoCall/RoomViewController.swift
@@ -482,15 +482,25 @@ extension RoomViewController: AgoraRtcEngineDelegate {
selfSession.updateChannelStats(stats)
}
}
-
+
// first remote video frame
func rtcEngine(_ engine: AgoraRtcEngineKit, firstRemoteVideoDecodedOfUid uid: UInt, size: CGSize, elapsed: Int) {
guard videoSessions.count < 5 else {
return
}
-
let userSession = videoSession(of: uid)
userSession.updateInfo(resolution: size)
+ }
+
+ /// callback when a remote user is leaving the channel, note audience in live broadcast mode will NOT trigger this event
+ /// @param uid uid of remote joined user
+ /// @param reason reason why this user left, note this event may be triggered when the remote user
+ /// become an audience in live broadcasting profile
+ func rtcEngine(_ engine: AgoraRtcEngineKit, didOfflineOfUid uid: UInt, reason: AgoraUserOfflineReason) {
+ guard videoSessions.count < 5 else {
+ return
+ }
+ let userSession = videoSession(of: uid)
agoraKit.setupRemoteVideo(userSession.canvas)
}
diff --git a/Group-Video/OpenVideoCall-macOS/README.md b/Group-Video/OpenVideoCall-macOS/README.md
index a6c9603d..2ceb572c 100755
--- a/Group-Video/OpenVideoCall-macOS/README.md
+++ b/Group-Video/OpenVideoCall-macOS/README.md
@@ -40,6 +40,10 @@ To build and run the sample application, get an App Id:
static var Token: String? = <#Temp Access Token#>
```
+> To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+>
+> Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
+
### Integrate the Agora Video SDK
1. Download the [Agora Video SDK](https://www.agora.io/en/download/). Unzip the downloaded SDK package and copy the following files from the SDK `libs` folder into the sample application `OpenVideoCall` folder.
diff --git a/Group-Video/OpenVideoCall-macOS/README.zh.md b/Group-Video/OpenVideoCall-macOS/README.zh.md
index 52bee7e3..5f43e1bb 100644
--- a/Group-Video/OpenVideoCall-macOS/README.zh.md
+++ b/Group-Video/OpenVideoCall-macOS/README.zh.md
@@ -41,6 +41,10 @@
static var Token: String? = <#Temp Access Token#>
```
+> 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+>
+> 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
+
### 集成 Agora 视频 SDK
1. 在 [Agora.io SDK](https://www.agora.io/cn/blog/download/) 下载 **视频通话 + 直播 SDK**,解压后将其中**libs**文件夹下的下列文件拷贝到本项目的 OpenVideoCall 文件夹下。
diff --git a/One-to-One-Video/Agora-Android-Tutorial-1to1/README.md b/One-to-One-Video/Agora-Android-Tutorial-1to1/README.md
index d488fbc0..5ea62866 100755
--- a/One-to-One-Video/Agora-Android-Tutorial-1to1/README.md
+++ b/One-to-One-Video/Agora-Android-Tutorial-1to1/README.md
@@ -38,6 +38,10 @@ To build and run the sample application, get an App ID:
<#YOUR TOKEN#>
```
+> To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+>
+> Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
+
### Integrate the Agora Video SDK
The SDK must be integrated into the sample project before it can opened and built. There are two methods for integrating the Agora Video SDK into the sample project. The first method uses JCenter to automatically integrate the SDK files. The second method requires you to manually copy the SDK files to the project.
@@ -68,7 +72,7 @@ Copy from SDK|Copy to Project Folder
**x86** folder|**/app/src/main/jniLibs** folder
**armeabi-v7a** folder|**/app/src/main/jniLibs** folder
-
+
### Run the Application
diff --git a/One-to-One-Video/Agora-Android-Tutorial-1to1/README.zh.md b/One-to-One-Video/Agora-Android-Tutorial-1to1/README.zh.md
index a91ff7a7..ecdce7ef 100755
--- a/One-to-One-Video/Agora-Android-Tutorial-1to1/README.zh.md
+++ b/One-to-One-Video/Agora-Android-Tutorial-1to1/README.zh.md
@@ -38,6 +38,10 @@
<#YOUR TOKEN#>
```
+> 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+>
+> 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
+
### 集成 Agora 视频 SDK
集成方式有以下两种:
diff --git a/One-to-One-Video/Agora-Android-Tutorial-1to1/app/src/main/AndroidManifest.xml b/One-to-One-Video/Agora-Android-Tutorial-1to1/app/src/main/AndroidManifest.xml
index 364455f3..91deaa1e 100644
--- a/One-to-One-Video/Agora-Android-Tutorial-1to1/app/src/main/AndroidManifest.xml
+++ b/One-to-One-Video/Agora-Android-Tutorial-1to1/app/src/main/AndroidManifest.xml
@@ -9,7 +9,6 @@
-
<#YOUR TOKEN#>
```
+> To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+>
+> Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
+
### Integrate the Agora Video SDK
The SDK must be integrated into the sample project before it can opened and built. There are two methods for integrating the Agora Video SDK into the sample project. The first method uses JCenter to automatically integrate the SDK files. The second method requires you to manually copy the SDK files to the project.
@@ -71,7 +75,7 @@ Copy from SDK|Copy to Project Folder
**x86** folder|**/app/src/main/jniLibs** folder
**armeabi-v7a** folder|**/app/src/main/jniLibs** folder
-
+
### Run the Application
diff --git a/One-to-One-Video/Agora-Android-Tutorial-Kotlin-1to1/README.zh.md b/One-to-One-Video/Agora-Android-Tutorial-Kotlin-1to1/README.zh.md
index 68b23d79..bbc7115b 100755
--- a/One-to-One-Video/Agora-Android-Tutorial-Kotlin-1to1/README.zh.md
+++ b/One-to-One-Video/Agora-Android-Tutorial-Kotlin-1to1/README.zh.md
@@ -39,6 +39,10 @@
<#YOUR TOKEN#>
```
+> 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+>
+> 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
+
### 集成 Agora 视频 SDK
集成方式有以下两种:
diff --git a/One-to-One-Video/Agora-Android-Tutorial-Kotlin-1to1/app/src/main/java/io/agora/tutorials1v1vcall/VideoChatViewActivity.kt b/One-to-One-Video/Agora-Android-Tutorial-Kotlin-1to1/app/src/main/java/io/agora/tutorials1v1vcall/VideoChatViewActivity.kt
index 858837e3..7df8178c 100644
--- a/One-to-One-Video/Agora-Android-Tutorial-Kotlin-1to1/app/src/main/java/io/agora/tutorials1v1vcall/VideoChatViewActivity.kt
+++ b/One-to-One-Video/Agora-Android-Tutorial-Kotlin-1to1/app/src/main/java/io/agora/tutorials1v1vcall/VideoChatViewActivity.kt
@@ -25,22 +25,18 @@ class VideoChatViewActivity : AppCompatActivity() {
private var mRtcEngine: RtcEngine? = null
private val mRtcEventHandler = object : IRtcEngineEventHandler() {
/**
- * Occurs when the first remote video frame is received and decoded.
+ * Occurs when a remote user (Communication)/ host (Live Broadcast) joins the channel.
* This callback is triggered in either of the following scenarios:
*
- * The remote user joins the channel and sends the video stream.
- * The remote user stops sending the video stream and re-sends it after 15 seconds. Possible reasons include:
- * The remote user leaves channel.
- * The remote user drops offline.
- * The remote user calls the muteLocalVideoStream method.
- * The remote user calls the disableVideo method.
+ * A remote user/host joins the channel by calling the joinChannel method.
+ * A remote user switches the user role to the host by calling the setClientRole method after joining the channel.
+ * A remote user/host rejoins the channel after a network interruption.
+ * The host injects an online media stream into the channel by calling the addInjectStreamUrl method.
*
* @param uid User ID of the remote user sending the video streams.
- * @param width Width (pixels) of the video stream.
- * @param height Height (pixels) of the video stream.
* @param elapsed Time elapsed (ms) from the local user calling the joinChannel method until this callback is triggered.
*/
- override fun onFirstRemoteVideoDecoded(uid: Int, width: Int, height: Int, elapsed: Int) {
+ override fun onUserJoined(uid: Int, elapsed: Int) {
runOnUiThread { setupRemoteVideo(uid) }
}
diff --git a/One-to-One-Video/Agora-Web-RTS-Tutorial-1to1-Webpack/README.md b/One-to-One-Video/Agora-Web-RTS-Tutorial-1to1-Webpack/README.md
index 4eb94ee6..cdc734bf 100644
--- a/One-to-One-Video/Agora-Web-RTS-Tutorial-1to1-Webpack/README.md
+++ b/One-to-One-Video/Agora-Web-RTS-Tutorial-1to1-Webpack/README.md
@@ -21,6 +21,9 @@ To build and run the sample application, get an App ID:
3. Save the **App ID** from the Dashboard for later use.
4. Generate a temp **Access Token** (valid for 24 hours) from dashboard page with given channel name, save for later use.
+> To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+>
+> Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
### Install dependencies and integrate the Agora Video SDK
diff --git a/One-to-One-Video/Agora-Web-RTS-Tutorial-1to1-Webpack/README.zh.md b/One-to-One-Video/Agora-Web-RTS-Tutorial-1to1-Webpack/README.zh.md
index 4daec4a0..4b88d6d5 100644
--- a/One-to-One-Video/Agora-Web-RTS-Tutorial-1to1-Webpack/README.zh.md
+++ b/One-to-One-Video/Agora-Web-RTS-Tutorial-1to1-Webpack/README.zh.md
@@ -26,6 +26,9 @@ This section shows you how to prepare, and run the sample application.
3. 复制后台的 **App ID** 并备注,稍后启动应用时会用到它
4. 在项目页面生成临时 **Access Token** (24小时内有效)并备注,注意生成的Token只能适用于对应的频道名。
+> 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+>
+> 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
### 集成 Agora 视频 SDK
diff --git a/One-to-One-Video/Agora-Web-Tutorial-1to1-React-NG/README.md b/One-to-One-Video/Agora-Web-Tutorial-1to1-React-NG/README.md
index 0ba033d7..05ac2e5f 100644
--- a/One-to-One-Video/Agora-Web-Tutorial-1to1-React-NG/README.md
+++ b/One-to-One-Video/Agora-Web-Tutorial-1to1-React-NG/README.md
@@ -13,10 +13,17 @@ This tutorial shows you how to quickly create an basic video communication using
To build and run the sample application, get an App ID:
1. Create a developer account at [agora.io](https://dashboard.agora.io/signin/). Once you finish the signup process, you will be redirected to the Dashboard.
+
2. Navigate in the Dashboard tree on the left to **Projects** > **Project List**.
+
3. Save the **App ID** from the Dashboard for later use.
+
4. Generate a temp **Access Token** (valid for 24 hours) from dashboard page with given channel name, save for later use.
+ > To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+ >
+ > Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
+
### Install dependencies and integrate the Agora Video SDK
diff --git a/One-to-One-Video/Agora-Web-Tutorial-1to1-React-NG/README.zh.md b/One-to-One-Video/Agora-Web-Tutorial-1to1-React-NG/README.zh.md
index 12687bee..f22d6be0 100644
--- a/One-to-One-Video/Agora-Web-Tutorial-1to1-React-NG/README.zh.md
+++ b/One-to-One-Video/Agora-Web-Tutorial-1to1-React-NG/README.zh.md
@@ -17,10 +17,17 @@
在编译和启动实例程序前,您需要首先获取一个可用的App ID:
1. 在[agora.io](https://dashboard.agora.io/signin/)创建一个开发者账号
+
2. 前往后台页面,点击左部导航栏的 **项目 > 项目列表** 菜单
+
3. 复制后台的 **App ID** 并备注,稍后启动应用时会用到它
+
4. 在项目页面生成临时 **Access Token** (24小时内有效)并备注,注意生成的Token只能适用于对应的频道名。
+ > 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+ >
+ > 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
+
### 集成 Agora 视频 SDK
diff --git a/One-to-One-Video/Agora-Web-Tutorial-1to1-React/README.md b/One-to-One-Video/Agora-Web-Tutorial-1to1-React/README.md
index 987a076a..08672229 100644
--- a/One-to-One-Video/Agora-Web-Tutorial-1to1-React/README.md
+++ b/One-to-One-Video/Agora-Web-Tutorial-1to1-React/README.md
@@ -17,10 +17,17 @@ This section shows you how to prepare, and run the sample application.
To build and run the sample application, get an App ID:
1. Create a developer account at [agora.io](https://dashboard.agora.io/signin/). Once you finish the signup process, you will be redirected to the Dashboard.
+
2. Navigate in the Dashboard tree on the left to **Projects** > **Project List**.
+
3. Save the **App ID** from the Dashboard for later use.
+
4. Generate a temp **Access Token** (valid for 24 hours) from dashboard page with given channel name, save for later use.
+ > To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+ >
+ > Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
+
### Install dependencies and integrate the Agora Video SDK
diff --git a/One-to-One-Video/Agora-Web-Tutorial-1to1-React/README.zh.md b/One-to-One-Video/Agora-Web-Tutorial-1to1-React/README.zh.md
index ddc97b78..2c82512a 100644
--- a/One-to-One-Video/Agora-Web-Tutorial-1to1-React/README.zh.md
+++ b/One-to-One-Video/Agora-Web-Tutorial-1to1-React/README.zh.md
@@ -22,10 +22,17 @@ This section shows you how to prepare, and run the sample application.
在编译和启动实例程序前,您需要首先获取一个可用的App ID:
1. 在[agora.io](https://dashboard.agora.io/signin/)创建一个开发者账号
+
2. 前往后台页面,点击左部导航栏的 **项目 > 项目列表** 菜单
+
3. 复制后台的 **App ID** 并备注,稍后启动应用时会用到它
+
4. 在项目页面生成临时 **Access Token** (24小时内有效)并备注,注意生成的Token只能适用于对应的频道名。
+ > 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+ >
+ > 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
+
### 集成 Agora 视频 SDK
diff --git a/One-to-One-Video/Agora-Web-Tutorial-1to1-Vue/README.md b/One-to-One-Video/Agora-Web-Tutorial-1to1-Vue/README.md
index abe07b04..c1b21e03 100644
--- a/One-to-One-Video/Agora-Web-Tutorial-1to1-Vue/README.md
+++ b/One-to-One-Video/Agora-Web-Tutorial-1to1-Vue/README.md
@@ -12,10 +12,17 @@ Video supports one to one, one to many calls
## To build and run the sample application, get an App ID:
1. Create a developer account at [agora.io](https://dashboard.agora.io/signin/). Once you finish the signup process, you will be redirected to the Dashboard.
+
2. Navigate in the Dashboard tree on the left to **Projects** > **Project List**.
+
3. Save the **App ID** from the Dashboard for later use.
+
4. Generate a temp **Access Token** (valid for 24 hours) from dashboard page with given channel name, save for later use.
+ > To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+ >
+ > Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
+
## Start project
basic-video-call
diff --git a/One-to-One-Video/Agora-Web-Tutorial-1to1-Vue/README.zh.md b/One-to-One-Video/Agora-Web-Tutorial-1to1-Vue/README.zh.md
index 5fc38b7b..c59d4108 100644
--- a/One-to-One-Video/Agora-Web-Tutorial-1to1-Vue/README.zh.md
+++ b/One-to-One-Video/Agora-Web-Tutorial-1to1-Vue/README.zh.md
@@ -12,10 +12,17 @@ Web Tutorial For Vue - 1to1
## 如何获取appID ?
1. 在[agora.io](https://dashboard.agora.io/signin/)创建一个开发者账号
+
2. 前往后台页面,点击左部导航栏的 **项目 > 项目列表** 菜单
+
3. 复制后台的 **App ID** 并备注,稍后启动应用时会用到它
+
4. 在项目页面生成临时 **Access Token** (24小时内有效)并备注,注意生成的Token只能适用于对应的频道名。
+ > 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+ >
+ > 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
+
## 开始运行项目
basic-video-call
diff --git a/One-to-One-Video/Agora-Web-Tutorial-1to1-Webpack/README.md b/One-to-One-Video/Agora-Web-Tutorial-1to1-Webpack/README.md
index 86cb3cd6..ea8d5ebf 100644
--- a/One-to-One-Video/Agora-Web-Tutorial-1to1-Webpack/README.md
+++ b/One-to-One-Video/Agora-Web-Tutorial-1to1-Webpack/README.md
@@ -21,6 +21,9 @@ To build and run the sample application, get an App ID:
3. Save the **App ID** from the Dashboard for later use.
4. Generate a temp **Access Token** (valid for 24 hours) from dashboard page with given channel name, save for later use.
+> To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+>
+> Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
### Install dependencies and integrate the Agora Video SDK
diff --git a/One-to-One-Video/Agora-Web-Tutorial-1to1-Webpack/README.zh.md b/One-to-One-Video/Agora-Web-Tutorial-1to1-Webpack/README.zh.md
index 030a6e24..5ba799c4 100644
--- a/One-to-One-Video/Agora-Web-Tutorial-1to1-Webpack/README.zh.md
+++ b/One-to-One-Video/Agora-Web-Tutorial-1to1-Webpack/README.zh.md
@@ -26,6 +26,9 @@ This section shows you how to prepare, and run the sample application.
3. 复制后台的 **App ID** 并备注,稍后启动应用时会用到它
4. 在项目页面生成临时 **Access Token** (24小时内有效)并备注,注意生成的Token只能适用于对应的频道名。
+> 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+>
+> 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
### 集成 Agora 视频 SDK
diff --git a/One-to-One-Video/Agora-Web-Tutorial-1to1/README.md b/One-to-One-Video/Agora-Web-Tutorial-1to1/README.md
index d0b9a711..67b43305 100644
--- a/One-to-One-Video/Agora-Web-Tutorial-1to1/README.md
+++ b/One-to-One-Video/Agora-Web-Tutorial-1to1/README.md
@@ -26,6 +26,9 @@ To build and run the sample application, get an App ID:
3. Save the **App ID** from the Dashboard for later use.
4. Generate a temp **Access Token** (valid for 24 hours) from dashboard page with given channel name, save for later use.
+> To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+>
+> Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
### Integrate Agora Video SDK
diff --git a/One-to-One-Video/Agora-Web-Tutorial-1to1/README.zh.md b/One-to-One-Video/Agora-Web-Tutorial-1to1/README.zh.md
index 415a6291..9849c0cd 100644
--- a/One-to-One-Video/Agora-Web-Tutorial-1to1/README.zh.md
+++ b/One-to-One-Video/Agora-Web-Tutorial-1to1/README.zh.md
@@ -26,6 +26,9 @@
3. 复制后台的 **App ID** 并备注,稍后启动应用时会用到它
4. 在项目页面生成临时 **Access Token** (24小时内有效)并备注,注意生成的Token只能适用于对应的频道名。
+> 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+>
+> 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
### 集成 Agora 视频 SDK
diff --git a/One-to-One-Video/Agora-Windows-Tutorial-1to1/README.md b/One-to-One-Video/Agora-Windows-Tutorial-1to1/README.md
index 2283986b..e4d08913 100755
--- a/One-to-One-Video/Agora-Windows-Tutorial-1to1/README.md
+++ b/One-to-One-Video/Agora-Windows-Tutorial-1to1/README.md
@@ -31,6 +31,10 @@ To build and run the sample application, get an App ID:
#define APP_ID _T("Your App ID")
```
+> To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+>
+> Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
+
### Integrate the Agora Video SDK
1. Download the **Agora Video SDK** from [Agora.io SDK](https://www.agora.io/en/blog/download/). Unzip the downloaded SDK package and copy the files under **libs\include**, to the project folder **Agora-Windows-Tutorial-1to1\sdk\include** (create if not exist). Then copy the **dll** file and **lib** file under **libs\x86**, to **sdk\dll** and **sdk\lib** respectively.
diff --git a/One-to-One-Video/Agora-Windows-Tutorial-1to1/README.zh.md b/One-to-One-Video/Agora-Windows-Tutorial-1to1/README.zh.md
index 1058794e..1be62ddf 100644
--- a/One-to-One-Video/Agora-Windows-Tutorial-1to1/README.zh.md
+++ b/One-to-One-Video/Agora-Windows-Tutorial-1to1/README.zh.md
@@ -43,6 +43,10 @@ Agora 视频 SDK 支持 iOS / Android / Windows / macOS 等多个平台,你可
#define APP_ID _T("Your App ID")
```
+> 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+>
+> 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
+
### 集成 Agora 视频 SDK
1. 在 [Agora.io SDK](https://www.agora.io/cn/blog/download/) 下载 **视频通话 + 直播 SDK**,解压后将 libs\include 中的文件,复制到 **Agora-Windows-Tutorial-1to1** 下的 **sdk\include** 文件夹下(如无该文件夹需新建)。并将 **libs\x86** 下的 **dll** 和 **lib** 文件分别复制到 **sdk\dll** 和 **sdk\lib** 文件夹下。
diff --git a/One-to-One-Video/Agora-iOS-Tutorial-Objective-C-1to1/Agora-iOS-Tutorial-Objective-C/VideoChatViewController.m b/One-to-One-Video/Agora-iOS-Tutorial-Objective-C-1to1/Agora-iOS-Tutorial-Objective-C/VideoChatViewController.m
index fbac71f6..2a657430 100755
--- a/One-to-One-Video/Agora-iOS-Tutorial-Objective-C-1to1/Agora-iOS-Tutorial-Objective-C/VideoChatViewController.m
+++ b/One-to-One-Video/Agora-iOS-Tutorial-Objective-C-1to1/Agora-iOS-Tutorial-Objective-C/VideoChatViewController.m
@@ -77,20 +77,15 @@ - (void)joinChannel {
}
-/// Callback to handle the event such when the first frame of a remote video stream is decoded on the device.
-/// @param engine - RTC engine instance
-/// @param uid - user id
-/// @param size - the height and width of the video frame
-/// @param elapsed - lapsed Time elapsed (ms) from the local user calling JoinChannel method until the SDK triggers this callback.
-- (void)rtcEngine:(AgoraRtcEngineKit *)engine firstRemoteVideoDecodedOfUid:(NSUInteger)uid size: (CGSize)size elapsed:(NSInteger)elapsed {
+- (void)rtcEngine:(AgoraRtcEngineKit *)engine didJoinedOfUid:(NSUInteger)uid elapsed:(NSInteger)elapsed {
if (self.remoteVideo.hidden) {
self.remoteVideo.hidden = NO;
}
-
+
AgoraRtcVideoCanvas *videoCanvas = [[AgoraRtcVideoCanvas alloc] init];
videoCanvas.uid = uid;
// Since we are making a simple 1:1 video chat app, for simplicity sake, we are not storing the UIDs. You could use a mechanism such as an array to store the UIDs in a channel.
-
+
videoCanvas.view = self.remoteVideo;
videoCanvas.renderMode = AgoraVideoRenderModeHidden;
[self.agoraKit setupRemoteVideo:videoCanvas];
diff --git a/One-to-One-Video/Agora-iOS-Tutorial-Objective-C-1to1/README.md b/One-to-One-Video/Agora-iOS-Tutorial-Objective-C-1to1/README.md
index c061834d..a68bb430 100644
--- a/One-to-One-Video/Agora-iOS-Tutorial-Objective-C-1to1/README.md
+++ b/One-to-One-Video/Agora-iOS-Tutorial-Objective-C-1to1/README.md
@@ -45,6 +45,10 @@ To build and run the sample application, get an App ID:
NSString *const token = @"<#Temp Token#>";
```
+> To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+>
+> Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
+
### Integrate the Agora Video SDK
1. Download the [Agora Video SDK](https://www.agora.io/en/download/). Unzip the downloaded SDK package and copy the following files from the SDK `libs` folder into the sample application `Agora iOS Tutorial Objective-C` folder.
diff --git a/One-to-One-Video/Agora-iOS-Tutorial-Objective-C-1to1/README.zh.md b/One-to-One-Video/Agora-iOS-Tutorial-Objective-C-1to1/README.zh.md
index f7355f5f..c49fccb8 100644
--- a/One-to-One-Video/Agora-iOS-Tutorial-Objective-C-1to1/README.zh.md
+++ b/One-to-One-Video/Agora-iOS-Tutorial-Objective-C-1to1/README.zh.md
@@ -45,13 +45,17 @@ iOS 系统版本升级至 14.0 版本后,用户首次使用集成了声网 iOS
NSString *const token = @"<#Temp Token#>";
```
+> 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+>
+> 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
+
### 集成 Agora 视频 SDK
1. 在 [Agora.io SDK](https://www.agora.io/cn/blog/download/) 下载 **视频通话 + 直播 SDK**,解压后将其中**libs**文件夹中的下列文件拷贝到本项目的 Agora iOS Tutorial Objective-C 文件夹下。
- AgoraRtcEngineKit.framework
- AgoraRtcCryptoLoader.framework
-
+
2. 最后使用 XCode 打开 Agora iOS Tutorial Objective-C.xcodeproj,连接 iPhone/iPad 测试设备,设置有效的开发者签名后即可运行。
## 联系我们
diff --git a/One-to-One-Video/Agora-iOS-Tutorial-Swift-1to1/Agora-iOS-Tutorial.xcodeproj/project.pbxproj b/One-to-One-Video/Agora-iOS-Tutorial-Swift-1to1/Agora-iOS-Tutorial.xcodeproj/project.pbxproj
index b6491a91..f0710b25 100644
--- a/One-to-One-Video/Agora-iOS-Tutorial-Swift-1to1/Agora-iOS-Tutorial.xcodeproj/project.pbxproj
+++ b/One-to-One-Video/Agora-iOS-Tutorial-Swift-1to1/Agora-iOS-Tutorial.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 52;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
@@ -14,12 +14,18 @@
1ABDEE491D383BE4007DE451 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1ABDEE481D383BE4007DE451 /* Assets.xcassets */; };
1ABDEE4C1D383BE4007DE451 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1ABDEE4A1D383BE4007DE451 /* LaunchScreen.storyboard */; };
38EF7E962368277700A6A483 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 38EF7E952368277700A6A483 /* README.md */; };
- 8BF7442525A58037007A0793 /* AgoraSoundTouch.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BF7442025A58037007A0793 /* AgoraSoundTouch.xcframework */; };
- 8BF7442625A58037007A0793 /* Agoraffmpeg.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BF7442125A58037007A0793 /* Agoraffmpeg.xcframework */; };
- 8BF7442725A58037007A0793 /* AgoraCore.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BF7442225A58037007A0793 /* AgoraCore.xcframework */; };
- 8BF7442825A58037007A0793 /* Agorafdkaac.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BF7442325A58037007A0793 /* Agorafdkaac.xcframework */; };
- 8BF7442A25A58040007A0793 /* AgoraRtcKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BF7441F25A58037007A0793 /* AgoraRtcKit.xcframework */; };
- 8BF7442B25A58040007A0793 /* AgoraRtcKit.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8BF7441F25A58037007A0793 /* AgoraRtcKit.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 8B6FA1342614730900A4E4C3 /* Agoraffmpeg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA12B2614730900A4E4C3 /* Agoraffmpeg.framework */; };
+ 8B6FA1352614730900A4E4C3 /* Agoraffmpeg.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA12B2614730900A4E4C3 /* Agoraffmpeg.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 8B6FA1382614730900A4E4C3 /* Agorafdkaac.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA12D2614730900A4E4C3 /* Agorafdkaac.framework */; };
+ 8B6FA1392614730900A4E4C3 /* Agorafdkaac.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA12D2614730900A4E4C3 /* Agorafdkaac.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 8B6FA13A2614730900A4E4C3 /* AgoraCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA12E2614730900A4E4C3 /* AgoraCore.framework */; };
+ 8B6FA13B2614730900A4E4C3 /* AgoraCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA12E2614730900A4E4C3 /* AgoraCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 8B6FA1402614730900A4E4C3 /* AgoraRtcKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA1312614730900A4E4C3 /* AgoraRtcKit.framework */; };
+ 8B6FA1412614730900A4E4C3 /* AgoraRtcKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA1312614730900A4E4C3 /* AgoraRtcKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 8B6FA1422614730900A4E4C3 /* AgoraAIDenoiseExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA1322614730900A4E4C3 /* AgoraAIDenoiseExtension.framework */; };
+ 8B6FA1432614730900A4E4C3 /* AgoraAIDenoiseExtension.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA1322614730900A4E4C3 /* AgoraAIDenoiseExtension.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 8B6FA1442614730900A4E4C3 /* AgoraSoundTouch.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA1332614730900A4E4C3 /* AgoraSoundTouch.framework */; };
+ 8B6FA1452614730900A4E4C3 /* AgoraSoundTouch.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA1332614730900A4E4C3 /* AgoraSoundTouch.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
A72BB7DE22F2B67E008F563D /* Log.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A72BB7DC22F2B67E008F563D /* Log.storyboard */; };
A72BB7DF22F2B67E008F563D /* LogViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72BB7DD22F2B67E008F563D /* LogViewController.swift */; };
A77E577724ADDBE300DD7670 /* Agora_iOS_Tutorial_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77E577624ADDBE300DD7670 /* Agora_iOS_Tutorial_Tests.swift */; };
@@ -43,7 +49,12 @@
dstPath = "";
dstSubfolderSpec = 10;
files = (
- 8BF7442B25A58040007A0793 /* AgoraRtcKit.xcframework in Embed Frameworks */,
+ 8B6FA1392614730900A4E4C3 /* Agorafdkaac.framework in Embed Frameworks */,
+ 8B6FA1412614730900A4E4C3 /* AgoraRtcKit.framework in Embed Frameworks */,
+ 8B6FA13B2614730900A4E4C3 /* AgoraCore.framework in Embed Frameworks */,
+ 8B6FA1352614730900A4E4C3 /* Agoraffmpeg.framework in Embed Frameworks */,
+ 8B6FA1452614730900A4E4C3 /* AgoraSoundTouch.framework in Embed Frameworks */,
+ 8B6FA1432614730900A4E4C3 /* AgoraAIDenoiseExtension.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
@@ -60,17 +71,20 @@
1ABDEE4B1D383BE4007DE451 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
1ABDEE4D1D383BE4007DE451 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
38EF7E952368277700A6A483 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; };
- 8BF7441F25A58037007A0793 /* AgoraRtcKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = AgoraRtcKit.xcframework; sourceTree = ""; };
- 8BF7442025A58037007A0793 /* AgoraSoundTouch.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = AgoraSoundTouch.xcframework; sourceTree = ""; };
- 8BF7442125A58037007A0793 /* Agoraffmpeg.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = Agoraffmpeg.xcframework; sourceTree = ""; };
- 8BF7442225A58037007A0793 /* AgoraCore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = AgoraCore.xcframework; sourceTree = ""; };
- 8BF7442325A58037007A0793 /* Agorafdkaac.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = Agorafdkaac.xcframework; sourceTree = ""; };
+ 8B6FA12B2614730900A4E4C3 /* Agoraffmpeg.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Agoraffmpeg.framework; path = ../../libs/Agoraffmpeg.framework; sourceTree = ""; };
+ 8B6FA12C2614730900A4E4C3 /* AgoraDav1dExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraDav1dExtension.framework; path = ../../libs/AgoraDav1dExtension.framework; sourceTree = ""; };
+ 8B6FA12D2614730900A4E4C3 /* Agorafdkaac.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Agorafdkaac.framework; path = ../../libs/Agorafdkaac.framework; sourceTree = ""; };
+ 8B6FA12E2614730900A4E4C3 /* AgoraCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraCore.framework; path = ../../libs/AgoraCore.framework; sourceTree = ""; };
+ 8B6FA12F2614730900A4E4C3 /* AgoraSuperResolutionExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraSuperResolutionExtension.framework; path = ../../libs/AgoraSuperResolutionExtension.framework; sourceTree = ""; };
+ 8B6FA1302614730900A4E4C3 /* AgoraJNDExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraJNDExtension.framework; path = ../../libs/AgoraJNDExtension.framework; sourceTree = ""; };
+ 8B6FA1312614730900A4E4C3 /* AgoraRtcKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraRtcKit.framework; path = ../../libs/AgoraRtcKit.framework; sourceTree = ""; };
+ 8B6FA1322614730900A4E4C3 /* AgoraAIDenoiseExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraAIDenoiseExtension.framework; path = ../../libs/AgoraAIDenoiseExtension.framework; sourceTree = ""; };
+ 8B6FA1332614730900A4E4C3 /* AgoraSoundTouch.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraSoundTouch.framework; path = ../../libs/AgoraSoundTouch.framework; sourceTree = ""; };
A72BB7DC22F2B67E008F563D /* Log.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Log.storyboard; sourceTree = ""; };
A72BB7DD22F2B67E008F563D /* LogViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LogViewController.swift; sourceTree = ""; };
A77E577424ADDBE300DD7670 /* Agora-iOS-Tutorial-Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Agora-iOS-Tutorial-Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
A77E577624ADDBE300DD7670 /* Agora_iOS_Tutorial_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Agora_iOS_Tutorial_Tests.swift; sourceTree = ""; };
A77E577824ADDBE300DD7670 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
- A7AD0EFC24AEF9B7008FFD5B /* AgoraRtcKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraRtcKit.framework; path = "Agora-iOS-Tutorial/AgoraRtcKit.framework"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -78,11 +92,12 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 8BF7442625A58037007A0793 /* Agoraffmpeg.xcframework in Frameworks */,
- 8BF7442525A58037007A0793 /* AgoraSoundTouch.xcframework in Frameworks */,
- 8BF7442A25A58040007A0793 /* AgoraRtcKit.xcframework in Frameworks */,
- 8BF7442825A58037007A0793 /* Agorafdkaac.xcframework in Frameworks */,
- 8BF7442725A58037007A0793 /* AgoraCore.xcframework in Frameworks */,
+ 8B6FA1382614730900A4E4C3 /* Agorafdkaac.framework in Frameworks */,
+ 8B6FA1402614730900A4E4C3 /* AgoraRtcKit.framework in Frameworks */,
+ 8B6FA13A2614730900A4E4C3 /* AgoraCore.framework in Frameworks */,
+ 8B6FA1342614730900A4E4C3 /* Agoraffmpeg.framework in Frameworks */,
+ 8B6FA1442614730900A4E4C3 /* AgoraSoundTouch.framework in Frameworks */,
+ 8B6FA1422614730900A4E4C3 /* AgoraAIDenoiseExtension.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -119,11 +134,6 @@
1ABDEE401D383BE4007DE451 /* Agora-iOS-Tutorial */ = {
isa = PBXGroup;
children = (
- 8BF7442225A58037007A0793 /* AgoraCore.xcframework */,
- 8BF7442325A58037007A0793 /* Agorafdkaac.xcframework */,
- 8BF7442125A58037007A0793 /* Agoraffmpeg.xcframework */,
- 8BF7441F25A58037007A0793 /* AgoraRtcKit.xcframework */,
- 8BF7442025A58037007A0793 /* AgoraSoundTouch.xcframework */,
1ABDEE431D383BE4007DE451 /* VideoChatViewController.swift */,
A72BB7DD22F2B67E008F563D /* LogViewController.swift */,
1ABDEE411D383BE4007DE451 /* AppDelegate.swift */,
@@ -148,7 +158,15 @@
A7581191240790EA007EDAD3 /* Frameworks */ = {
isa = PBXGroup;
children = (
- A7AD0EFC24AEF9B7008FFD5B /* AgoraRtcKit.framework */,
+ 8B6FA1322614730900A4E4C3 /* AgoraAIDenoiseExtension.framework */,
+ 8B6FA12E2614730900A4E4C3 /* AgoraCore.framework */,
+ 8B6FA12C2614730900A4E4C3 /* AgoraDav1dExtension.framework */,
+ 8B6FA12D2614730900A4E4C3 /* Agorafdkaac.framework */,
+ 8B6FA12B2614730900A4E4C3 /* Agoraffmpeg.framework */,
+ 8B6FA1302614730900A4E4C3 /* AgoraJNDExtension.framework */,
+ 8B6FA1312614730900A4E4C3 /* AgoraRtcKit.framework */,
+ 8B6FA1332614730900A4E4C3 /* AgoraSoundTouch.framework */,
+ 8B6FA12F2614730900A4E4C3 /* AgoraSuperResolutionExtension.framework */,
);
name = Frameworks;
sourceTree = "";
@@ -424,8 +442,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 9.3;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
- SWIFT_COMPILATION_MODE = wholemodule;
- SWIFT_OPTIMIZATION_LEVEL = "-O";
+ SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
@@ -446,10 +463,7 @@
);
INFOPLIST_FILE = "Agora-iOS-Tutorial/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- );
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Agora\\ iOS\\ Tutorial",
@@ -461,6 +475,7 @@
SWIFT_OBJC_BRIDGING_HEADER = "";
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
SWIFT_VERSION = 5.0;
+ VALIDATE_WORKSPACE = YES;
};
name = Debug;
};
@@ -479,10 +494,7 @@
);
INFOPLIST_FILE = "Agora-iOS-Tutorial/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- );
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Agora\\ iOS\\ Tutorial",
@@ -494,6 +506,7 @@
SWIFT_OBJC_BRIDGING_HEADER = "";
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
SWIFT_VERSION = 5.0;
+ VALIDATE_WORKSPACE = YES;
};
name = Release;
};
@@ -518,11 +531,7 @@
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = "Agora-iOS-Tutorial-Tests/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 13.5;
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- "@loader_path/Frameworks",
- );
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = "CavanSu.Agora-iOS-Tutorial-Tests";
@@ -557,11 +566,7 @@
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = "Agora-iOS-Tutorial-Tests/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 13.5;
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- "@loader_path/Frameworks",
- );
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = "CavanSu.Agora-iOS-Tutorial-Tests";
PRODUCT_NAME = "$(TARGET_NAME)";
diff --git a/One-to-One-Video/Agora-iOS-Tutorial-Swift-1to1/Agora-iOS-Tutorial/VideoChatViewController.swift b/One-to-One-Video/Agora-iOS-Tutorial-Swift-1to1/Agora-iOS-Tutorial/VideoChatViewController.swift
index c380e77a..afe7ac7f 100755
--- a/One-to-One-Video/Agora-iOS-Tutorial-Swift-1to1/Agora-iOS-Tutorial/VideoChatViewController.swift
+++ b/One-to-One-Video/Agora-iOS-Tutorial-Swift-1to1/Agora-iOS-Tutorial/VideoChatViewController.swift
@@ -198,30 +198,24 @@ class VideoChatViewController: UIViewController {
}
extension VideoChatViewController: AgoraRtcEngineDelegate {
-
- /// Callback to handle the event when the first frame of a remote video stream is decoded on the device.
- /// - Parameters:
- /// - engine: RTC engine instance
- /// - uid: user id
- /// - size: the height and width of the video frame
- /// - elapsed: Time elapsed (ms) from the local user calling JoinChannel method until the SDK triggers this callback.
- func rtcEngine(_ engine: AgoraRtcEngineKit, firstRemoteVideoDecodedOfUid uid:UInt, size:CGSize, elapsed:Int) {
+
+ func rtcEngine(_ engine: AgoraRtcEngineKit, didJoinedOfUid uid: UInt, elapsed: Int) {
isRemoteVideoRender = true
-
+
var parent: UIView = remoteContainer
if let it = localVideo, let view = it.view {
if view.superview == parent {
parent = localContainer
}
}
-
+
// Only one remote video view is available for this
// tutorial. Here we check if there exists a surface
// view tagged as this uid.
if remoteVideo != nil {
return
}
-
+
let view = UIView(frame: CGRect(origin: CGPoint(x: 0, y: 0), size: parent.frame.size))
remoteVideo = AgoraRtcVideoCanvas()
remoteVideo!.view = view
diff --git a/One-to-One-Video/Agora-iOS-Tutorial-Swift-1to1/README.md b/One-to-One-Video/Agora-iOS-Tutorial-Swift-1to1/README.md
index 8db963dd..50354e67 100644
--- a/One-to-One-Video/Agora-iOS-Tutorial-Swift-1to1/README.md
+++ b/One-to-One-Video/Agora-iOS-Tutorial-Swift-1to1/README.md
@@ -46,6 +46,10 @@ To build and run the sample application, get an App Id:
let Token: String? = <#Temp Token#>
```
+> To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+>
+> Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
+
### Integrate the Agora Video SDK
1. Download the [Agora Video SDK](https://www.agora.io/en/download/). Unzip the downloaded SDK package and copy the following files from the SDK `libs` folder into the sample application `Agora iOS Tutorial` folder.
diff --git a/One-to-One-Video/Agora-iOS-Tutorial-Swift-1to1/README.zh.md b/One-to-One-Video/Agora-iOS-Tutorial-Swift-1to1/README.zh.md
index 03dc4824..0e8c3c7c 100644
--- a/One-to-One-Video/Agora-iOS-Tutorial-Swift-1to1/README.zh.md
+++ b/One-to-One-Video/Agora-iOS-Tutorial-Swift-1to1/README.zh.md
@@ -45,6 +45,10 @@ iOS 系统版本升级至 14.0 版本后,用户首次使用集成了声网 iOS
let Token: String? = <#Temp Token#>
```
+> 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+>
+> 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
+
### 集成 Agora 视频 SDK
1. 在 [Agora.io SDK](https://www.agora.io/cn/blog/download/) 下载 **视频通话 + 直播 SDK**,解压后将其中**libs**文件夹中的下列文件拷贝到本项目的 Agora iOS Tutorial 文件夹下。
diff --git a/One-to-One-Video/Agora-iOS-Tutorial-SwiftUI-1to1/Agora-iOS-Tutorial-SwiftUI-1to1.xcodeproj/.xcodesamplecode.plist b/One-to-One-Video/Agora-iOS-Tutorial-SwiftUI-1to1/Agora-iOS-Tutorial-SwiftUI-1to1.xcodeproj/.xcodesamplecode.plist
deleted file mode 100644
index fae3b959..00000000
--- a/One-to-One-Video/Agora-iOS-Tutorial-SwiftUI-1to1/Agora-iOS-Tutorial-SwiftUI-1to1.xcodeproj/.xcodesamplecode.plist
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/One-to-One-Video/Agora-iOS-Tutorial-SwiftUI-1to1/Agora-iOS-Tutorial-SwiftUI-1to1.xcodeproj/project.pbxproj b/One-to-One-Video/Agora-iOS-Tutorial-SwiftUI-1to1/Agora-iOS-Tutorial-SwiftUI-1to1.xcodeproj/project.pbxproj
index 739e7667..01f9b29c 100644
--- a/One-to-One-Video/Agora-iOS-Tutorial-SwiftUI-1to1/Agora-iOS-Tutorial-SwiftUI-1to1.xcodeproj/project.pbxproj
+++ b/One-to-One-Video/Agora-iOS-Tutorial-SwiftUI-1to1/Agora-iOS-Tutorial-SwiftUI-1to1.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 52;
+ objectVersion = 50;
objects = {
/* Begin PBXBuildFile section */
@@ -18,22 +18,15 @@
38101C792386AB0C005484F9 /* AppID.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38101C782386AB0C005484F9 /* AppID.swift */; };
38101C8E2386C8D2005484F9 /* VideoEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38101C8D2386C8D2005484F9 /* VideoEngine.swift */; };
38101C902386CC84005484F9 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 38101C8F2386CC84005484F9 /* README.md */; };
- 8BF7443325A580A7007A0793 /* Agorafdkaac.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BF7442E25A580A7007A0793 /* Agorafdkaac.xcframework */; };
- 8BF7443425A580A7007A0793 /* AgoraCore.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BF7442F25A580A7007A0793 /* AgoraCore.xcframework */; };
- 8BF7443525A580A7007A0793 /* Agoraffmpeg.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BF7443025A580A7007A0793 /* Agoraffmpeg.xcframework */; };
- 8BF7443725A580A7007A0793 /* AgoraSoundTouch.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BF7443225A580A7007A0793 /* AgoraSoundTouch.xcframework */; };
- 8BF7443825A580AE007A0793 /* AgoraRtcKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BF7443125A580A7007A0793 /* AgoraRtcKit.xcframework */; };
- 8BF7443925A580AE007A0793 /* AgoraRtcKit.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8BF7443125A580A7007A0793 /* AgoraRtcKit.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
- A7911491246D120300E77A35 /* Embed Frameworks */ = {
+ 8BC30CBB25EBE865009E2E1B /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
- 8BF7443925A580AE007A0793 /* AgoraRtcKit.xcframework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
@@ -54,11 +47,6 @@
38101C782386AB0C005484F9 /* AppID.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppID.swift; sourceTree = ""; };
38101C8D2386C8D2005484F9 /* VideoEngine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoEngine.swift; sourceTree = ""; };
38101C8F2386CC84005484F9 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; };
- 8BF7442E25A580A7007A0793 /* Agorafdkaac.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = Agorafdkaac.xcframework; sourceTree = ""; };
- 8BF7442F25A580A7007A0793 /* AgoraCore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = AgoraCore.xcframework; sourceTree = ""; };
- 8BF7443025A580A7007A0793 /* Agoraffmpeg.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = Agoraffmpeg.xcframework; sourceTree = ""; };
- 8BF7443125A580A7007A0793 /* AgoraRtcKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = AgoraRtcKit.xcframework; sourceTree = ""; };
- 8BF7443225A580A7007A0793 /* AgoraSoundTouch.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = AgoraSoundTouch.xcframework; sourceTree = ""; };
A75811AA2407950B007EDAD3 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
A75811AC24079513007EDAD3 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
A7733D242407952F00483870 /* VideoToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VideoToolbox.framework; path = System/Library/Frameworks/VideoToolbox.framework; sourceTree = SDKROOT; };
@@ -77,11 +65,6 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 8BF7443525A580A7007A0793 /* Agoraffmpeg.xcframework in Frameworks */,
- 8BF7443325A580A7007A0793 /* Agorafdkaac.xcframework in Frameworks */,
- 8BF7443825A580AE007A0793 /* AgoraRtcKit.xcframework in Frameworks */,
- 8BF7443725A580A7007A0793 /* AgoraSoundTouch.xcframework in Frameworks */,
- 8BF7443425A580A7007A0793 /* AgoraCore.xcframework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -109,11 +92,6 @@
38101C5B2386AA55005484F9 /* Agora-iOS-Tutorial-SwiftUI-1to1 */ = {
isa = PBXGroup;
children = (
- 8BF7442F25A580A7007A0793 /* AgoraCore.xcframework */,
- 8BF7442E25A580A7007A0793 /* Agorafdkaac.xcframework */,
- 8BF7443025A580A7007A0793 /* Agoraffmpeg.xcframework */,
- 8BF7443125A580A7007A0793 /* AgoraRtcKit.xcframework */,
- 8BF7443225A580A7007A0793 /* AgoraSoundTouch.xcframework */,
38101C712386AADD005484F9 /* ContentView.swift */,
38101C8D2386C8D2005484F9 /* VideoEngine.swift */,
38101C732386AADD005484F9 /* VideoSessionView.swift */,
@@ -173,7 +151,7 @@
38101C552386AA55005484F9 /* Sources */,
38101C562386AA55005484F9 /* Frameworks */,
38101C572386AA55005484F9 /* Resources */,
- A7911491246D120300E77A35 /* Embed Frameworks */,
+ 8BC30CBB25EBE865009E2E1B /* Embed Frameworks */,
);
buildRules = (
);
diff --git a/One-to-One-Video/Agora-iOS-Tutorial-SwiftUI-1to1/Agora-iOS-Tutorial-SwiftUI-1to1/VideoEngine.swift b/One-to-One-Video/Agora-iOS-Tutorial-SwiftUI-1to1/Agora-iOS-Tutorial-SwiftUI-1to1/VideoEngine.swift
index cad75955..bcd7aa66 100644
--- a/One-to-One-Video/Agora-iOS-Tutorial-SwiftUI-1to1/Agora-iOS-Tutorial-SwiftUI-1to1/VideoEngine.swift
+++ b/One-to-One-Video/Agora-iOS-Tutorial-SwiftUI-1to1/Agora-iOS-Tutorial-SwiftUI-1to1/VideoEngine.swift
@@ -25,14 +25,6 @@ extension VideoEngine: AgoraRtcEngineDelegate {
}
func rtcEngine(_ engine: AgoraRtcEngineKit, didJoinedOfUid uid: UInt, elapsed: Int) {
- contentView?.isRemoteInSession = true
- }
-
- func rtcEngine(_ engine: AgoraRtcEngineKit, didOfflineOfUid uid: UInt, reason: AgoraUserOfflineReason) {
- contentView?.isRemoteInSession = false
- }
-
- func rtcEngine(_ engine: AgoraRtcEngineKit, firstRemoteVideoDecodedOfUid uid: UInt, size: CGSize, elapsed: Int) {
// Only one remote video view is available for this
// tutorial. Here we check if there exists a surface
// view tagged as this uid.
@@ -43,8 +35,13 @@ extension VideoEngine: AgoraRtcEngineDelegate {
agoraEngine.setupRemoteVideo(videoCanvas)
contentView?.isRemoteVideoMuted = false
+ contentView?.isRemoteInSession = true
}
+ func rtcEngine(_ engine: AgoraRtcEngineKit, didOfflineOfUid uid: UInt, reason: AgoraUserOfflineReason) {
+ contentView?.isRemoteInSession = false
+ }
+
func rtcEngine(_ engine: AgoraRtcEngineKit, didVideoMuted muted:Bool, byUid:UInt) {
contentView?.isRemoteVideoMuted = muted
}
diff --git a/One-to-One-Video/Agora-iOS-Tutorial-SwiftUI-1to1/README.md b/One-to-One-Video/Agora-iOS-Tutorial-SwiftUI-1to1/README.md
index ebe0beed..cd8deec1 100644
--- a/One-to-One-Video/Agora-iOS-Tutorial-SwiftUI-1to1/README.md
+++ b/One-to-One-Video/Agora-iOS-Tutorial-SwiftUI-1to1/README.md
@@ -44,6 +44,10 @@ To build and run the sample application, get an App Id:
let Token: String? = <#Temp Token#>
```
+> To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+>
+> Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
+
### Integrate the Agora Video SDK
1. Download the [Agora Video SDK](https://www.agora.io/en/download/). Unzip the downloaded SDK package and copy the following files from the SDK `libs` folder into the sample application `Agora-iOS-Tutorial-SwiftUI-1to1` folder.
diff --git a/One-to-One-Video/Agora-iOS-Tutorial-SwiftUI-1to1/README.zh.md b/One-to-One-Video/Agora-iOS-Tutorial-SwiftUI-1to1/README.zh.md
index b910e2f9..05400b8d 100644
--- a/One-to-One-Video/Agora-iOS-Tutorial-SwiftUI-1to1/README.zh.md
+++ b/One-to-One-Video/Agora-iOS-Tutorial-SwiftUI-1to1/README.zh.md
@@ -45,6 +45,10 @@ iOS 系统版本升级至 14.0 版本后,用户首次使用集成了声网 iOS
let Token: String? = <#Temp Token#>
```
+> 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+>
+> 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
+
### 集成 Agora 视频 SDK
1. 在 [Agora.io SDK](https://www.agora.io/cn/blog/download/) 下载 **视频通话 + 直播 SDK**,解压后将其中**libs**文件夹中的下列文件拷贝到本项目的 Agora-iOS-Tutorial-SwiftUI-1to1 文件夹下。
diff --git a/One-to-One-Video/Agora-macOS-Tutorial-Objective-C-1to1/Agora-Mac-Tutorial-Objective-C/VideoChatViewController.m b/One-to-One-Video/Agora-macOS-Tutorial-Objective-C-1to1/Agora-Mac-Tutorial-Objective-C/VideoChatViewController.m
index 9ce9e8ae..2cb19d52 100755
--- a/One-to-One-Video/Agora-macOS-Tutorial-Objective-C-1to1/Agora-Mac-Tutorial-Objective-C/VideoChatViewController.m
+++ b/One-to-One-Video/Agora-macOS-Tutorial-Objective-C-1to1/Agora-Mac-Tutorial-Objective-C/VideoChatViewController.m
@@ -84,7 +84,7 @@ - (void)joinChannel {
// The UID database is maintained by your app to track which users joined which channels. If not assigned (or set to 0), the SDK will allocate one and returns it in joinSuccessBlock callback. The App needs to record and maintain the returned value as the SDK does not maintain it.
}
-- (void)rtcEngine:(AgoraRtcEngineKit *)engine firstRemoteVideoDecodedOfUid:(NSUInteger)uid size: (CGSize)size elapsed:(NSInteger)elapsed {
+- (void)rtcEngine:(AgoraRtcEngineKit *)engine didJoinedOfUid:(NSUInteger)uid elapsed:(NSInteger)elapsed {
if (self.remoteVideo.hidden)
self.remoteVideo.hidden = false;
AgoraRtcVideoCanvas *videoCanvas = [[AgoraRtcVideoCanvas alloc] init];
diff --git a/One-to-One-Video/Agora-macOS-Tutorial-Objective-C-1to1/README.md b/One-to-One-Video/Agora-macOS-Tutorial-Objective-C-1to1/README.md
index 1b586b9b..32fff92a 100644
--- a/One-to-One-Video/Agora-macOS-Tutorial-Objective-C-1to1/README.md
+++ b/One-to-One-Video/Agora-macOS-Tutorial-Objective-C-1to1/README.md
@@ -37,6 +37,10 @@ To build and run the sample application, get an App Id:
NSString *const token = @"<#Temp Token#>";
```
+> To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+>
+> Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
+
### Integrate the Agora Video SDK
1. Download the [Agora Video SDK](https://www.agora.io/en/download/). Unzip the downloaded SDK package and copy the following files from the SDK `libs` folder into the sample application `Agora Mac Tutorial Objective-C` folder.
diff --git a/One-to-One-Video/Agora-macOS-Tutorial-Objective-C-1to1/README.zh.md b/One-to-One-Video/Agora-macOS-Tutorial-Objective-C-1to1/README.zh.md
index c70c6115..42a0375f 100644
--- a/One-to-One-Video/Agora-macOS-Tutorial-Objective-C-1to1/README.zh.md
+++ b/One-to-One-Video/Agora-macOS-Tutorial-Objective-C-1to1/README.zh.md
@@ -37,6 +37,10 @@
NSString *const token = @"<#Temp Token#>";
```
+> 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+>
+> 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
+
### 集成 Agora 视频 SDK
1. 在 [Agora.io SDK](https://www.agora.io/cn/blog/download/) 下载 **视频通话 + 直播 SDK**,解压后将其中**libs**文件夹中的下列文件拷贝到本项目的 Agora Mac Tutorial Objective-C 文件夹下。
@@ -44,7 +48,7 @@
- AgoraRtcEngineKit.framework
- AgoraRtcCryptoLoader.framework
- libcrypto.a
-
+
2. 打开 Xcode 后,运行本项目。
## 联系我们
diff --git a/One-to-One-Video/Agora-macOS-Tutorial-Swift-1to1/Agora-Mac-Tutorial-Swift.xcodeproj/project.pbxproj b/One-to-One-Video/Agora-macOS-Tutorial-Swift-1to1/Agora-Mac-Tutorial-Swift.xcodeproj/project.pbxproj
index f522a766..cde3b756 100644
--- a/One-to-One-Video/Agora-macOS-Tutorial-Swift-1to1/Agora-Mac-Tutorial-Swift.xcodeproj/project.pbxproj
+++ b/One-to-One-Video/Agora-macOS-Tutorial-Swift-1to1/Agora-Mac-Tutorial-Swift.xcodeproj/project.pbxproj
@@ -7,13 +7,6 @@
objects = {
/* Begin PBXBuildFile section */
- 03CE90AD25435D9F009945C0 /* AgoraRtcKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03CE90A925435D9F009945C0 /* AgoraRtcKit.framework */; };
- 03CE90AF25435DA2009945C0 /* Agorafdkaac.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03CE90A725435D9F009945C0 /* Agorafdkaac.framework */; };
- 03CE90B025435DA2009945C0 /* Agorafdkaac.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 03CE90A725435D9F009945C0 /* Agorafdkaac.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
- 03CE90B125435DA3009945C0 /* Agoraffmpeg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03CE90AA25435D9F009945C0 /* Agoraffmpeg.framework */; };
- 03CE90B225435DA3009945C0 /* Agoraffmpeg.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 03CE90AA25435D9F009945C0 /* Agoraffmpeg.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
- 03CE90B325435DA4009945C0 /* AgoraSoundTouch.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03CE90A825435D9F009945C0 /* AgoraSoundTouch.framework */; };
- 03CE90B425435DA4009945C0 /* AgoraSoundTouch.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 03CE90A825435D9F009945C0 /* AgoraSoundTouch.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
1A0466241D5E75A2004987C6 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A0466231D5E75A2004987C6 /* AppDelegate.swift */; };
1A0466261D5E75A2004987C6 /* VideoChatViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A0466251D5E75A2004987C6 /* VideoChatViewController.swift */; };
1A0466281D5E75A2004987C6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1A0466271D5E75A2004987C6 /* Assets.xcassets */; };
@@ -21,19 +14,27 @@
1A04664C1D5E7892004987C6 /* AppID.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A04664B1D5E7892004987C6 /* AppID.swift */; };
1A04664F1D5EA139004987C6 /* DeviceSelectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A04664E1D5EA139004987C6 /* DeviceSelectionViewController.swift */; };
38EF7E9A236827E500A6A483 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 38EF7E99236827E500A6A483 /* README.md */; };
- 8B1BE76F25AFEDD300AD49DB /* AgoraCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B5C64B725ADF37600FE3779 /* AgoraCore.framework */; };
- 8B1BE77025AFEDD300AD49DB /* AgoraCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B5C64B725ADF37600FE3779 /* AgoraCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
- 8B1BE77125AFEDD400AD49DB /* av1.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B5C64BA25ADF37700FE3779 /* av1.framework */; };
- 8B1BE77225AFEDD400AD49DB /* av1.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B5C64BA25ADF37700FE3779 /* av1.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
- 8B5C64BC25ADF37700FE3779 /* Agorafdkaac.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B5C64B625ADF37600FE3779 /* Agorafdkaac.framework */; };
- 8B5C64BE25ADF37700FE3779 /* Agoraffmpeg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B5C64B825ADF37600FE3779 /* Agoraffmpeg.framework */; };
- 8B5C64BF25ADF37700FE3779 /* AgoraRtcKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B5C64B925ADF37700FE3779 /* AgoraRtcKit.framework */; };
- 8B5C64C125ADF37700FE3779 /* AgoraSoundTouch.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B5C64BB25ADF37700FE3779 /* AgoraSoundTouch.framework */; };
+ 8B6FA1152614725400A4E4C3 /* Agorafdkaac.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA10C2614725400A4E4C3 /* Agorafdkaac.framework */; };
+ 8B6FA1162614725500A4E4C3 /* Agorafdkaac.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA10C2614725400A4E4C3 /* Agorafdkaac.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 8B6FA1172614725500A4E4C3 /* AgoraCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA10D2614725400A4E4C3 /* AgoraCore.framework */; };
+ 8B6FA1182614725500A4E4C3 /* AgoraCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA10D2614725400A4E4C3 /* AgoraCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 8B6FA1192614725500A4E4C3 /* AgoraRtcKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA10E2614725400A4E4C3 /* AgoraRtcKit.framework */; };
+ 8B6FA11A2614725500A4E4C3 /* AgoraRtcKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA10E2614725400A4E4C3 /* AgoraRtcKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 8B6FA11B2614725500A4E4C3 /* AgoraSoundTouch.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA10F2614725400A4E4C3 /* AgoraSoundTouch.framework */; };
+ 8B6FA11C2614725500A4E4C3 /* AgoraSoundTouch.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA10F2614725400A4E4C3 /* AgoraSoundTouch.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 8B6FA11D2614725500A4E4C3 /* AgoraJNDExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA1102614725400A4E4C3 /* AgoraJNDExtension.framework */; };
+ 8B6FA11E2614725500A4E4C3 /* AgoraJNDExtension.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA1102614725400A4E4C3 /* AgoraJNDExtension.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 8B6FA11F2614725500A4E4C3 /* Agoraffmpeg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA1112614725400A4E4C3 /* Agoraffmpeg.framework */; };
+ 8B6FA1202614725500A4E4C3 /* Agoraffmpeg.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA1112614725400A4E4C3 /* Agoraffmpeg.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 8B6FA1212614725500A4E4C3 /* AgoraDav1dExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA1122614725400A4E4C3 /* AgoraDav1dExtension.framework */; };
+ 8B6FA1222614725500A4E4C3 /* AgoraDav1dExtension.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA1122614725400A4E4C3 /* AgoraDav1dExtension.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 8B6FA1232614725500A4E4C3 /* AgoraAIDenoiseExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA1132614725400A4E4C3 /* AgoraAIDenoiseExtension.framework */; };
+ 8B6FA1242614725500A4E4C3 /* AgoraAIDenoiseExtension.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA1132614725400A4E4C3 /* AgoraAIDenoiseExtension.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 8B6FA1252614725500A4E4C3 /* av1.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA1142614725400A4E4C3 /* av1.framework */; };
+ 8B6FA1262614725500A4E4C3 /* av1.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8B6FA1142614725400A4E4C3 /* av1.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
A77E578824ADFE5900DD7670 /* Agora_Mac_Tutorial_Swift_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77E578724ADFE5900DD7670 /* Agora_Mac_Tutorial_Swift_Tests.swift */; };
A77E578F24AE00E200DD7670 /* VideoChatViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A0466251D5E75A2004987C6 /* VideoChatViewController.swift */; };
A77E579024AE00E500DD7670 /* AppID.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A04664B1D5E7892004987C6 /* AppID.swift */; };
- A7AD0F0024AEFA00008FFD5B /* AgoraRtcKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A7AD0EFF24AEFA00008FFD5B /* AgoraRtcKit.framework */; };
- A7AD0F0124AEFA00008FFD5B /* AgoraRtcKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A7AD0EFF24AEFA00008FFD5B /* AgoraRtcKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -53,12 +54,15 @@
dstPath = "";
dstSubfolderSpec = 10;
files = (
- A7AD0F0124AEFA00008FFD5B /* AgoraRtcKit.framework in Embed Frameworks */,
- 03CE90B225435DA3009945C0 /* Agoraffmpeg.framework in Embed Frameworks */,
- 03CE90B025435DA2009945C0 /* Agorafdkaac.framework in Embed Frameworks */,
- 8B1BE77225AFEDD400AD49DB /* av1.framework in Embed Frameworks */,
- 03CE90B425435DA4009945C0 /* AgoraSoundTouch.framework in Embed Frameworks */,
- 8B1BE77025AFEDD300AD49DB /* AgoraCore.framework in Embed Frameworks */,
+ 8B6FA11E2614725500A4E4C3 /* AgoraJNDExtension.framework in Embed Frameworks */,
+ 8B6FA11A2614725500A4E4C3 /* AgoraRtcKit.framework in Embed Frameworks */,
+ 8B6FA1182614725500A4E4C3 /* AgoraCore.framework in Embed Frameworks */,
+ 8B6FA1162614725500A4E4C3 /* Agorafdkaac.framework in Embed Frameworks */,
+ 8B6FA1222614725500A4E4C3 /* AgoraDav1dExtension.framework in Embed Frameworks */,
+ 8B6FA1202614725500A4E4C3 /* Agoraffmpeg.framework in Embed Frameworks */,
+ 8B6FA1262614725500A4E4C3 /* av1.framework in Embed Frameworks */,
+ 8B6FA11C2614725500A4E4C3 /* AgoraSoundTouch.framework in Embed Frameworks */,
+ 8B6FA1242614725500A4E4C3 /* AgoraAIDenoiseExtension.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
@@ -66,10 +70,6 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
- 03CE90A725435D9F009945C0 /* Agorafdkaac.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Agorafdkaac.framework; sourceTree = ""; };
- 03CE90A825435D9F009945C0 /* AgoraSoundTouch.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AgoraSoundTouch.framework; sourceTree = ""; };
- 03CE90A925435D9F009945C0 /* AgoraRtcKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AgoraRtcKit.framework; sourceTree = ""; };
- 03CE90AA25435D9F009945C0 /* Agoraffmpeg.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Agoraffmpeg.framework; sourceTree = ""; };
1A0466201D5E75A2004987C6 /* Agora-Mac-Tutorial-Swift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Agora-Mac-Tutorial-Swift.app"; sourceTree = BUILT_PRODUCTS_DIR; };
1A0466231D5E75A2004987C6 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
1A0466251D5E75A2004987C6 /* VideoChatViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoChatViewController.swift; sourceTree = ""; };
@@ -79,16 +79,18 @@
1A04664B1D5E7892004987C6 /* AppID.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppID.swift; sourceTree = ""; };
1A04664E1D5EA139004987C6 /* DeviceSelectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceSelectionViewController.swift; sourceTree = ""; };
38EF7E99236827E500A6A483 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; };
- 8B5C64B625ADF37600FE3779 /* Agorafdkaac.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Agorafdkaac.framework; sourceTree = ""; };
- 8B5C64B725ADF37600FE3779 /* AgoraCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AgoraCore.framework; sourceTree = ""; };
- 8B5C64B825ADF37600FE3779 /* Agoraffmpeg.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Agoraffmpeg.framework; sourceTree = ""; };
- 8B5C64B925ADF37700FE3779 /* AgoraRtcKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AgoraRtcKit.framework; sourceTree = ""; };
- 8B5C64BA25ADF37700FE3779 /* av1.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = av1.framework; sourceTree = ""; };
- 8B5C64BB25ADF37700FE3779 /* AgoraSoundTouch.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AgoraSoundTouch.framework; sourceTree = ""; };
+ 8B6FA10C2614725400A4E4C3 /* Agorafdkaac.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Agorafdkaac.framework; path = ../../libs/Agorafdkaac.framework; sourceTree = ""; };
+ 8B6FA10D2614725400A4E4C3 /* AgoraCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraCore.framework; path = ../../libs/AgoraCore.framework; sourceTree = ""; };
+ 8B6FA10E2614725400A4E4C3 /* AgoraRtcKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraRtcKit.framework; path = ../../libs/AgoraRtcKit.framework; sourceTree = ""; };
+ 8B6FA10F2614725400A4E4C3 /* AgoraSoundTouch.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraSoundTouch.framework; path = ../../libs/AgoraSoundTouch.framework; sourceTree = ""; };
+ 8B6FA1102614725400A4E4C3 /* AgoraJNDExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraJNDExtension.framework; path = ../../libs/AgoraJNDExtension.framework; sourceTree = ""; };
+ 8B6FA1112614725400A4E4C3 /* Agoraffmpeg.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Agoraffmpeg.framework; path = ../../libs/Agoraffmpeg.framework; sourceTree = ""; };
+ 8B6FA1122614725400A4E4C3 /* AgoraDav1dExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraDav1dExtension.framework; path = ../../libs/AgoraDav1dExtension.framework; sourceTree = ""; };
+ 8B6FA1132614725400A4E4C3 /* AgoraAIDenoiseExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraAIDenoiseExtension.framework; path = ../../libs/AgoraAIDenoiseExtension.framework; sourceTree = ""; };
+ 8B6FA1142614725400A4E4C3 /* av1.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = av1.framework; path = ../../libs/av1.framework; sourceTree = ""; };
A77E578524ADFE5900DD7670 /* Agora-Mac-Tutorial-Swift-Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Agora-Mac-Tutorial-Swift-Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
A77E578724ADFE5900DD7670 /* Agora_Mac_Tutorial_Swift_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Agora_Mac_Tutorial_Swift_Tests.swift; sourceTree = ""; };
A77E578924ADFE5900DD7670 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
- A7AD0EFF24AEFA00008FFD5B /* AgoraRtcKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraRtcKit.framework; path = "Agora-Mac-Tutorial-Swift/AgoraRtcKit.framework"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -96,17 +98,15 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 8B1BE76F25AFEDD300AD49DB /* AgoraCore.framework in Frameworks */,
- 8B5C64BF25ADF37700FE3779 /* AgoraRtcKit.framework in Frameworks */,
- 8B1BE77125AFEDD400AD49DB /* av1.framework in Frameworks */,
- 8B5C64BE25ADF37700FE3779 /* Agoraffmpeg.framework in Frameworks */,
- 8B5C64C125ADF37700FE3779 /* AgoraSoundTouch.framework in Frameworks */,
- 03CE90AD25435D9F009945C0 /* AgoraRtcKit.framework in Frameworks */,
- 03CE90B325435DA4009945C0 /* AgoraSoundTouch.framework in Frameworks */,
- A7AD0F0024AEFA00008FFD5B /* AgoraRtcKit.framework in Frameworks */,
- 8B5C64BC25ADF37700FE3779 /* Agorafdkaac.framework in Frameworks */,
- 03CE90B125435DA3009945C0 /* Agoraffmpeg.framework in Frameworks */,
- 03CE90AF25435DA2009945C0 /* Agorafdkaac.framework in Frameworks */,
+ 8B6FA11D2614725500A4E4C3 /* AgoraJNDExtension.framework in Frameworks */,
+ 8B6FA1192614725500A4E4C3 /* AgoraRtcKit.framework in Frameworks */,
+ 8B6FA1172614725500A4E4C3 /* AgoraCore.framework in Frameworks */,
+ 8B6FA1152614725400A4E4C3 /* Agorafdkaac.framework in Frameworks */,
+ 8B6FA1212614725500A4E4C3 /* AgoraDav1dExtension.framework in Frameworks */,
+ 8B6FA11F2614725500A4E4C3 /* Agoraffmpeg.framework in Frameworks */,
+ 8B6FA1252614725500A4E4C3 /* av1.framework in Frameworks */,
+ 8B6FA11B2614725500A4E4C3 /* AgoraSoundTouch.framework in Frameworks */,
+ 8B6FA1232614725500A4E4C3 /* AgoraAIDenoiseExtension.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -143,16 +143,6 @@
1A0466221D5E75A2004987C6 /* Agora-Mac-Tutorial-Swift */ = {
isa = PBXGroup;
children = (
- 8B5C64B725ADF37600FE3779 /* AgoraCore.framework */,
- 03CE90A725435D9F009945C0 /* Agorafdkaac.framework */,
- 03CE90AA25435D9F009945C0 /* Agoraffmpeg.framework */,
- 03CE90A925435D9F009945C0 /* AgoraRtcKit.framework */,
- 03CE90A825435D9F009945C0 /* AgoraSoundTouch.framework */,
- 8B5C64B625ADF37600FE3779 /* Agorafdkaac.framework */,
- 8B5C64B825ADF37600FE3779 /* Agoraffmpeg.framework */,
- 8B5C64B925ADF37700FE3779 /* AgoraRtcKit.framework */,
- 8B5C64BB25ADF37700FE3779 /* AgoraSoundTouch.framework */,
- 8B5C64BA25ADF37700FE3779 /* av1.framework */,
1A0466251D5E75A2004987C6 /* VideoChatViewController.swift */,
1A04664E1D5EA139004987C6 /* DeviceSelectionViewController.swift */,
1A04664B1D5E7892004987C6 /* AppID.swift */,
@@ -165,7 +155,15 @@
1A0466491D5E7718004987C6 /* Frameworks */ = {
isa = PBXGroup;
children = (
- A7AD0EFF24AEFA00008FFD5B /* AgoraRtcKit.framework */,
+ 8B6FA1132614725400A4E4C3 /* AgoraAIDenoiseExtension.framework */,
+ 8B6FA10D2614725400A4E4C3 /* AgoraCore.framework */,
+ 8B6FA1122614725400A4E4C3 /* AgoraDav1dExtension.framework */,
+ 8B6FA10C2614725400A4E4C3 /* Agorafdkaac.framework */,
+ 8B6FA1112614725400A4E4C3 /* Agoraffmpeg.framework */,
+ 8B6FA1102614725400A4E4C3 /* AgoraJNDExtension.framework */,
+ 8B6FA10E2614725400A4E4C3 /* AgoraRtcKit.framework */,
+ 8B6FA10F2614725400A4E4C3 /* AgoraSoundTouch.framework */,
+ 8B6FA1142614725400A4E4C3 /* av1.framework */,
);
name = Frameworks;
sourceTree = "";
@@ -462,6 +460,7 @@
PRODUCT_BUNDLE_IDENTIFIER = "io.agora.Agora-Mac-Tutorial-Swift";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_INCLUDE_PATHS = "";
SWIFT_OBJC_BRIDGING_HEADER = "";
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
SWIFT_VERSION = 5.0;
@@ -491,6 +490,7 @@
PRODUCT_BUNDLE_IDENTIFIER = "io.agora.Agora-Mac-Tutorial-Swift";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_INCLUDE_PATHS = "";
SWIFT_OBJC_BRIDGING_HEADER = "";
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
SWIFT_VERSION = 5.0;
diff --git a/One-to-One-Video/Agora-macOS-Tutorial-Swift-1to1/Agora-Mac-Tutorial-Swift/VideoChatViewController.swift b/One-to-One-Video/Agora-macOS-Tutorial-Swift-1to1/Agora-Mac-Tutorial-Swift/VideoChatViewController.swift
index 9ecd28da..c991009c 100755
--- a/One-to-One-Video/Agora-macOS-Tutorial-Swift-1to1/Agora-Mac-Tutorial-Swift/VideoChatViewController.swift
+++ b/One-to-One-Video/Agora-macOS-Tutorial-Swift-1to1/Agora-Mac-Tutorial-Swift/VideoChatViewController.swift
@@ -205,13 +205,7 @@ class VideoChatViewController: NSViewController {
extension VideoChatViewController: AgoraRtcEngineDelegate {
- /// Callback to handle the event when the first frame of a remote video stream is decoded on the device.
- /// - Parameters:
- /// - engine: RTC engine instance
- /// - uid: user id
- /// - size: the height and width of the video frame
- /// - elapsed: Time elapsed (ms) from the local user calling JoinChannel method until the SDK triggers this callback.
- func rtcEngine(_ engine: AgoraRtcEngineKit, firstRemoteVideoDecodedOfUid uid:UInt, size:CGSize, elapsed:Int) {
+ func rtcEngine(_ engine: AgoraRtcEngineKit, didJoinedOfUid uid: UInt, elapsed: Int) {
if (remoteVideo.isHidden) {
remoteVideo.isHidden = false
}
diff --git a/One-to-One-Video/Agora-macOS-Tutorial-Swift-1to1/README.md b/One-to-One-Video/Agora-macOS-Tutorial-Swift-1to1/README.md
index 6c259463..55d6924b 100644
--- a/One-to-One-Video/Agora-macOS-Tutorial-Swift-1to1/README.md
+++ b/One-to-One-Video/Agora-macOS-Tutorial-Swift-1to1/README.md
@@ -37,6 +37,10 @@ To build and run the sample application, get an App Id:
let Token: String? = <#Temp Token#>
```
+> To ensure communication security, Agora uses tokens (dynamic keys) to authenticate users joining a channel.
+>
+> Temporary tokens are for demonstration and testing purposes only and remain valid for 24 hours. In a production environment, you need to deploy your own server for generating tokens. See [Generate a Token](https://docs.agora.io/en/Interactive Broadcast/token_server)for details.
+
### Integrate the Agora Video SDK
1. Download the [Agora Video SDK](https://www.agora.io/en/download/). Unzip the downloaded SDK package and copy the following files from the SDK `libs` folder into the sample application `Agora Mac Tutorial Swift` folder.
diff --git a/One-to-One-Video/Agora-macOS-Tutorial-Swift-1to1/README.zh.md b/One-to-One-Video/Agora-macOS-Tutorial-Swift-1to1/README.zh.md
index 20b4ef09..340b5eaa 100644
--- a/One-to-One-Video/Agora-macOS-Tutorial-Swift-1to1/README.zh.md
+++ b/One-to-One-Video/Agora-macOS-Tutorial-Swift-1to1/README.zh.md
@@ -37,6 +37,10 @@
let Token: String? = <#Temp Token#>
```
+> 为提高项目的安全性,Agora 使用 Token(动态密钥)对即将加入频道的用户进行鉴权。
+>
+> 临时 Token 仅作为演示和测试用途。在生产环境中,你需要自行部署服务器签发 Token,详见[生成 Token](https://docs.agora.io/cn/Interactive Broadcast/token_server)。
+
### 集成 Agora 视频 SDK
1. 在 [Agora.io SDK](https://www.agora.io/cn/blog/download/) 下载 **视频通话 + 直播 SDK**,解压后将其中**libs**文件夹中的下列文件拷贝到本项目的 Agora Mac Tutorial Swift 文件夹下。