迁移指南
QNRTC iOS SDK v5.x 是基于 v4.x 版本开发的全量重构版本,接口与 v4.x 的部分接口不兼容,不兼容 v3.x 版本。
请在确认好目前使用的 SDK 版本后,根据实际需要,选择参照 v4.x 升级 v5.x 指南 或 v3.x 升级 v5.x 指南 进行版本升级。
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 方法,请务必在 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 的 audioTrack 和 videoTrack 属性来获取
4.x 版本支持通过传递 userID,直接获取对应用户的网络质量信息,示例代码如下:
// 获取指定用户的网络质量信息。
QNNetworkQuality *quality = [self.client getUserNetworkQuality:remoteUserId];
5.x 版本更改此方法为直接获取当前订阅的所有远端用户网络质量,具体的 QNNetworkQuality 可通过 key
获取,无需再传值获取,示例代码如下:
// 获取当前订阅的所有远端用户网络质量。
NSDictionary *dic = [self.client getUserNetworkQuality];
5.x 版本在 QNRTCClientDelegate 新增回调本地网络质量信息
- (void)RTCClient:(QNRTCClient *)client didNetworkQualityNotified:(QNNetworkQuality *)quality;
另外, 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 支持获取对应的视频数据帧代理回调,示例代码如下:
// 摄像头视频 Track 数据回调
- (void)cameraVideoTrack:(QNCameraVideoTrack *)cameraVideoTrack didGetSampleBuffer:(CMSampleBufferRef)sampleBuffer {
}
5.x 版本转移至 QNLocalVideoTrack 中,支持 QNLocalVideoTrack 子类,包括:QNCameraVideoTrack; QNScreenVideoTrack; QNCustomVideoTrack 等子类的本地渲染,以及对应数据帧回调,示例代码如下:
// 本地视频 Track 数据回调
- (void)localVideoTrack:(QNLocalVideoTrack *)localVideoTrack didGetPixelBuffer:(CVPixelBufferRef)pixelBuffer {
}
本地 Track 音频数据回调
4.x 版本,目前只有 QNMicrophoneAudioTrack 支持获取对应的音频数据帧代理回调,示例代码如下:
// 麦克风音频 Track 数据回调
- (void)microphoneAudioTrack:(QNMicrophoneAudioTrack *)microphoneAudioTrack didGetAudioBuffer:(AudioBuffer *)audioBuffer bitsPerSample:(NSUInteger)bitsPerSample sampleRate:(NSUInteger)sampleRate {
}
5.x 版本转移至 QNLocalAudioTrack 中,支持 QNLocalAudioTrack 子类,包括:QNMicrophoneAudioTrackk; QNCustomAudioTrack 等字类的对应数据帧回调,示例代码如下:
// 本地音频 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 的 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 实现,具体可操作 API 详见 QNAudioMusicMixer 和 QNAudioEffectMixer
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 的渲染 view 都由对应的 QNVideoGLView 来实现,示例代码如下:
//track 渲染方法实现
QNVideoGLView* videoView = [[QNVideoGLView alloc] init];
[track play:videoView];
另外,原先其他 Track 涉及的 fillMode
也改由 QNVideoGLView 配置属性实现。
视频编码配置
4.x 版本需要通过对应 Track 的 config 配置初始化传参实现,这里以本地视频 Track QNCameraVideoTrackConfig
为例子,示例代码如下:
QNCameraVideoTrackConfig *videoTrackConfig = [[QNCameraVideoTrackConfig alloc] initWithSourceTag:@"camera" bitrate:600 videoEncodeSize:CGSizeNake(480, 640) multiStreamEnable:NO];
5.x 版本统一通过 QNVideoEncoderConfig 配置编码参数
// 使用对象初始化方法,只用默认值可直接使用默认类方法
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 配置编码参数
// 使用对象初始化方法,只用默认值可直接使用默认类方法
QNAudioQuality *quality = [[QNAudioQuality alloc] initWithBitrate:64];
QNMicrophoneAudioTrackConfig *audioTrackConfig = [[QNMicrophoneAudioTrackConfig alloc] initWithTag:@"microphone" audioQuality:quality];
合流转推
5.x 版本在 4.x 版本基础上,为保证方法名的命名严谨,重命名 QNTranscodingLiveStreamingTrack 下的 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 下的删除目标房间接口,注意实际功能及使用方式不变
// 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 及之前版本的相关文档。
改动简介
5.x 版本优化了 SDK 接口调用逻辑,主要改动如下:
优化实时音视频管理方式
在 5.x 版本 SDK 中,我们提供了 QNRTC 和 QNRTCClient 两个类来替代 QNRTCEngine
来进行 SDK 的初始化、Track 的创建以及房间的管理等操作。其中:
- QNRTC 主要负责处理 SDK 的初始化以及本地音视频 Track 的创建采集等房间无关的操作。
- QNRTCClient 主要负责处理房间的加入、离开,音视频 Track 的发布、订阅等房间交互相关的操作。
上述管理方式的改动将影响到 SDK 的主要交互流程,若您需要升级,可以参考当前使用指南下的核心场景使用文档分模块进行更新。
优化音视频 Track 的定义及使用方式
区别于 3.x 版本所有 Track 均使用 QNTrackInfo
,在 5.x 版本 SDK 中,我们细化了音视频 Track 的分类,基于不同类型的 Track 提供了不同的控制接口,新版本的 Track 对本地 Track 和远端 Track 做了区分,继承结构定义如下:
注意:本地仅支持创建一路音频 Track,重复创建会返回 nil。
5.x 版本除了对音视频 Track 的结构进行了调整,还将部分 Track 的操作接口从 QNRTCEngine
移到了 Track 上,包括采集、渲染、美颜以及音视频回调代理的设置等。更详细接口定义请参考对应的 API 文档。
优化事件监听接口
v5.x 细化了不同场景下的事件回调,移除了 QNRTCEngineDelegate
回调代理。新版本事件回调代理定义如下:
- QNRTCClientDelegate: 核心代理,定义了房间相关的回调事件,包括房间连接状态、用户加入离开状态等
- QNLocalVideoTrackDelegate: 本地视频 Track 代理,回调视频数据帧
- QNLocalAudioTrackDelegate: 本地音频 Track 代理,回调音频数据帧
- QNScreenVideoTrackDelegate: 屏幕录制 Track 代理,回调错误信息
- QNCustomAudioTrackDelegate: 自定义音频 Track 代理,回调错误信息
- QNRemoteVideoTrackDelegate: 远端视频 Track 代理,回调视频数据帧、静默开关以及监听视频大小流切换
- QNRemoteAudioTrackDelegate: 远端音频 Track 代理,回调数据帧和静默开关
核心步骤迁移详解
为了更方便您的版本迁移,本部分详细介绍了新老版本针对通话核心步骤的不同处理方式。
初始化
3.x 及之前的版本,初始化操作需要调用 QNRTCEngine
的相关方法,示例代码如下:
QNRTCConfiguration *configuration = [QNRTCConfiguration defaultConfiguration]; // 创建并初始化 SDK 默认配置
QNRTCEngine *engine = [[QNRTCEngine alloc] initWithConfiguration:configuration];// 创建 QNRTCEngine 对象
5.x 版本,初始化操作直接通过 QNRTC 类方法即可实现,示例代码如下:
QNRTCConfiguration *configuration = [QNRTCConfiguration defaultConfiguration]; // 创建并初始化 SDK 默认配置
[QNRTC initRTC:configuration]; // QNRTC 初始化
QNRTCClient *rtcClient = [QNRTC createRTCClient]; // 创建 QNRTCClient
实现差异:
- 5.x 版本 SDK 直接通过 QNRTC.init 即可完成初始化操作。
更详细的 5.x 版本初始化使用方式可参考初始化使用指南
加入房间
3.x 及之前的版本,通过 - (void)joinRoomWithToken:(NSString *)token;
的方式加入房间,示例代码如下:
[rtcEngine joinRoomWithToken:roomToken]; // 加入房间
// 加入房间成功后会触发如下回调
- (void)RTCEngine:(QNRTCEngine *)engine roomStateDidChange:(QNConnectionState)roomState {
if (state == QNConnectionStateConnected) {
// 成功加入房间
}
}
5.x 版本加入房间首先需要创建 QNRTCClient 对象,再通过 QNRTCClient.join 的方式加入房间,示例代码如下:
rtcClient = [QNRTC createRTCClient]; // 创建 QNRTCClient 对象,并设置房间事件监听函数
[rtcClient join:roomToken]; // 加入房间
// 加入房间成功后会触发如下回调
- (void)RTCClient:(QNRTCClient *)client didConnectionStateChanged:(QNConnectionState)state disconnectedInfo:(QNConnectionDisconnectedInfo *)info {
if (state == QNConnectionStateConnected) {
// 成功加入房间
}
}
实现差异:
- 5.x 版本移除了
QNRTCEngine
的接口调用,使用 QNRTCClient 进行房间的相关操作 - 5.x 版本房间连接状态监听回调改为 QNRTCClientDelegate.didConnectionStateChanged,监听事件包括加入房间成功、失败以及成功离开房间等
更详细的 5.x 版本房间管理使用方式可参考房间管理使用指南
创建本地 Track
3.x 及之前的版本,通过 QNRTCEngine
创建本地 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 创建本地 Track,示例代码如下:
// 创建本地音频 Track
QNMicrophoneAudioTrack *microphoneAudioTrack = [QNRTC createMicrophoneAudioTrack];
// 创建本地 Camera 视频 Track
QNCameraVideoTrack *cameraVideoTrack = [QNRTC createCameraVideoTrack];
实现差异:
- 5.x 版本移除了
QNRTCEngine
创建 Track 的接口,改用 QNRTC 相关接口创建 - 5.x 版本 Track 相关的配置通过 QNCameraVideoTrackConfig 或者 QNMicrophoneAudioTrackConfig 等类似 Config 实现,创建时不传该参数则使用 SDK 提供的默认配置。3.x 版本需要在
QNTrackInfo
初始化配置中传入,不传则使用默认配置。
更详细的 5.x 版本音视频采集使用方式可参考音视频采集使用指南
Track 的使用
3.x 及之前的版本对 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 的操作都由对应的 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 通过 QNRTCEngine
来实现,示例代码如下:
// 发布本地 Track
[rtcEngine publishTracks:tracks];
// 发布成功后,会触发 QNRTCEngineDelegate.didPublishLocalTracks 回调
- (void)RTCEngine:(QNRTCEngine *)engine didPublishLocalTracks:(NSArray<QNTrack *> *)tracks {
// 回调发布成功的 Track 列表
}
5.x 版本发布 Track 通过 QNRTCClient 来实现,示例代码如下:
// 发布本地 Track
[rtcClient publish:tracks completeCallback:^(BOOL onPublished, NSError *error) {
if (onPublished) {
// Track 发布成功
} else {
// Track 发布失败
}
}];
实现差异:
- 5.x 版本通过 QNRTCClient.publish 来实现本地 Track 的发布,移除了
QNRTCEngine
的相关调用 - 5.x 版本发布结果回调改为了 QNPublishResultCallback,可在 QNRTCClient.publish 中传入,移除了
QNRTCEngineDelegate.didPublishLocalTracks
回调
更详细的 5.x 版本发布和订阅使用方式可参考发布和订阅使用指南
订阅远端 Track
3.x 及之前的版本订阅 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 通过 QNRTCClient 来实现,示例代码如下:
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 来实现对 Track 的订阅,移除了
QNRTCEngine
的相关调用 - 5.x 版本订阅结果通过 QNRTCClientDelegate.didSubscribedRemoteVideoTracks 回调,移除了
QNRTCEngineDelegate
相关的回调
更详细的 5.x 版本发布和订阅使用方式可参考发布和订阅使用指南
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 来实现,示例代码如下:
// 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 代替
QNForwardStreamConfiguration
实现单路转推的配置;通过 QNTranscodingLiveStreamingConfig 代替QNMergeStreamConfiguration
实现合流转推的配置;通过 QNTranscodingLiveStreamingTrack 代替QNMergeStreamLayout
实现合流布局的控制 - 5.x 版本通过 QNRTCClientDelegate 代替
QNRTCEngineDelegate
相关方法来实现 CDN 转推状态的监听
更详细的 5.x 版本 CDN 转推使用方式可参考 CDN 转推使用指南
离开房间
3.x 及之前的版本离开房间通过 QNRTCEngine
来实现,示例代码如下:
[rtcEngine leaveRoom]; // 离开房间
5.x 版本离开房间通过 QNRTCClient 来实现,示例代码如下:
[rtcClient leave]; // 离开房间
实现差异:
- 5.x 版本通过 QNRTCClient.leave 来实现离开房间的操作,移除了
QNRTCEngine
的相关调用