human: 如何处理七牛云的实时音视频迁移指南

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > iOS >迁移指南

#  迁移指南

最近更新时间: 2022-06-30 17:18:34

QNRTC iOS SDK v5.x 是基于 v4.x 版本开发的全量重构版本，**接口与 v4.x 的部分接口不兼容** ，**不兼容 v3.x 版本**
。

请在确认好目前使用的 SDK 版本后，根据实际需要，选择参照 [v4.x 升级 v5.x
指南](https://developer.qiniu.com/rtc/development_guidelines/11949/migration-
guide-iOS-v5#1) 或 [v3.x 升级 v5.x
指南](https://developer.qiniu.com/rtc/development_guidelines/11949/migration-
guide-iOS-v5#2) 进行版本升级。

# v4.x 升级 v5.x 指南

>   * **由于 QNRTC iOS SDK v5.x 主要接口基本兼容 v4.x 接口** ，因此，如果您是 v4.x
> 版本用户并希望升级到最新版本以获得更好的用户体验，可参考这里提供的升级指南进行迁版本升级。
>

## 改动简介

5.x 版本优化了 SDK 部分非主要接口调用逻辑，主要改动如下：

### 核心系统类 RTC

4.x 版本相关 RTC 销毁，可以通过 dealloc 方法中示例代码如下：

    
    
    // RTC deinit 销毁
    - (void)dealloc {
        [QNRTC deinit];
        NSLog(@"[dealloc]==> %@", self.description);
    }
    

5.x 版本 [deinit](https://developer.qiniu.com/rtc/api/8834/QNRTC-iOS#deinit)
方法，**请务必在 dealloc 前调用** ，由于 dealloc 是自发调用，内部可能因为某些资源还未释放，**需要手动主动调用释放**
，示例代码如下：

    
    
    // RTC deinit 销毁
    - (void)viewDidDisappear:(BOOL)animated {
        [QNRTC deinit];
        [super viewDidDisappear:animated];
    }
    

另外，5.x 版本为保证方法名的命名严谨，重命名部分接口 API，**注意实际功能及使用方式不变** ，涉及的接口列出如下：

    
    
    // 4.x 初始化 QNRTC，务必使用
    + (void)configRTC:(QNRTCConfiguration *)configuration;
    // 5.x 方法重命名后，如下所示：
    + (void)initRTC:(QNRTCConfiguration *)configuration;
    
    
    
    // 4.x 设置 QNRTCDelegate 代理回调
    + (void)setAudioRouteDelegate:(id <QNRTCDelegate>)delegate;
    // 5.x 方法重命名后，如下所示：
    + (void)setRTCDelegate:(id <QNRTCDelegate>)delegate;
    
    
    
    // 4.x 音频输出设备变更的回调
    - (void)QNRTCDidChangeRTCAudioOutputToDevice:(QNAudioDeviceType)deviceType;
    // 5.x 方法重命名后，如下所示：
    - (void)RTCDidAudioRouteChanged:(QNAudioDeviceType)deviceType;
    

### 核心引擎 Client

4.x 版本支持通过远端的 userID, 直接获取对应的远端 track 列表，示例代码如下：

    
    
    // 获取指定用户已被自己订阅的 tracks。
    NSArray * trackArray =  [self.client getSubscribedTracks:remoteUserId];
    

5.x 版本删除此方法，改为通过
[QNRemoteUser](https://developer.qiniu.com/rtc/api/8835/QNRemoteUser-iOS) 的
audioTrack 和 videoTrack 属性来获取

4.x 版本支持通过传递 userID，直接获取对应用户的网络质量信息，示例代码如下：

    
    
    // 获取指定用户的网络质量信息。
    QNNetworkQuality *quality =  [self.client getUserNetworkQuality:remoteUserId];
    

5.x 版本更改此方法为直接获取当前订阅的所有远端用户网络质量，具体的
[QNNetworkQuality](https://developer.qiniu.com/rtc/api/8869/QNNetworkQuality-
iOS) 可通过 `key` 获取，无需再传值获取，示例代码如下：

    
    
    // 获取当前订阅的所有远端用户网络质量。
    NSDictionary *dic =  [self.client getUserNetworkQuality];
    

5.x 版本在
[QNRTCClientDelegate](https://developer.qiniu.com/rtc/api/9248/QNRTCClientDelegate)
新增回调本地网络质量信息

    
    
    - (void)RTCClient:(QNRTCClient *)client didNetworkQualityNotified:(QNNetworkQuality *)quality;
    

另外，
[QNRTCClientDelegate](https://developer.qiniu.com/rtc/api/9248/QNRTCClientDelegate)
在 4.x 基础上，为保证方法名的命名严谨，重命名回调接口 API，**注意实际功能及使用方式不变** ，涉及的回调接口列出如下：

    
    
    // 4.x 成功创建转推/合流转推任务的回调
    - (void)RTCClient:(QNRTCClient *)client didStartLiveStreamingWith:(NSString *)streamID {}
    // 5.x 方法重命名后，如下所示：
    - (void)RTCClient:(QNRTCClient *)client didStartLiveStreaming:(NSString *)streamID {}
    
    
    
    // 4.x 停止转推/合流转推任务的回调
    - (void)RTCClient:(QNRTCClient *)client didStopLiveStreamingWith:(NSString *)streamID {}
    // 5.x 方法重命名后，如下所示：
    - (void)RTCClient:(QNRTCClient *)client didStopLiveStreaming:(NSString *)streamID {}
    
    
    
    // 4.x 合流转推出错的回调
    - (void)RTCClient:(QNRTCClient *)client didErrorLiveStreamingWith:(NSString *)streamID errorInfo:(QNLiveStreamingErrorInfo *)errorInfo {}
    // 5.x 方法重命名后，如下所示：
    - (void)RTCClient:(QNRTCClient *)client didErrorLiveStreaming:(NSString *)streamID errorInfo:(QNLiveStreamingErrorInfo *)errorInfo {}
    

### 本地 Track 视频数据回调

4.x 的版本，目前只有
[QNCameraVideoTrack](https://developer.qiniu.com/rtc/api/8852/QNCameraVideoTrack-
iOS) 支持获取对应的视频数据帧代理回调，示例代码如下：

    
    
    // 摄像头视频 Track 数据回调
    - (void)cameraVideoTrack:(QNCameraVideoTrack *)cameraVideoTrack didGetSampleBuffer:(CMSampleBufferRef)sampleBuffer {
    
    }
    

5.x 版本转移至
[QNLocalVideoTrack](https://developer.qiniu.com/rtc/api/8849/QNLocalVideoTrack-
iOS) 中，支持
[QNLocalVideoTrack](https://developer.qiniu.com/rtc/api/8849/QNLocalVideoTrack-
iOS)
子类，包括：[QNCameraVideoTrack](https://developer.qiniu.com/rtc/api/8852/QNCameraVideoTrack-
iOS);
[QNScreenVideoTrack](https://developer.qiniu.com/rtc/api/8850/QNScreenVideoTrack-
iOS);
[QNCustomVideoTrack](https://developer.qiniu.com/rtc/api/8853/QNCustomVideoTrack-
iOS) 等子类的本地渲染，以及对应数据帧回调，示例代码如下：

    
    
    // 本地视频 Track 数据回调
    - (void)localVideoTrack:(QNLocalVideoTrack *)localVideoTrack didGetPixelBuffer:(CVPixelBufferRef)pixelBuffer {
    
    }
    

### 本地 Track 音频数据回调

4.x 版本，目前只有
[QNMicrophoneAudioTrack](https://developer.qiniu.com/rtc/api/8855/QNMicrophoneAudioTrack-
iOS) 支持获取对应的音频数据帧代理回调，示例代码如下：

    
    
    // 麦克风音频 Track 数据回调
    - (void)microphoneAudioTrack:(QNMicrophoneAudioTrack *)microphoneAudioTrack didGetAudioBuffer:(AudioBuffer *)audioBuffer bitsPerSample:(NSUInteger)bitsPerSample sampleRate:(NSUInteger)sampleRate {
    
    }
    

5.x 版本转移至
[QNLocalAudioTrack](https://developer.qiniu.com/rtc/api/8854/QNLocalAudioTrack-
iOS) 中，支持
[QNLocalAudioTrack](https://developer.qiniu.com/rtc/api/8854/QNLocalAudioTrack-
iOS)
子类，包括：[QNMicrophoneAudioTrack](https://developer.qiniu.com/rtc/api/8855/QNMicrophoneAudioTrack-
iOS)k;
[QNCustomAudioTrack](https://developer.qiniu.com/rtc/api/8856/QNCustomAudioTrack-
iOS) 等字类的对应数据帧回调，示例代码如下：

    
    
    // 本地音频 Track 数据回调
    - (void)localAudioTrack:(QNLocalAudioTrack *)localAudioTrack didGetAudioBuffer:(AudioBuffer *)audioBuffer bitsPerSample:(NSUInteger)bitsPerSample sampleRate:(NSUInteger)sampleRate {
    
    }
    

### 本地视频 Track 发送 SEI

4.x 版本，需要传入 SEI 信息和重复次数

    
    
    - (void)sendSEI:(NSString *)videoSEI repeatNmuber:(NSNumber *)repeatNumber;
    

5.x 版本在 4.x 版本基础上，更新增加参数 `uuid` 自定义设置 uuid，便于区分 SEI 信息

    
    
    - (void)sendSEI:(NSString *)videoSEI uuid:(NSString *)uuid repeatNmuber:(NSNumber *)repeatNumber;
    

### 本地摄像头 Track

5.x 版本在 4.x 版本基础上，优化移除部分低概率使用属性，移除的属性例举如下：

    
    
    // 视频 Track 回调代理
    @property (nonatomic, weak) id<QNCameraTrackVideoDataDelegate> videoDelegate;
    // 视频采集 session，只读变量，给有特殊需求的开发者使用，最好不要修改。
    @property (nonatomic, readonly) AVCaptureSession * _Nullable captureSession;
    // 视频采集输入源，只读变量，给有特殊需求的开发者使用，最好不要修改。
    @property (nonatomic, readonly) AVCaptureDeviceInput * _Nullable videoCaptureDeviceInput;
    // 手动点击屏幕进行对焦。默认为 YES
    @property (nonatomic, assign, getter=isTouchToFocusEnable) BOOL touchToFocusEnable;
    

其中，本地摄像头 Track `QNCameraTrackVideoDataDelegate` 在 5.x 版本上改由其子类
[QNLocalVideoTrack](https://developer.qiniu.com/rtc/api/8849/QNLocalVideoTrack-
iOS) 的 `QNLocalVideoTrackDelegate` 实现；

手动点击屏幕进行对焦 `touchToFocusEnable` 改由用户通过实现手势点击，传递对焦位置自主实现。

5.x 版本在 4.x 版本基础上，为保证方法名的命名严谨，重命名接口 API，**注意实际功能及使用方式不变** ，涉及的属性列出如下：

    
    
    // 4.x 聚焦的位置，(0,0) 代表左上, (1,1) 代表右下。默认为 (0.5, 0.5)，即中间位置
    @property (nonatomic, assign) CGPoint focusPointOfInterest;
    // 5.x 方法重命名后，如下所示：
    @property (nonatomic, assign) CGPoint manualFocus;
    
    
    
    // 4.x 设备支持的 formats
    @property (nonatomic, strong, readonly) NSArray<AVCaptureDeviceFormat *> *videoFormats;
    // 5.x 方法重命名后，如下所示：
    @property (nonatomic, strong, readonly) NSArray<AVCaptureDeviceFormat *> *supportedVideoFormats;
    
    
    
    // 4.x 采集的视频的 videoFormat，默认为 AVCaptureSessionPreset640x480
    @property (nonatomic, copy) NSString *sessionPreset;
    // 5.x 方法重命名后，如下所示：
    @property (nonatomic, copy) NSString *videoFormat;
    
    
    
    // 4.x 设置磨皮的程度，范围从 0 ~ 1，0 为不磨皮
    - (void)setBeautify:(CGFloat)beautify;
    // 5.x 方法重命名后，如下所示：
    - (void)setSmoothLevel:(CGFloat)smoothLevel;
    
    
    
    // 4.x 设置摄像头 track 发送图片数据
    - (void)pushCameraTrackWithImage:(nullable UIImage *)image;
    // 5.x 方法重命名后，如下所示：
    - (void)pushImage:(nullable UIImage *)image;
    

### 本地麦克风 Track

4.x 版本使用实现背景音乐混音，通过 `QNMicrophoneAudioTrack` 下的属性 `audioMixer` 操作实现

    
    
    self.audioTrack.audioMixer.audioURL = [NSURL URLWithString:@"http://www.xxx.com/test.mp3"];
    self.audioTrack.audioMixer.delegate = self;
    

5.x 版本除了支持背景音乐功能，还新增支持多音效混音，依旧需要依赖
[QNMicrophoneAudioTrack](https://developer.qiniu.com/rtc/api/8855/QNMicrophoneAudioTrack-
iOS) 实现，具体可操作 API 详见
[QNAudioMusicMixer](https://developer.qiniu.com/rtc/api/11930/QNAudioMusicMixer-
iOS) 和
[QNAudioEffectMixer](https://developer.qiniu.com/rtc/api/11928/QNAudioEffectMixer-
iOS)

    
    
    self.musicMixer = [self.audioTrack createAudioMusicMixer:_musicString musicMixerDelegate:self];
    self.effectMixer = [self.audioTrack createAudioEffectMixer:self];
    

### Track 的渲染

4.x 的版本本地视频渲染和远端视频渲染，分别对应不同的 view 对象，本地渲染为 `QNGLKView`，远端为
`QNVideoView`，示例代码如下：

    
    
    //本地摄像头渲染方法实现
    self.preview = [[QNGLKView alloc] init];
    [self.cameraTrack play:self.preview];
    
    //远端视频 track 渲染方法实现
    QNVideoView * videoView = [[QNVideoView alloc] init];
    [remoteTrcak play:videoView];
    

5.x 版本对所有 [Track](https://developer.qiniu.com/rtc/quick_start/9909/the-rtc-
basic-concept#track) 的渲染 view 都由对应的
[QNVideoGLView](https://developer.qiniu.com/rtc/11949/migration-guide-iOS-v5)
来实现，示例代码如下：

    
    
    //track 渲染方法实现
    QNVideoGLView* videoView = [[QNVideoGLView alloc] init];
    [track play:videoView];
    

另外，原先其他 Track 涉及的 `fillMode` 也改由
[QNVideoGLView](https://developer.qiniu.com/rtc/api/11950/QNVideoGLView-iOS)
配置属性实现。

### 视频编码配置

4.x 版本需要通过对应 Track 的 config 配置初始化传参实现，这里以本地视频 Track `QNCameraVideoTrackConfig`
为例子，示例代码如下：

    
    
    QNCameraVideoTrackConfig *videoTrackConfig = [[QNCameraVideoTrackConfig alloc] initWithSourceTag:@"camera" bitrate:600 videoEncodeSize:CGSizeNake(480, 640) multiStreamEnable:NO];
    

5.x 版本统一通过
[QNVideoEncoderConfig](https://developer.qiniu.com/rtc/api/11944/QNVideoEncoderConfig-
iOS) 配置编码参数

    
    
    // 使用对象初始化方法，只用默认值可直接使用默认类方法
    QNVideoEncoderConfig *config = [[QNVideoEncoderConfig alloc] initWithBitrate:600 videoEncodeSize:CGSizeMake(480, 640) videoFrameRate:24];
    QNCameraVideoTrackConfig *videoTrackConfig = [[QNCameraVideoTrackConfig alloc] initWithSourceTag:@"camera" config:config multiStreamEnable:NO];
    

### 音频编码配置

4.x 版本需要通过对应 Track 的 config 配置初始化传参实现，这里以本地音频 Track
`QNMicrophoneAudioTrackConfig` 为例子，示例代码如下：

    
    
    QNMicrophoneAudioTrackConfig *audioTrackConfig = [[QNMicrophoneAudioTrackConfig alloc] initWithTag:@"microphone" bitrate:64];
    

5.x 版本统一通过
[QNAudioQuality](https://developer.qiniu.com/rtc/api/11936/QNAudioQuality-iOS)
配置编码参数

    
    
    // 使用对象初始化方法，只用默认值可直接使用默认类方法
    QNAudioQuality *quality = [[QNAudioQuality alloc] initWithBitrate:64];
    QNMicrophoneAudioTrackConfig *audioTrackConfig = [[QNMicrophoneAudioTrackConfig alloc] initWithTag:@"microphone" audioQuality:quality];
    

### 合流转推

5.x 版本在 4.x 版本基础上，为保证方法名的命名严谨，重命名
[QNTranscodingLiveStreamingTrack](https://developer.qiniu.com/rtc/api/8863/QNTranscodingLiveStreamingTrack-
iOS) 下的 2个属性，**注意实际功能及使用方式不变**

    
    
    // 4.x 当前要操作的 Track 的 id
    @property (nonatomic, strong) NSString *trackId;
    // 5.x 方法重命名后，如下所示：
    @property (nonatomic, strong) NSString *trackID;
    
    
    
    // 4.x 该 Track 在合流画面中的层次，0 为最底层
    @property (nonatomic, assign) NSUInteger zIndex;
    // 5.x 方法重命名后，如下所示：
    @property (nonatomic, assign) NSUInteger zOrder;
    

### 跨房配置

5.x 版本在 4.x 版本基础上，为保证方法名的命名严谨，方法重命名
[QNRoomMediaRelayConfiguration](https://developer.qiniu.com/rtc/11949/migration-
guide-iOS-v5) 下的删除目标房间接口，**注意实际功能及使用方式不变**

    
    
    // 4.x 删除目标房间
    - (BOOL)removeDestRoomInfoForRoomName:(NSString *_Nonnull)roomName;
    // 5.x 方法重命名后，如下所示：
    - (BOOL)removeDestRoomInfo:(NSString *_Nonnull)roomName;
    

# v3.x 升级 v5.x 指南

>   * **由于 QNRTC iOS SDK v5.x 不兼容 3.x 版本**
> ，因此，如果您是老版本用户并希望升级到最新版本以获得更好的用户体验，可参考这里提供的升级指南进行迁版本升级。
>   * 老版本文档可查看 [3.x 及之前版本的相关文档](https://doc.qnsdk.com/rtn/ios)。
>

## 改动简介

5.x 版本优化了 SDK 接口调用逻辑，主要改动如下：

### 优化实时音视频管理方式

在 5.x 版本 SDK 中，我们提供了 [QNRTC](https://developer.qiniu.com/rtc/api/8834/QNRTC-
iOS) 和 [QNRTCClient](https://developer.qiniu.com/rtc/api/8836/QNRTCClient-iOS)
两个类来替代 `QNRTCEngine` 来进行 SDK 的初始化、Track 的创建以及房间的管理等操作。其中：

  * [QNRTC](https://developer.qiniu.com/rtc/api/8834/QNRTC-iOS) 主要负责处理 SDK 的初始化以及本地音视频 Track 的创建采集等房间无关的操作。
  * [QNRTCClient](https://developer.qiniu.com/rtc/api/8836/QNRTCClient-iOS) 主要负责处理房间的加入、离开，音视频 Track 的发布、订阅等房间交互相关的操作。

上述管理方式的改动将影响到 SDK 的主要交互流程，若您需要升级，可以参考当前使用指南下的核心场景使用文档分模块进行更新。

### 优化音视频 Track 的定义及使用方式

区别于 3.x 版本所有 [Track](https://developer.qiniu.com/rtc/quick_start/9909/the-rtc-
basic-concept#track) 均使用 `QNTrackInfo`，在 5.x 版本 SDK 中，我们细化了音视频 Track
的分类，基于不同类型的 Track 提供了不同的控制接口，新版本的 Track 对本地 Track 和远端 Track 做了区分，继承结构定义如下：

  * [QNTrack](https://developer.qiniu.com/rtc/api/8851/QNTrack-iOS)
    * [QNLocalTrack](https://developer.qiniu.com/rtc/api/8847/QNLocalTrack-iOS)
      * [QNLocalAudioTrack](https://developer.qiniu.com/rtc/api/8854/QNLocalAudioTrack-iOS)
        * [QNMicrophoneAudioTrack](https://developer.qiniu.com/rtc/api/8855/QNMicrophoneAudioTrack-iOS)
        * [QNCustomAudioTrack](https://developer.qiniu.com/rtc/api/8856/QNCustomAudioTrack-iOS)
      * [QNLocalVideoTrack](https://developer.qiniu.com/rtc/api/8849/QNLocalVideoTrack-iOS)
        * [QNCameraVideoTrack](https://developer.qiniu.com/rtc/api/8852/QNCameraVideoTrack-iOS)
        * [QNCustomVideoTrack](https://developer.qiniu.com/rtc/api/8853/QNCustomVideoTrack-iOS)
        * [QNScreenVideoTrack](https://developer.qiniu.com/rtc/api/8850/QNScreenVideoTrack-iOS)
    * [QNRemoteTrack](https://developer.qiniu.com/rtc/api/8857/QNRemoteTrack-iOS)
      * [QNRemoteAudioTrack](https://developer.qiniu.com/rtc/api/8859/QNRemoteAudioTrack-iOS)
      * [QNRemoteVideoTrack](https://developer.qiniu.com/rtc/api/8858/QNRemoteVideoTrack-iOS)

> 注意：本地仅支持创建一路音频 Track，重复创建会返回 nil。

5.x 版本除了对音视频 [Track](https://developer.qiniu.com/rtc/quick_start/9909/the-rtc-
basic-concept#track) 的结构进行了调整，还将部分 Track 的操作接口从 `QNRTCEngine` 移到了 Track
上，包括采集、渲染、美颜以及音视频回调代理的设置等。更详细接口定义请参考对应的 API 文档。

### 优化事件监听接口

v5.x 细化了不同场景下的事件回调，移除了 `QNRTCEngineDelegate` 回调代理。新版本事件回调代理定义如下：

  * [QNRTCClientDelegate:](https://developer.qiniu.com/rtc/api/9248/QNRTCClientDelegate) 核心代理，定义了房间相关的回调事件，包括房间连接状态、用户加入离开状态等
  * [QNLocalVideoTrackDelegate:](https://developer.qiniu.com/rtc/api/11970/QNLocalVideoTrackDelegate) 本地视频 Track 代理，回调视频数据帧
  * [QNLocalAudioTrackDelegate:](https://developer.qiniu.com/rtc/api/11969/QNLocalAudioTrackDelegate) 本地音频 Track 代理，回调音频数据帧
  * [QNScreenVideoTrackDelegate:](https://developer.qiniu.com/rtc/api/9582/QNScreenVideoTrackDelegate) 屏幕录制 Track 代理，回调错误信息
  * [QNCustomAudioTrackDelegate:](https://developer.qiniu.com/rtc/api/11946/QNCustomAudioTrackDelegate) 自定义音频 Track 代理，回调错误信息
  * [QNRemoteVideoTrackDelegate:](https://developer.qiniu.com/rtc/api/11947/QNRemoteVideoTrackDelegate) 远端视频 Track 代理，回调视频数据帧、静默开关以及监听视频大小流切换
  * [QNRemoteAudioTrackDelegate:](https://developer.qiniu.com/rtc/api/11948/QNRemoteAudioTrackDelegate) 远端音频 Track 代理，回调数据帧和静默开关

* * *

## 核心步骤迁移详解

为了更方便您的版本迁移，本部分详细介绍了新老版本针对通话核心步骤的不同处理方式。

### 初始化

3.x 及之前的版本，初始化操作需要调用 `QNRTCEngine` 的相关方法，示例代码如下：

    
    
    QNRTCConfiguration *configuration = [QNRTCConfiguration defaultConfiguration]; // 创建并初始化 SDK 默认配置
    QNRTCEngine *engine = [[QNRTCEngine alloc] initWithConfiguration:configuration];// 创建 QNRTCEngine 对象
    

5.x 版本，初始化操作直接通过 [QNRTC](https://developer.qiniu.com/rtc/api/8834/QNRTC-iOS)
类方法即可实现，示例代码如下：

    
    
    QNRTCConfiguration *configuration = [QNRTCConfiguration defaultConfiguration]; // 创建并初始化 SDK 默认配置
    [QNRTC initRTC:configuration]; // QNRTC 初始化
    QNRTCClient *rtcClient = [QNRTC createRTCClient]; // 创建 QNRTCClient
    

实现差异：

  * 5.x 版本 SDK 直接通过 [QNRTC.init](https://developer.qiniu.com/rtc/api/8834/QNRTC-iOS#initRTC) 即可完成初始化操作。

更详细的 5.x
版本初始化使用方式可参考[初始化使用指南](https://developer.qiniu.com/rtc/development_guidelines/9257/user-
guidance-iOS)

### 加入房间

3.x 及之前的版本，通过 `- (void)joinRoomWithToken:(NSString *)token;` 的方式加入房间，示例代码如下：

    
    
    [rtcEngine joinRoomWithToken:roomToken]; // 加入房间
    
    // 加入房间成功后会触发如下回调
    - (void)RTCEngine:(QNRTCEngine *)engine roomStateDidChange:(QNConnectionState)roomState {
        if (state == QNConnectionStateConnected) {
    		// 成功加入房间
        }
    }
    

5.x 版本加入房间首先需要创建
[QNRTCClient](https://developer.qiniu.com/rtc/api/8836/QNRTCClient-iOS) 对象，再通过
[QNRTCClient.join](https://developer.qiniu.com/rtc/api/8836/QNRTCClient-
iOS#join%5B1/2%5D) 的方式加入房间，示例代码如下：

    
    
    rtcClient = [QNRTC createRTCClient]; // 创建 QNRTCClient 对象，并设置房间事件监听函数
    [rtcClient join:roomToken]; // 加入房间
    
    // 加入房间成功后会触发如下回调
    - (void)RTCClient:(QNRTCClient *)client didConnectionStateChanged:(QNConnectionState)state disconnectedInfo:(QNConnectionDisconnectedInfo *)info {
        if (state == QNConnectionStateConnected) {
    		// 成功加入房间
        }
    }
    

实现差异：

  * 5.x 版本移除了 `QNRTCEngine` 的接口调用，使用 [QNRTCClient](https://developer.qiniu.com/rtc/api/8836/QNRTCClient-iOS) 进行房间的相关操作
  * 5.x 版本房间连接状态监听回调改为 [QNRTCClientDelegate.didConnectionStateChanged](https://developer.qiniu.com/rtc/api/9248/QNRTCClientDelegate#didConnectionStateChanged)，监听事件包括加入房间成功、失败以及成功离开房间等

更详细的 5.x
版本房间管理使用方式可参考[房间管理使用指南](https://developer.qiniu.com/rtc/development_guidelines/9261/room-
management-iOS)

### 创建本地 Track

3.x 及之前的版本，通过 `QNRTCEngine` 创建本地
[Track](https://developer.qiniu.com/rtc/quick_start/9909/the-rtc-basic-
concept#track)，示例代码如下：

    
    
    // 创建本地音频 Track
    QNTrackInfo *audioInfo = [[QNTrackInfo alloc] initWithSourceType:QNRTCSourceTypeAudio master:YES bitrateBps:self.audioBitrate * 1000];
    
    // 创建本地 Camera 视频 Track
    QNTrackInfo *videoInfo = [[QNTrackInfo alloc] initWithSourceType:QNRTCSourceTypeCamera master:YES bitrateBps:self.videoBitrate * 1000 videoEncodeSize:self.videoEncodeSize];
    

5.x 版本通过 [QNRTC](https://developer.qiniu.com/rtc/api/8834/QNRTC-iOS) 创建本地
[Track](https://developer.qiniu.com/rtc/quick_start/9909/the-rtc-basic-
concept#track)，示例代码如下：

    
    
    // 创建本地音频 Track
    QNMicrophoneAudioTrack *microphoneAudioTrack = [QNRTC createMicrophoneAudioTrack];
    
    // 创建本地 Camera 视频 Track
    QNCameraVideoTrack *cameraVideoTrack = [QNRTC createCameraVideoTrack];
    

实现差异：

  * 5.x 版本移除了 `QNRTCEngine` 创建 Track 的接口，改用 [QNRTC](https://developer.qiniu.com/rtc/api/8834/QNRTC-iOS) 相关接口创建
  * 5.x 版本 Track 相关的配置通过 [QNCameraVideoTrackConfig](https://developer.qiniu.com/rtc/api/8844/QNCameraVideoTrackConfig-iOS) 或者 [QNMicrophoneAudioTrackConfig](https://developer.qiniu.com/rtc/api/8837/QNMicrophoneAudioTrackConfig-iOS) 等类似 Config 实现，创建时不传该参数则使用 SDK 提供的默认配置。3.x 版本需要在 `QNTrackInfo` 初始化配置中传入，不传则使用默认配置。

更详细的 5.x
版本音视频采集使用方式可参考[音视频采集使用指南](https://developer.qiniu.com/rtc/development_guidelines/9258/audio-
and-video-collection-iOS)

### Track 的使用

3.x 及之前的版本对 [Track](https://developer.qiniu.com/rtc/quick_start/9909/the-rtc-
basic-concept#track) 的大部分操作都由 `QNRTCEngine` 来实现，这里以部分功能举例，示例代码如下：

    
    
    // 开启 Camera Track 内置美颜并设置美颜参数
    [rtcEngine setBeautifyModeOn:YES]; // 开启美颜
    [rtcEngine setBeautify:0.5]; // 设置美颜参数
    [rtcEngine setWhiten:0.5]; // 设置美白参数
    [rtcEngine setRedden:0.5]; // 设置红润参数
    
    [rtcEngine startCapture]; // 开启 Camera Track 采集
    [rtcEngine stopCapture]; // 停止 Camera Track 采集
    
    // 静默本地 Track
    [rtcEngine muteAudio:YES]; // 设置音频静默状态
    [rtcEngine muteVideo:YES]; // 设置视频静默状态
    

5.x 版本对 [Track](https://developer.qiniu.com/rtc/quick_start/9909/the-rtc-
basic-concept#track) 的操作都由对应的 Track 来实现，示例代码如下：

    
    
    // 开启 Camera Track 内置美颜并设置美颜参数
    [cameraVideoTrack setBeautifyModeOn:YES]; // 开启美颜
    [cameraVideoTrack setSmoothLevel:0.5]; // 设置美颜参数
    [cameraVideoTrack setWhiten:0.5]; // 设置美白参数
    [cameraVideoTrack setRedden:0.5]; // 设置红润参数
    
    [cameraVideoTrack startCapture]; // 开启 Camera Track 采集
    [cameraVideoTrack stopCapture]; // 停止 Camera Track 采集
    
    // 静默本地 Track
    [localAudio updateMute:YES]; // 设置音频静默状态
    [localVideo updateMute:YES]; // 设置视频静默状态
    
    [microphoneAudioTrack setVolume:0.8]; // 设置麦克风采集音量
    

实现差异：

  * 5.x 版本将 Track 相关操作接口都移交给对应的 Track 来实现，移除了 `QNRTCEngine` 的相关调用

> 上述示例代码仅展示了部分功能的示例，更多 Track 相关的接口使用请参考对应的接口文档

### 发布本地 Track

3.x 及之前的版本发布 [Track](https://developer.qiniu.com/rtc/quick_start/9909/the-rtc-
basic-concept#track) 通过 `QNRTCEngine` 来实现，示例代码如下：

    
    
    // 发布本地 Track
    [rtcEngine publishTracks:tracks];
    
    // 发布成功后，会触发 QNRTCEngineDelegate.didPublishLocalTracks 回调
    - (void)RTCEngine:(QNRTCEngine *)engine didPublishLocalTracks:(NSArray<QNTrack *> *)tracks {
    	// 回调发布成功的 Track 列表
    }
    

5.x 版本发布 [Track](https://developer.qiniu.com/rtc/quick_start/9909/the-rtc-
basic-concept#track) 通过
[QNRTCClient](https://developer.qiniu.com/rtc/api/8836/QNRTCClient-iOS)
来实现，示例代码如下：

    
    
    // 发布本地 Track
    [rtcClient publish:tracks completeCallback:^(BOOL onPublished, NSError *error) {
    	if (onPublished) {
    		// Track 发布成功
    	} else {
    		// Track 发布失败
    	}
    }];
    

实现差异：

  * 5.x 版本通过 [QNRTCClient.publish](https://developer.qiniu.com/rtc/api/8836/QNRTCClient-iOS#publish%5B1/2%5D) 来实现本地 Track 的发布，移除了 `QNRTCEngine` 的相关调用
  * 5.x 版本发布结果回调改为了 [QNPublishResultCallback](https://developer.qiniu.com/rtc/api/9254/QNTypeDefines#QNPublishResultCallback)，可在 [QNRTCClient.publish](https://developer.qiniu.com/rtc/api/8836/QNRTCClient-iOS#publish%5B2/2%5D) 中传入，移除了 `QNRTCEngineDelegate.didPublishLocalTracks` 回调

更详细的 5.x
版本发布和订阅使用方式可参考[发布和订阅使用指南](https://developer.qiniu.com/rtc/development_guidelines/9260/publish-
and-subscribe-iOS)

### 订阅远端 Track

3.x 及之前的版本订阅 [Track](https://developer.qiniu.com/rtc/quick_start/9909/the-rtc-
basic-concept#track) 通过 `QNRTCEngine` 来实现，示例代码如下：

    
    
    rtcEngine.autoSubscribe = YES; // 设置是否自动订阅远端 Track，默认开启
    [rtcEngine subscribeTracks:tracks]; // 手动订阅场景下，订阅远端 Track
    
    // 订阅成功后，会触发 QNRTCEngineDelegate.didSubscribedRemoteVideoTracks 回调
    - (void)RTCEngine:(QNRTCEngine *)engine didSubscribedRemoteVideoTracks:(NSArray<QNRemoteVideoTrack *> *)videoTracks audioTracks:(NSArray<QNRemoteAudioTrack *> *)audioTracks ofUserID:(NSString *)userID {
    	// 回调订阅成功的 Track 列表
    }
    

5.x 版本订阅 [Track](https://developer.qiniu.com/rtc/quick_start/9909/the-rtc-
basic-concept#track) 通过
[QNRTCClient](https://developer.qiniu.com/rtc/api/8836/QNRTCClient-iOS)
来实现，示例代码如下：

    
    
    rtcClient.autoSubscribe = YES; // 设置是否自动订阅远端 Track，默认开启
    [rtcClient subscribe:tracks]; // 手动订阅场景下，订阅远端 Track，支持可变参数
    
    // 订阅成功后，会触发 QNRTCClientDelegate.didSubscribedRemoteVideoTracks 回调
    - (void)RTCClient:(QNRTCClient *)client didSubscribedRemoteVideoTracks:(NSArray<QNRemoteVideoTrack *> *)videoTracks audioTracks:(NSArray<QNRemoteAudioTrack *> *)audioTracks ofUserID:(NSString *)userID {
    	// 回调订阅成功的 Track 列表
    }
    

实现差异：

  * 5.x 版本通过 [QNRTCClient.subscribe](https://developer.qiniu.com/rtc/api/8836/QNRTCClient-iOS#subscribe) 来实现对 Track 的订阅，移除了 `QNRTCEngine` 的相关调用
  * 5.x 版本订阅结果通过 [QNRTCClientDelegate.didSubscribedRemoteVideoTracks](https://developer.qiniu.com/rtc/api/9248/QNRTCClientDelegate#didSubscribedRemoteVideoTracks) 回调，移除了 `QNRTCEngineDelegate` 相关的回调

更详细的 5.x
版本发布和订阅使用方式可参考[发布和订阅使用指南](https://developer.qiniu.com/rtc/development_guidelines/9260/publish-
and-subscribe-iOS)

### CDN 转推

3.x 及之前的版本 CDN 转推通过 `QNRTCEngine` 来实现，示例代码如下：

    
    
    // 创建并配置单路转推任务，配置步骤省略
    QNForwardStreamConfiguration *forwardConfig = [QNForwardStreamConfiguration alloc] init];
    
    [rtcEngine createForwardJobWithConfiguration:forwardConfig]; // 开始单路转推任务
    [rtcEngine stopForwardJobWithJobId:forwardConfig.jobId]; // 停止单路转推任务
    
    // 创建并配置合流转推任务，配置步骤省略
    QNMergeStreamConfiguration *mergeConfig = [QNMergeStreamConfiguration alloc] init];
    [rtcEngine createMergeStreamJobWithConfiguration:mergeConfig; // 开始合流转推任务
    [rtcEngine setMergeStreamLayouts:layouts jobId:mergeConfig.jobId]; // 更新合流布局
    [rtcEngine removeMergeStreamLayouts:layouts jobId:mergeConfig.jobId]; // 移除合流布局
    [rtcEngine stopMergeStreamWithJobId:mergeConfig.jobId]; // 停止合流转推任务
    
    // 创建成功后会触发 QNRTCEngineDelegate 的相关回调
    - (void)RTCEngine:(QNRTCEngine *)engine didCreateForwardJobWithJobId:(NSString *)jobId {
    	// 回调创建成功的单路转推 job id
    }
    
    - (void)RTCEngine:(QNRTCEngine *)engine didCreateMergeStreamWithJobId:(NSString *)jobId {
    	// 回调创建成功的合流转推 job id
    }
    

5.x 版本 CDN 转推通过
[QNRTCClient](https://developer.qiniu.com/rtc/api/8836/QNRTCClient-iOS)
来实现，示例代码如下：

    
    
    // CDN 转推相关回调
    - (void)RTCClient:(QNRTCClient *)client didStartLiveStreaming:(NSString *)streamID {
    	// 对应 streamID 的单路/合流转推任务开始转推
    }
    
    - (void)RTCClient:(QNRTCClient *)client didStopLiveStreaming:(NSString *)streamID {
    	// 对应 streamID 的单路/合流转推任务已停止转推
    }
    
    - (void)RTCClient:(QNRTCClient *)client didTranscodingTracksUpdated:(BOOL)success withStreamID:(NSString *)streamID {
    	// 合流布局更改时触发此回调
    }
    
    - (void)RTCClient:(QNRTCClient *)client didErrorLiveStreaming:(NSString *)streamID errorInfo:(QNLiveStreamingErrorInfo *)errorInfo {
    	// 转推任务出错时触发此回调
    }
    
    // 创建并配置单路转推任务，配置步骤省略
    QNDirectLiveStreamingConfig *directLiveStreamingConfig = [[QNDirectLiveStreamingConfig alloc] init];
    [rtcClient startLiveStreamingWithDirect:directLiveStreamingConfig]; // 开始单路转推任务
    [rtcClient stopLiveStreamingWithDirect:directLiveStreamingConfig]; // 停止单路转推任务
    
    // 创建并配置合流转推任务，配置步骤省略
    QNTranscodingLiveStreamingConfig *transcodingLiveStreamingConfig = [[QNTranscodingLiveStreamingConfig alloc] init];
    [rtcClient startLiveStreamingWithTranscoding:transcodingLiveStreamingConfig]; // 开始合流转推任务
    [rtcClient setTranscodingLiveStreamingID:transcodingLiveStreamingConfig.streamID withTracks:transcodingTracks]; // 更新合流布局
    [rtcClient removeTranscodingLiveStreamingID:transcodingLiveStreamingConfig.streamID withTracks:transcodingTracks]; // 移除合流布局
    [rtcClient stopLiveStreamingWithTranscoding:transcodingLiveStreamingConfig]; // 停止合流转推任务
    

实现差异：

  * 5.x 版本通过 [QNDirectLiveStreamingConfig](https://developer.qiniu.com/rtc/api/8861/QNDirectLiveStreamingConfig-iOS) 代替 `QNForwardStreamConfiguration` 实现单路转推的配置；通过 [QNTranscodingLiveStreamingConfig](https://developer.qiniu.com/rtc/api/8862/QNTranscodingLiveStreamingConfig-iOS) 代替 `QNMergeStreamConfiguration` 实现合流转推的配置；通过 [QNTranscodingLiveStreamingTrack](https://developer.qiniu.com/rtc/api/8863/QNTranscodingLiveStreamingTrack-iOS) 代替 `QNMergeStreamLayout` 实现合流布局的控制
  * 5.x 版本通过 [QNRTCClientDelegate](https://developer.qiniu.com/rtc/api/9248/QNRTCClientDelegate) 代替 `QNRTCEngineDelegate` 相关方法来实现 CDN 转推状态的监听

更详细的 5.x 版本 CDN 转推使用方式可参考 [CDN
转推使用指南](https://developer.qiniu.com/rtc/development_guidelines/9262/turn-the-
cdn-push-iOS)

### 离开房间

3.x 及之前的版本离开房间通过 `QNRTCEngine` 来实现，示例代码如下：

    
    
    [rtcEngine leaveRoom]; // 离开房间
    

5.x 版本离开房间通过
[QNRTCClient](https://developer.qiniu.com/rtc/api/8836/QNRTCClient-iOS)
来实现，示例代码如下：

    
    
    [rtcClient leave]; // 离开房间
    

实现差异：

  * 5.x 版本通过 [QNRTCClient.leave](https://developer.qiniu.com/rtc/api/8836/QNRTCClient-iOS#leave) 来实现离开房间的操作，移除了 `QNRTCEngine` 的相关调用

以上内容是否对您有帮助？