Files
SellyCloudSDK_demo/SellySDK_音视频通话接入文档.md
2026-03-01 15:59:27 +08:00

263 lines
5.2 KiB
Markdown
Raw Permalink 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 接入文档
本文档用于指导 **App 开发者** 快速接入 SellyRTC iOS SDK实现一对一或多人实时音视频通话能力。
SDK 核心以 `SellyRTCSession` 为中心,通过 `SellyRTCSessionDelegate` 回调通话状态、用户事件、音视频状态及异常。
---
## 📑 目录
1. [准备工作](#准备工作)
2. [快速开始](#快速开始)
3. [基础通话流程](#基础通话流程)
4. [常用功能](#常用功能)
5. [屏幕分享与外部视频源](#屏幕分享与外部视频源)
6. [视频帧前后处理](#视频帧前后处理)
7. [事件回调Delegate](#事件回调delegate)
8. [通话统计](#通话统计)
9. [Token 机制](#token-机制)
10. [常见问题FAQ](#常见问题faq)
---
## 🔧 准备工作
### 1. 环境要求
- iOS 13 及以上
- 真机运行(需摄像头 / 麦克风)
### 2. 权限配置Info.plist
```xml
<key>NSCameraUsageDescription</key>
<string>需要访问摄像头用于视频通话</string>
<key>NSMicrophoneUsageDescription</key>
<string>需要访问麦克风用于语音通话</string>
```
---
## 🚀 快速开始
### 1. 创建 Session
```objc
/// isP2p = YES一对一通话P2P
/// isP2p = NO :多人会议
self.session = [[SellyRTCSession alloc] initWithType:YES];
self.session.delegate = self;
```
> ⚠️ 注意:必须使用 `initWithType:``init/new` 不可用。
---
### 2. 配置视频参数(必须在 start 前)
```objc
SellyRTCVideoConfiguration *config = [SellyRTCVideoConfiguration defaultConfig];
config.maxBitrate = 800000;
config.minBitrate = 300000;
config.preferPosition = AVCaptureDevicePositionFront;
self.session.videoConfig = config;
```
---
### 3. 设置本地 / 远端画布
```objc
SellyRTCVideoCanvas *local = [SellyRTCVideoCanvas new];
local.view = self.localView;
local.userId = @"local";
[self.session setLocalCanvas:local];
```
```objc
SellyRTCVideoCanvas *remote = [SellyRTCVideoCanvas new];
remote.view = self.remoteView;
remote.userId = @"remoteUserId";
[self.session setRemoteCanvas:remote];
```
> 建议在 `onUserJoined:` 回调后再绑定远端画布。
---
### 4. 本地预览(可选)
```objc
[self.session startPreview];
```
---
### 5. 加入通话
```objc
[self.session startWithChannelId:@"room_id" token:@"token"];
```
结束通话:
```objc
[self.session end];
```
---
## 🔄 基础通话流程
1. 创建 `SellyRTCSession`
2. 设置 `delegate`
3. 配置 `videoConfig`
4. 设置本地画布
5. `startPreview`(可选)
6. `startWithChannelId:token:`
7. `onUserJoined` → 设置远端画布
8. 通话中控制音视频
9. `end` 结束并释放
---
## 🎛 常用功能
### 本地音视频控制
```objc
[self.session enableLocalVideo:YES];
[self.session enableLocalAudio:NO];
```
### 切换摄像头
```objc
[self.session switchCamera];
```
### 静音远端音频
```objc
[self.session muteRemoteAudioStream:@"remoteUserId" mute:YES];
```
### 音频输出(听筒 / 扬声器)
```objc
[self.session setAudioOutput:AVAudioSessionPortOverrideSpeaker];
```
> 若存在蓝牙/耳机,建议使用系统音频路由控件。
---
### 自定义消息
```objc
[self.session sendMessage:@"hello" completion:^(NSError *error) {}];
```
---
## 🖥 屏幕分享与外部视频源
### 开启屏幕分享
```objc
[self.session startScreenCapture];
```
```objc
- (void)rtcSession:(SellyRTCSession *)session
onScreenShareStatusChanged:(SellyScreenShareState)state;
```
---
### 外部视频源推送
```objc
[self.session enableLocalVideo:YES];
[self.session pushExternalVideoFrame:pixelBuffer];
```
---
## 🎥 视频帧前后处理
### 本地采集前处理(美颜/滤镜)
```objc
- (CVPixelBufferRef)rtcSession:(SellyRTCSession *)session
onCaptureVideoFrame:(CVPixelBufferRef)pixelBuffer {
return pixelBuffer;
}
```
### 远端渲染回调
```objc
- (BOOL)rtcSession:(SellyRTCSession *)session
onRenderVideoFrame:(SellyRTCVideoFrame *)videoFrame
userId:(NSString *)userId {
return YES;
}
```
---
## 📡 事件回调Delegate
```objc
- (void)rtcSession:(SellyRTCSession *)session onError:(NSError *)error;
- (void)rtcSession:(SellyRTCSession *)session onUserJoined:(NSString *)userId;
- (void)rtcSession:(SellyRTCSession *)session onUserLeave:(NSString *)userId;
- (void)rtcSession:(SellyRTCSession *)session didReceiveMessage:(NSString *)msg userId:(NSString *)uid;
```
---
## 📊 通话统计
```objc
- (void)rtcSession:(SellyRTCSession *)session
onStats:(SellyRTCStats *)stats
userId:(NSString *)userId;
```
---
## 🔑 Token 机制
```objc
- (void)rtcSession:(SellyRTCSession *)session tokenWillExpire:(NSString *)token;
- (void)rtcSession:(SellyRTCSession *)session tokenExpired:(NSString *)token;
```
```objc
[self.session renewToken:newToken];
```
---
## ❓ 常见问题FAQ
### Q远端画面不显示
1. 是否设置了正确的 `remoteCanvas.userId`
2. 是否在 `onUserJoined` 后调用
3. 是否正确 addSubview
### Q屏幕分享如何与摄像头切换
- 开启屏幕分享:`startScreenCapture`
- 屏幕分享结束后重新 `enableLocalVideo:YES`
---
## 📌 注意事项
- `videoConfig` **必须在 start 前设置**
- `onError` 回调后需结束通话重新发起
- 视频处理回调避免耗时操作