发布和订阅
发布本地音视频
加入房间后,便可以发布自己的音视频了。SDK 提供了一系列发布音视频的接口,App 可以根据实际需求选用合适的接口。
同时发布音视频
对于同时发布一路音频和视频的场景,如果不需要配置额外的参数,那么直接调用如下接口:
- (void)publish;
发布即可。发布成功后需要开启摄像头采集(当然,在发布之前开启也可以),这样远端用户才能看到本地的摄像头画面,如何开启摄像头采集请查阅音视频采集。
仅发布音频
如果仅需要发布音频(不需要发布视频),那么直接调用
- (void)publishAudio;
接口即可。如果发布音频后还有发布视频的需求,那么只需再调用
- (void)publishVideo;
接口即可。
仅发布视频
如果仅需要发布自己的视频(不需要发布音频),那么直接调用
- (void) publishVideo;
接口即可。
自定义编码参数发布
上面提到的三种发布接口:
- (void)publish;
- (void)publishAudio;
- (void)publishVideo;
在发布时会创建使用默认参数的 QNTrackInfo
用于发布,并且将 master
属性置为 YES
(关于 master
属性含义可查阅 Track 介绍)。如果需要配置发布的 Track
的码率/编码分辨率等参数,那么可以初始化一路(组)对应参数的 QNTrackInfo
,然后使用如下接口:
- (void)publishTracks:(NSArray<QNTrackInfo *> *)tracks;
发布即可。关于 QNTrackInfo
的属性配置,可以查阅 QNTrackInfo。
发布成功的回调
本地媒体流发布成功后,本地会有发布成功的回调:
- (void)RTCEngine:(QNRTCEngine *)engine didPublishLocalTracks:(NSArray<QNTrackInfo *> *)tracks;
此处回调的
tracks
跟发布时传入- (void)publishTracks:(NSArray<QNTrackInfo *> *)tracks
的tracks
不是同一对象,修改其属性对已发布的流不会有任何效果。
另外,同一房间的其它用户,会有该 userId 成功发布音/视频 Track
的回调:
- (void)RTCEngine:(QNRTCEngine *)engine didPublishTracks:(NSArray<QNTrackInfo *> *)tracks ofRemoteUserId:(NSString *)userId;
导入视频数据发布
一般情况下,我们建议使用 SDK 内置的音视频采集模块。但是如果您需要实现一些特定的需求,可以导入自己的音视频数据。具体方法如下:
初始化 sourceType
为 QNRTCSourceTypeExternalVideo
的视频 QNTrackInfo 并通过- (void)publishTracks:(NSArray<QNTrackInfo *> *)tracks;
接口发布,如果有多路视频 Track 同时发布,可以通过设置 tag 参数来加以区分。
视频发布成功后,在发布成功的回调中,记录下对应 Track 的 trackId
,然后通过以下接口导入视频数据:
- (void)pushVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer;
- (void)pushVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer trackId:(NSString *)trackId;
- (void)pushPixelBuffer:(CVPixelBufferRef)pixelBuffer;
- (void)pushPixelBuffer:(CVPixelBufferRef)pixelBuffer trackId:(NSString *)trackId;
如果调用导入接口时 trackId
传入 nil
,则会将数据导入给所有 sourceType
为 QNRTCSourceTypeExternalVideo
的 Track。
目前支持导入的视频数据格式为:kCVPixelFormatType_32BGRA
、kCVPixelFormatType_420YpCbCr8BiPlanarFullRange
和 kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
。
导入音频数据发布
在发布音频 Track 前调用如下接口并传入 YES
将外部音频数据功能设置为开启:
- (void)setExternalAudioSourceEnabled:(BOOL)enabled;
然后通过 - (void)publishAudio;
或者 - (void)publishTracks:(NSArray<QNTrackInfo *> *)tracks;
接口发布一路音频 Track。发布成功后,通过如下方法导入音频数据:
- (void)pushAudioBuffer:(AudioBuffer *)audioBuffer;
支持的音频格式为:PCM 格式,48000 采样率,16 位宽,单声道。
发布屏幕数据(屏幕分享)
初始化 sourceType
为 QNRTCSourceTypeScreenRecorder
的视频 QNTrackInfo
并使用- (void)publishTracks:(NSArray<QNTrackInfo *> *)tracks;
接口发布即可。
受系统所限,屏幕分享功能仅在 iOS 11 及以上版本可用。可通过
+ (BOOL)isScreenRecorderAvailable;
方法来判断当前系统下屏幕分享功能是否可用。
Mute 本地音视频
发布本地音视频后,如果需要暂时让远端无法看到/听到自己的画面/声音,可以 Mute 相应的 Track。使用如下接口:
- (void)muteAudio:(BOOL)muted;
- (void)muteVideo:(BOOL)muted;
可以方便快速地 Mute master
属性为 YES
的 Track(关于 master
属性含义可查阅 Track 介绍)。
若要批量操作一组 tracks,或者需要 Mute 非 master
的 track,可使用如下接口:
- (void)muteTracks:(NSArray<QNTrackInfo *> *)tracks;
只需将需要操作的 trackId
和 muted
状态设置在 QNTrackInfo
中即可。
取消发布本地音视频
与发布的接口相对应,取消发布也有一组相应的接口,调用相应的接口取消发布即可。
- (void)unpublish;
- (void)unpublishAudio;
- (void)unpublishVideo;
- (void)unpublishTracks:(NSArray<QNTrackInfo *> *)tracks;
本地音视频取消发布后,会触发远端用户收到该 userId
取消发布相应 tracks
的回调。
- (void)RTCEngine:(QNRTCEngine *)engine didUnPublishTracks:(NSArray<QNTrackInfo *> *)tracks ofRemoteUserId:(NSString *)userId;
订阅远端 Track
当远端发布音视频 Track 后,本地需要订阅相应 Track 才能看到/听到远端的画面/声音。
自动订阅
从 v2.0.0 开始,SDK 增加了自动订阅的开关,默认处于开启状态,即 SDK 会自动订阅远端用户发布的所有 Track。
@property (nonatomic, assign) BOOL autoSubscribe;
手动订阅
如果 App 有选择性订阅远端媒体流的需求,那么可以关闭 autoSubscribe
开关,然后在合适的时机调用以下接口:
- (void)subscribeTracks:(NSArray<QNTrackInfo *> *)tracks;
订阅指定的 tracks
。此处 tracks 数组可以直接使用 SDK 的远端用户发布 Track 的回调中返回的 tracks 数组,也可以自己构建一组 QNTrackInfo
,并将其中 trackId
属性赋值为待订阅的 trackId。
订阅成功的回调
当订阅远端媒体流成功后,SDK 会通过如下方法回调订阅成功的通知,App 可以据此做 UI 逻辑的处理。
- (void)RTCEngine:(QNRTCEngine *)engine didSubscribeTracks:(NSArray<QNTrackInfo *> *)tracks ofRemoteUserId:(NSString *)userId;
远端用户视频首帧解码的回调
如果订阅了远端的视频 Track,那么在解码成功后,SDK 会在主线程通过如下方法回调通知,如果需要渲染,则需要给回调方法返回一个 QNVideoRender
对象,并且确保其中的 renderView
属性不为空,SDK 将把远端视频渲染到该 renderView
中。当远端画面的比例和 renderView
的比例不一致时,可以通过设置 renderView
的 fillMode
属性来切换不同的渲染模式。
- (QNVideoRender *)RTCEngine:(QNRTCEngine *)engine firstVideoDidDecodeOfTrackId:(NSString *)trackId remoteUserId:(NSString *)userId;
取消订阅远端 Track
无论是自动订阅还是手动订阅的 Track,都可以通过如下接口:
- (void)unsubscribeTracks:(NSArray<QNTrackInfo *> *)tracks;
来取消订阅指定的 tracks。此处 tracks 数组可以直接使用 SDK 的回调中返回的 tracks 数组,也可以自己构建一组 QNTrackInfo
,并将其中 trackId
属性赋值为需要取消订阅的 trackId。
使用 TCP 传输媒体流
SDK 默认使用 UDP 协议传输媒体流, 如果用户使用的网络环境下 UDP 协议被封锁,可以使用 TCP 协议来传输。方法如下:
1、先使用如下方法创建指定 policy 的 QNRTCConfiguration
对象:
- (instancetype)initWithPolicy:(QNRTCPolicy)policy;
其中 policy 有 QNRTCPolicyForceUDP
(使用 UDP)、QNRTCPolicyForceTCP
(使用 TCP)、QNRTCPolicyPreferUDP
(优先 UDP,不通的话自动改为 TCP)三种选项可选。
2、使用第 1 步创建好的 QNRTCConfiguration
对象来初始化 QNRTCEngine
即可。
- (instancetype)initWithConfiguration:(QNRTCConfiguration *)configuration;