human: 如何处理七牛云的实时音视频发布和订阅

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > Android >发布和订阅

#  发布和订阅

最近更新时间: 2022-06-08 11:19:20

本文主要介绍如何实现在房间发布、订阅媒体流。

>   * **发布** 是指将创建好的音视频 Track
> 对应的音视频数据推送到七牛实时音视频服务的操作，执行发布操作后，远端用户可以选择性的进行订阅观看。
>   * **订阅** 是指向七牛实时音视频服务请求拉取远端发布的音视频数据的操作。订阅后，本地即可实时的接收远端发布的音视频数据。
>   * **有别于 CDN 转推** ，发布和订阅的音视频数据是基于实时性更好的 RTP 协议在房间内传输的，若您想要实现 RTMP
> 直播流分发的场景，请在音视频 Track 发布后，参考 [CDN
> 转推](https://developer.qiniu.com/rtc/development_guidelines/8770/turn-the-
> cdn-push-android)进行实现。
>

# 发布 Track

发布 [Track](https://developer.qiniu.com/rtc/quick_start/9909/the-rtc-basic-
concept#track) 前，需要对 Track
进行配置和创建，详情请见[音视频采集](https://developer.qiniu.com/rtc/development_guidelines/8767/audio-
and-video-collection-android)，对于已经创建好的 Track，可通过
[QNRTCClient.publish](https://developer.qiniu.com/rtc/api/8684/QNRTCClient#publish%5B1/4%5D)
接口向房间内进行发布。

>   * 请确保在发布前已经成功加入房间，否则将发布失败。
>

    
    
    // 发布本地音视频 track，支持可变参数
    public void publish(QNLocalTrack... tracks);
    public void publish(List<QNLocalTrack> trackList);
    // 发布本地音视频 track，支持可变参数以及发布结果回调通知
    public void publish(QNPublishResultCallback callback, QNLocalTrack... tracks);
    public void publish(QNPublishResultCallback callback, List<QNLocalTrack> trackList);
    

其中，[QNPublishResultCallback](https://developer.qiniu.com/rtc/api/8673/QNPublishResultCallback)
回调了发布操作的结果通知，其接口定义如下：

    
    
    public interface QNPublishResultCallback {
        // 成功发布 tracks
        void onPublished();
    
        // 发布 tracks 失败
        void onError(int errorCode, String errorMessage);
    }
    

发布 Track 失败的错误码可参考[发布 Track
相关错误码](https://developer.qiniu.com/rtc/development_guidelines/9904/rtc-error-
code-android#3)。

发布 Track 成功后，远端用户会收到如下通知回调：

    
    
    public interface QNClientEventListener {
        // 当远端 Track 发布时会触发此回调
        void onUserPublished(String remoteUserID, List<QNRemoteTrack> trackList);
    }
    

# 取消发布 Track

对于已发布的 track，可调用
[QNRTCClient.unpublish](https://developer.qiniu.com/rtc/api/8684/QNRTCClient#unpublish%5B1/2%5D)
接口取消发布。

    
    
    // 取消发布本地音视频 track，支持可变参数
    public void unpublish(QNLocalTrack... tracks);
    public void unpublish(List<QNLocalTrack> trackList)
    

取消发布成功后，远端用户会收到如下通知回调：

    
    
    public interface QNClientEventListener {
        // 当远端 Track 取消发布时会触发此回调
        void onUserUnpublished(String remoteUserID, List<QNRemoteTrack> trackList);
    }
    

# 订阅远端 Track

## 自动订阅

在 v2.x.x 版本后提供了默认自动订阅的功能，可通过
[QNRTCClient.setAutoSubscribe](https://developer.qiniu.com/rtc/api/8684/QNRTCClient#setAutoSubscribe)
接口进行自动订阅功能的开启与关闭，默认为开启状态。

    
    
    public void setAutoSubscribe(boolean autoSubscribe);
    

## 手动订阅

在自动订阅功能关闭时，用户可以通过调用
[QNRTCClient.subscribe](https://developer.qiniu.com/rtc/api/8684/QNRTCClient#subscribe%5B1/2%5D)
接口订阅远端 Tracks。

    
    
    // 订阅远端音视频 track，支持可变参数
    public void subscribe(QNRemoteTrack... tracks);
    public void subscribe(List<QNRemoteTrack> trackList);
    

**无论是自动订阅还是手动订阅，当成功订阅远端用户媒体流后，都会触如下回调** ：

    
    
    public interface QNClientEventListener {
        // 当成功订阅远端 Track 时会触发此回调
        void onSubscribed(String remoteUserID, List<QNRemoteAudioTrack> remoteAudioTracks, List<QNRemoteVideoTrack> remoteVideoTracks);
    }
    

成功订阅远端视频后，即可通过
[QNRemoteVideoTrack.play](https://developer.qiniu.com/rtc/api/8680/QNRemoteVideoTrack#play)
接口进行远端视频画面的渲染。

# 取消订阅远端 Track

调用
[QNRTCClient.unsubscribe](https://developer.qiniu.com/rtc/api/8684/QNRTCClient#unsubscribe%5B1/2%5D)
接口取消订阅远端 Tracks。

    
    
    public void unsubscribe(QNRemoteTrack... tracks);
    public void unsubscribe(List<QNRemoteTrack> trackList);
    

# 示例代码

发布订阅场景的示例代码可参考 [QNRTC-API-Examples](https://github.com/pili-engineering/QNRTC-
Android/tree/master/QNRTC-API-Examples)。

以上内容是否对您有帮助？