# 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 NSCameraUsageDescription 需要访问摄像头用于视频通话 NSMicrophoneUsageDescription 需要访问麦克风用于语音通话 ``` --- ## 🚀 快速开始 ### 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` 回调后需结束通话重新发起 - 视频处理回调避免耗时操作