SellyCloudSDK_demo/README.md

315 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SellyRTC iOS SDK 接入文档
本文档介绍如何使用 **SellyRTCSession** 快速集成一对一或多人音视频通话功能,包括:
- Session 创建与基础通话流程
- 本地 / 远端画面渲染
- 音视频控制与通话路由
- 屏幕分享与外部视频源推流
- 自定义消息、统计与 Token 机制
- 连接状态与事件回调
---
## 📑 目录
1. [准备工作](#准备工作)
2. [快速开始](#快速开始)
3. [常用功能](#常用功能)
4. [屏幕分享与外部视频源](#屏幕分享与外部视频源)
5. [视频帧前后处理](#视频帧前后处理)
6. [事件回调Delegate](#事件回调delegate)
7. [通话统计](#通话统计)
8. [Token 过期机制](#token-过期机制)
9. [连接状态说明](#连接状态说明)
10. [常见问题](#常见问题)
---
# 🔧 准备工作
1. 集成 SellyRTC.framework
2. 引入头文件:
```objc
#import <SellyRTC/SellyRTC.h>
```
3. 在真机运行(摄像头/麦克风需要硬件支持)
---
# 🚀 快速开始
## 1. 创建 Session
```objc
/// @param isP2p YES 表示一对一通话P2P 直连NO 表示多人通话(房间 / 会议模式)
///
/// P2P 模式YES
/// - 点对点直连,端到端延迟更低
/// - 适合普通一对一音视频通话
self.session = [[SellyRTCSession alloc] initWithType:YES];
self.session.delegate = self;
```
---
## 2. 设置本地和远端画布
```objc
SellyRtcVideoCanvas *local = [SellyRtcVideoCanvas new];
local.view = self.localView;
[self.session setLocalCanvas:local];
SellyRtcVideoCanvas *remote = [SellyRtcVideoCanvas new];
remote.view = self.remoteView;
remote.userId = @"remoteUserId";
[self.session setRemoteCanvas:remote];
```
---
## 3. 配置视频参数(可选)
```objc
SellyRTCVideoConfiguration *config = [SellyRTCVideoConfiguration defaultConfig];
config.width = 720;
config.height = 1280;
config.frameRate = 24;
self.session.videoConfig = config;
```
---
## 4. 打开本地预览
```objc
[self.session startPreview];
```
关闭:
```objc
[self.session stopPreview];
```
---
## 5. 加入频道(开始通话)
```objc
[self.session startWithChannelId:@"room_123" token:@"your-token"];
```
---
## 6. 结束通话
```objc
[self.session end];
```
---
# 🎛 常用功能
## 开关本地视频
```objc
[self.session enableLocalVideo:YES];
[self.session enableLocalVideo:NO];
```
## 开关本地音频
```objc
[self.session enableLocalAudio:NO];
[self.session enableLocalAudio:YES];
```
## 切换摄像头
```objc
[self.session switchCamera];
```
## 静音远端
```objc
[self.session muteRemoteAudioStream:@"remoteUser" mute:YES];
```
## 音频输出(听筒/扬声器)
```objc
[self.session setAudioOutput:AVAudioSessionPortOverrideSpeaker];
```
## 发送自定义消息
```objc
[self.session sendMessage:@"hello" completion:^(NSError *error) {}];
```
## 更新 Token
```objc
[self.session renewToken:newToken];
```
---
# 🖥 屏幕分享与外部视频源
## 开启屏幕分享
```objc
[self.session startScreenCapture];
```
屏幕分享状态回调:
```objc
- (void)rtcSession:(SellyRTCSession *)session onScreenShareStatusChanged:(SellyScreenShareState)state {}
```
---
## 外部推流(自定义采集)
```objc
[self.session enableLocalVideo:YES];
[self.session pushExternalVideoFrame:pixelBuffer];
```
常用于游戏画面/ReplayKit 输出/第三方渲染等。
---
# 🎥 视频帧前后处理
## 本地采集前处理(美颜/滤镜等)
```objc
- (CVPixelBufferRef)rtcSession:(SellyRTCSession *)session onCaptureVideoFrame:(CVPixelBufferRef)pixelBuffer {
return pixelBuffer;
}
```
## 远端渲染前处理(做 AI/贴纸/录像)
```objc
- (BOOL)rtcSession:(SellyRTCSession *)session onRenderVideoFrame:(SellyRTCVideoFrame *)videoFrame userId:(NSString *)userId {
return YES;
}
```
---
# 📡 事件回调Delegate
## 通话严重错误
```objc
- (void)rtcSession:(SellyRTCSession *)session onError:(NSError *)error {}
```
## 远端音视频开关
```objc
- (void)rtcSession:(SellyRTCSession *)s videoEnabled:(BOOL)enabled userId:(NSString *)userId {}
```
## 自定义消息
```objc
- (void)rtcSession:(SellyRTCSession *)s didReceiveMessage:(NSString *)msg userId:(NSString *)uid {}
```
## 流级连接状态
```objc
- (void)rtcSession:(SellyRTCSession *)s connectionStateChanged:(SellyRTCConnectState)state userId:(NSString *)uid {}
```
## 会话级连接状态
```objc
- (void)rtcSession:(SellyRTCSession *)s onRoomConnectionStateChanged:(SellyRoomConnectionState)state {}
```
## 用户加入/离开
```objc
- (void)rtcSession:(SellyRTCSession *)s onUserJoined:(NSString *)uid {}
- (void)rtcSession:(SellyRTCSession *)s onUserLeave:(NSString *)uid {}
```
## 通话时长
```objc
- (void)rtcSession:(SellyRTCSession *)s onDuration:(NSInteger)duration {}
```
## Token 回调
```objc
- (void)rtcSession:(SellyRTCSession *)s tokenWillExpire:(NSString *)token {}
- (void)rtcSession:(SellyRTCSession *)s tokenExpired:(NSString *)token {}
```
## 屏幕分享状态
```objc
- (void)rtcSession:(SellyRTCSession *)s onScreenShareStatusChanged:(SellyScreenShareState)state {}
```
---
# 📊 通话统计
```objc
- (void)rtcSession:(SellyRTCSession *)s onStats:(SellyRTCP2pStats *)stats userId:(NSString *)uid {}
```
---
# 🔑 Token 过期机制
- Token 将在 **60 秒前** 触发 `tokenWillExpire`
- Token 过期后通话继续,但重连会失败
- 请及时调用 `renewToken:`
---
# 🌐 连接状态说明
`connectionState` 可读取当前房间状态:
- Disconnected
- Connecting
- Connected
- Reconnecting
---
# ❓ 常见问题 FAQ
### Q远端画面不显示怎么办
检查:
1. 是否设置了正确的 `remoteCanvas.userId`
2. 是否 addSubview 到界面
3. 是否在 onUserJoined 后调用 setRemoteCanvas
### Q如何实现摄像头与屏幕分享切换
1. 开启摄像头 → enableLocalVideo:YES
2. 开启屏幕分享 → startScreenCapture
3. 收到屏幕分享结束 → 恢复摄像头
---