视频订阅
更新时间: 2024/08/23 10:24:52
本章节介绍视频订阅相关的功能,主要有以下内容。
1. 多流(beta )
2. 自动发布视频
3. 手动发布视频
4. 自动订阅音视频
5. 手动订阅音视频
6. 订阅/发布相关的回调
说明:视频订阅给了用户极大的自主权来决定什么时候发布视频(及发布什么类型的视频)、订阅视频(及订阅什么类型的视频),这对性能、体验、资费有较大的帮助,因此推荐用户使用手动模式。
注意:视频订阅相关的功能只在会议模式下可用,点对点模式下所有相关的接口调用都是是无效的,并且也不会收到订阅相关的回调
多流(beta )
无论是自动发布,还是手动发布,目前SDK默认单流 ( 大流 ) , 如果需要发布多流 (大流+小流 ),可自行设置相应的模式,小流的分辨率固定为180p , 目前多流功能处于beta 版阶段。
- API原型
java /**
* 设置本地视频多流模式。该方法设置单流(默认)、多流模式,发送端开启多流模式后,接收端可以选择接收大流、小流。
* 注意:必须在joinChannel之前设置,同一通通话不能修改。
*
* @param mode 流模式,参考 :<br/>
* {@link NRtcConstants.Subscribe#PUBLISH_MODEL_SINGLE_STREAM}: 单流<br/>
* {@link NRtcConstants.Subscribe#PUBLISH_MODEL_DUAL_STREAM}: 双流<br/>
* @return 0 :设置成功,但点对点模式下设置不会生效 <br/>
* -1 :失败 <br/>
*/
public abstract int setLocalVideoSimulcastModel(int mode);
- 参数说明
参数 | 说明 |
---|---|
mode | 流模式 |
- 示例代码
AVChatManager.getInstance().setLocalVideoSimulcastModel(NRtcConstants.Subscribe.PUBLISH_MODEL_SINGLE_STREAM);
- 说明
- 如果开启了录屏模式
setVideoQualityStrategy(AVChatVideoQualityStrategy.ScreenSharing)
,设置多流将会无效,强制单流。 - 如果开启多流,最低允许设置的分辨率为
AVChatVideoQuality.QUALITY_MEDIUM
,再低将无效。
自动发布视频
自动发布是默认的模式,在自动发布模式下,SDK 会自动发布本端的视频流。
-
API 原型
java
/** * 设置是否自动发布,是否自动订阅 ,默认是自动发布和订阅,必须在joinRoom之前设置 * 说明:音频暂不支持手动发布,一直是发布的 ,但支持手动/自动订阅 * * @param autoPub true表示自动发布;false表示手动发布 * @param autoSub true表示自动订阅;false表示手动订阅 * @return 操作成功是 0 ,失败 -1 */ public abstract int setAutoPublish(boolean autoPub, boolean autoSub);
-
参数说明
参数 | 说明 |
---|---|
autoPub | 是否自动发布 |
autoSub | 是否自动订阅 ,参考订阅相关的内容 |
- 示例代码
java//autoPub 设置成ture 就是自动发布了
AVChatManager.getInstance().setAutoPublish(true, autoSub);
- 说明
- 在自动发布模式下,与发布相关的接口将不可用,但是相关回调还会正常的回调。
- 在自动发布模式下,如果用户由视频模式切换到音频模式(
disableVideo()
)或由普通成员切换到观众(AVChatParameters.KEY_SESSION_MULTI_MODE_USER_ROLE
) , SDK 会自动取消发布视频,反而言之,则会自动发布视频。
手动发布视频
如果需要手动发布视频,首先需要在初始化SDK (enableRtc()
)后,发起/接受通话前关闭自动发布,开启手动发布。
-
示例代码
java
//autoPub 设置成false 就开启手动发布 AVChatManager.getInstance().setAutoPublish(false, autoSub);
-
手动发布视频
开启手动发布后,可以在需要发布视频的时候调用以下API来发布视频:
java /**
* 手动发布视频流
*
* @return 0 :操作成功,但是否发布成功还得看回调结果{@link AVChatStateObserver#onPublishVideoResult(int)} <br/>
* {@link RtcCode.Subscribe#VIDEO_IS_MUTED_ERR }:当前视频是mute 的 <br/>
* {@link RtcCode.Subscribe#IS_AUDIENCE_ERR} :当前是观众 <br/>
* {@link RtcCode.Subscribe#IS_AUDIO_MODE_ERR}:当前是音频模式 <br/>
* {@link RtcCode.Subscribe#ACTION_DUPLICATE_ERR}:当前有正在进行中的操作 <br/>
* {@link RtcCode.Subscribe#MODE_CONFLICT_ERR}:模式冲突,当前是自动模式<br/>
* {@link RtcCode.Subscribe#FORBID_ACTION}:非法操作 , 订阅相关的操作只在会议模式下有效 ,点对点不支持<br/>
* -1 :其它失败 <br/>
*/
public abstract int publishVideo();
在发布操作成功后(既结果返回0) , 之后会有相关的回调通知AVChatStateObserver#onPublishVideoResult(int)
,详情参考下文关于回调的描述。
- 取消发布视频
如果需要取消发布视频,参考如下API:
java/**
* 手动取消发布视频流
* @return 0 :操作成功,但是否取消发布成功还得看回调结果{@link AVChatStateObserver#onUnpublishVideoResult(int)} <br/>
* {@link RtcCode.Subscribe#VIDEO_IS_MUTED_ERR }:当前视频是mute 的 <br/>
* {@link RtcCode.Subscribe#IS_AUDIENCE_ERR} :当前是观众 <br/>
* {@link RtcCode.Subscribe#IS_AUDIO_MODE_ERR}:当前是音频模式 <br/>
* {@link RtcCode.Subscribe#ACTION_DUPLICATE_ERR}:当前有正在进行中的操作 <br/>
* {@link RtcCode.Subscribe#MODE_CONFLICT_ERR}:模式冲突,当前是自动模式<br/>
* {@link RtcCode.Subscribe#FORBID_ACTION}:非法操作 , 订阅相关的操作只在会议模式下有效 ,点对点不支持<br/>
* -1 :其它失败 <br/>
*/
public abstract int unpublishVideo();
在取消发布操作成功后(既结果返回0) , 之后会有相关的回调通知AVChatStateObserver#onUnpublishVideoResult(int)
,详情参考下文关于回调的描述。
- 注意
在手动发布模式下,如果用户由视频模式切换到音频模式(
disableVideo()
)或由普通成员切换到观众(AVChatParameters.KEY_SESSION_MULTI_MODE_USER_ROLE
) , SDK 会自动取消发布视频。但是切换回视频模式或普通成员时,不会自动发布视频,需要用户再次手动发布一下。
自动订阅音视频
自动订阅是默认的模式,在自动订阅模式下,SDK 会自动订阅会议中所有其他参与者的发布的视频及音频。
- 示例代码
java//将autoSub 设置成ture 就是自动订阅了
AVChatManager.getInstance().setAutoPublish(autoPub, true);
手动订阅音视频
如果需要手动订阅,首先需要在初始化SDK (enableRtc()
)后,发起/接受通话前关闭自动订阅,开启手动订阅。
-
示例代码
java
//autoSub 设置成false 就开启手动订阅 AVChatManager.getInstance().setAutoPublish(autoPub, false);
-
手动订阅视频 在对方发布视频后(参考下文关于回调的说明)就可以订阅对方的视频了,API 如下:
java /**
* 手动订阅视频流
*
* @param account 要订阅的account
* @param videoType 要订阅的流类型,参考:<br/>
* {@link NRtcConstants.Subscribe#VIDEO_TYPE_HIGH_RES}: 大流<br/>
* {@link NRtcConstants.Subscribe#VIDEO_TYPE_LOW_RES}: 小流<br/>
* @return 0:操作成功 ,但是否订阅成功还得看回调结果{@link AVChatStateObserver#onSubscribeVideoResult(String, int, int)} <br/>
* {@link RtcCode.Subscribe#ACTION_DUPLICATE_ERR}:当前有正在进行中的操作 <br/>
* {@link RtcCode.Subscribe#MODE_CONFLICT_ERR}:模式冲突,当前是自动模式<br/>
* {@link RtcCode.Subscribe#FORBID_ACTION}:非法操作 , 订阅相关的操作只在会议模式下有效 ,点对点不支持<br/>
* {@link RtcCode.Subscribe#TYPE_CONFLICT_ERR}:视频类型冲突,需要取消之前订阅的流<br/>
* -1 :其它失败 <br/>
*/
public abstract int subscribeVideo(String account, int videoType);
在手动订阅视频流操作成功后(既结果返回0) , 之后会有相关的回调通知AVChatStateObserver#onSubscribeVideoResult(String, int , int )
,详情参考下文关于回调的描述。
-
取消订阅视频
如果不需要某个参考者的视频,就可以取消订阅他的视频,API如下:
java /**
* 手动取消订阅视频流
* @param account 要取消订阅的account
* @return 0:操作成功 ,但是否取消订阅成功还得看回调结果{{@link AVChatStateObserver#onUnsubscribeVideoResult(String, int)}}<br/>
* {@link RtcCode.Subscribe#ACTION_DUPLICATE_ERR}:当前有正在进行中的操作 <br/>
* {@link RtcCode.Subscribe#MODE_CONFLICT_ERR}:模式冲突,当前是自动模式<br/>
* {@link RtcCode.Subscribe#FORBID_ACTION}:非法操作 , 订阅相关的操作只在会议模式下有效 ,点对点不支持<br/>
* -1 :其它失败 <br/>
*/
public abstract int unsubscribeVideo(String account);
在手动取消订阅视频流操作成功后(既结果返回0) , 之后会有相关的回调通知AVChatStateObserver#onUnsubscribeVideoResult(String, int , int)
,详情参考下文关于回调的描述。
-
注意 在手动订阅模式下,如果用户由视频模式切换到音频模式(
disableVideo()
), SDK 会自动取消订阅之前的所有视频。但是切换回视频模式时,不会自动订阅之前的视频,需要用户再次手动订阅一下。 -
手动订阅音频
目前音频的订阅暂时无法区分用户,所以音频的订阅与取消订阅指的是所有的音频。
如果需要订阅所有的音频,API如下:
java /**
* 手动订阅所有的活跃音频流
*
* @return 0:操作成功 ,但是否订阅成功还得看回调结果{{@link AVChatStateObserver#onSubscribeAudioResult(int)}<br/>
* {@link RtcCode.Subscribe#ACTION_DUPLICATE_ERR}:当前有正在进行中的操作 <br/>
* {@link RtcCode.Subscribe#MODE_CONFLICT_ERR}:模式冲突,当前是自动模式<br/>
* {@link RtcCode.Subscribe#FORBID_ACTION}:非法操作 , 订阅相关的操作只在会议模式下有效 ,点对点不支持<br/>
* -1 :其它失败 <br/>
*/
public abstract int subscribeActiveAudio();
在手动订阅音频操作成功后(既结果返回0) , 之后会有相关的回调通知AVChatStateObserver#onSubscribeAudioResult(String, int)
,详情参考下文关于回调的描述。
- 取消订阅音频 如果需要取消订阅音频,API如下:
java /**
* 手动取消订阅所有的活跃音频流
*
* @return 0:操作成功,但是否取消订阅成功还得看回调结果{{@link AVChatStateObserver#onUnsubscribeAudioResult(int)}<br/>
* {@link RtcCode.Subscribe#ACTION_DUPLICATE_ERR}:当前有正在进行中的操作 <br/>
* {@link RtcCode.Subscribe#MODE_CONFLICT_ERR}:模式冲突,当前是自动模式<br/>
* {@link RtcCode.Subscribe#FORBID_ACTION}:非法操作 , 订阅相关的操作只在会议模式下有效 ,点对点不支持<br/>
* -1 :其它失败 <br/>
*/
public abstract int unsubscribeActiveAudio();
在手动取消订阅音频操作成功后(既结果返回0) , 之后会有相关的回调通知AVChatStateObserver#onUnsubscribeAudioResult(int)
,详情参考下文关于回调的描述。
订阅/发布相关的回调
在会议模式下,用户会收到订阅相关的回调,主要有以下两大类:
1. 本端发布(取消)、订阅(取消)操作相关的回调
2. 远端用户发布(取消)的回调
-
本端发布视频回调
当用户调用
publishVideo
,或者SDK内部发布(eg: 自动发布 …)视频后 , 会收到如下回调:java
/** * 发布视频流回调 * @param result 0为发布成功,非0为失败 */ void onPublishVideoResult(int result);
-
本端取消发布视频回调
当用户调用
unpublishVideo
,或者SDK内部取消发布(eg: 模式切换、角色切换 …)视频后,会收到如下回调:java
/** * 停止发布视频流回调 * @param result 0为停止发布成功,非0为失败 */ void onUnpublishVideoResult(int result);
-
本端订阅视频的结果回调
当用户调用
subscribeVideo
,或者SDK内部订阅(eg:自动订阅…)某人视频后,会收到如下的回调:
java /**
* 订阅视频流回调
*
* @param account 用户account
* @param videoType 订阅的流类型,参考:<br/>
* {@link NRtcConstants.Subscribe#VIDEO_TYPE_HIGH_RES}: 大流<br/>
* {@link NRtcConstants.Subscribe#VIDEO_TYPE_LOW_RES}: 小流<br/>
* @param result 0表示订阅成功,非0表示失败
*/
void onSubscribeVideoResult(String account, int videoType, int result);
-
本端取消订阅视频的结果回调
当用户调用
unsubscribeVideo
,或者SDK内部取消订阅(eg: 对方取消发布)某人视频后,会收到如下的回调:java
/** * 取消订阅视频流回调 * * @param videoType 取消订阅的流类型,参考:<br/> * {@link NRtcConstants.Subscribe#VIDEO_TYPE_HIGH_RES}: 大流<br/> * {@link NRtcConstants.Subscribe#VIDEO_TYPE_LOW_RES}: 小流<br/> * @param account 用户account * @param result 0表示取消订阅成功,非0表示失败 */ void onUnsubscribeVideoResult(String account, int videoType, int result);
-
本端订阅音频的结果回调
当用户调用
subscribeActiveAudio
,或者SDK内部订阅音频后,会收到如下的回调:java
/** * 订阅所有的活跃音频流时回调 * @param result 0表示订阅成功,非0表示失败 */ void onSubscribeAudioResult(int result);
-
本端取消订阅音频的结果回调
当用户调用
unsubscribeActiveAudio
,或者SDK内部取消订阅音频后,会收到如下的回调:java
/** * 取消订阅所有的活跃音频流时回调 * * @param result 0表示取消订阅成功,非0表示失败 */ void onUnsubscribeAudioResult(int result);
-
远端用户发布视频的回调 当会议中的其他用户发布视频时,本地会收到以下回调:
-
java
/** * 当远端用户开始发布视频流时回调 * * @param account 用户Account * @param videoTypes 当前用户发布的所有流类型,参考:<br/> * {@link NRtcConstants.Subscribe#VIDEO_TYPE_HIGH_RES}: 大流<br/> * {@link NRtcConstants.Subscribe#VIDEO_TYPE_LOW_RES}: 小流<br/> */ void onRemotePublishVideo(String account, int[] videoTypes);
说明:只有在某个用户发布了视频的时候,才能成功订阅对方的视频,建议本地可以记录已经发布视频的用户列表。
-
远端用户取消发布视频的回调
当会议中其他用户取消发布视频时,本地会收到以下回调:
java
/** * 当远端用户停止发布视频流时回调 * * @param account 用户Account */ void onRemoteUnpublishVideo(String account);
说明:当某个用户取消发布视频时,建议删除本地对应用户的发布记录。
查询功能
SDK提供了查询当前订阅、发布状态的接口,具体如下:
1. 查询当前是否为自动发布模式
2. 查询当前视频是否为自动订阅模式
3. 查询当前音频是否为自动订阅模式
- API原型
java /**
* 查询当前是否为自动发布模式
* @return true为自动发布,false为手动发布
*/
public abstract boolean isAutoPublishVideo();
/**
* 查询当前视频是否为自动订阅模式
* @return 返回true为自动订阅,false为手动订阅
*/
public abstract boolean isAutoSubscribeVideo();
/**
* 查询当前音频是否为自动订阅模式
* @return 返回true为自动订阅,false为手动订阅
*/
public abstract boolean isAutoSubscribeAudio();
- 示例
javaAVChatManager.getInstance().isAutoPublishVideo()
AVChatManager.getInstance().isAutoSubscribeVideo()
AVChatManager.getInstance().isAutoSubscribeAudio()