输入关键词搜索,支持 AI 答疑

视频订阅

更新时间: 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);

  • 说明
  1. 如果开启了录屏模式 setVideoQualityStrategy(AVChatVideoQualityStrategy.ScreenSharing) ,设置多流将会无效,强制单流。
  2. 如果开启多流,最低允许设置的分辨率为 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);
  • 说明
    1. 在自动发布模式下,与发布相关的接口将不可用,但是相关回调还会正常的回调。
    2. 在自动发布模式下,如果用户由视频模式切换到音频模式(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()
此文档是否对你有帮助?
有帮助
去反馈
  • 多流(beta )
  • 自动发布视频
  • 手动发布视频
  • 自动订阅音视频
  • 手动订阅音视频
  • 订阅/发布相关的回调
  • 查询功能