实时音视频

  • 实时音视频 > 使用指南 > iOS >迁移指南

    迁移指南

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

    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 版本上改由其子类 QNLocalVideoTrackQNLocalVideoTrackDelegate 实现;

    手动点击屏幕进行对焦 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 详见 QNAudioMusicMixerQNAudioEffectMixer

    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 中,我们提供了 QNRTCQNRTCClient 两个类来替代 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 回调代理。新版本事件回调代理定义如下:


    核心步骤迁移详解

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

    初始化

    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 版本房间管理使用方式可参考房间管理使用指南

    创建本地 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 版本发布和订阅使用方式可参考发布和订阅使用指南

    订阅远端 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 版本发布和订阅使用方式可参考发布和订阅使用指南

    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 版本 CDN 转推使用方式可参考 CDN 转推使用指南

    离开房间

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

    [rtcEngine leaveRoom]; // 离开房间
    

    5.x 版本离开房间通过 QNRTCClient 来实现,示例代码如下:

    [rtcClient leave]; // 离开房间
    

    实现差异:

    • 5.x 版本通过 QNRTCClient.leave 来实现离开房间的操作,移除了 QNRTCEngine 的相关调用
    以上内容是否对您有帮助?
  • Qvm free helper
    Close