jancd/qiniu-developer_ShareGPT huggingface dataset:
human: 如何处理七牛云的实时音视频发布和订阅

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

#  发布和订阅

最近更新时间: 2022-03-24 14:19:06

本部分介绍能够实现向房间发布或取消发布媒体流，订阅或停止订阅媒体流等操作。

## 发布 Track

发布 Track 前，需要对 Track
进行配置和创建，详情请见[音视频采集](https://developer.qiniu.com/rtc/development_guidelines/9546/media_capture)，创建好
Track 后即可将该 Track 通过 `QNRTCClient.Publish` 向房间内进行发布。

    
    
    virtual int Publish(LocalTrackList& track_list) = 0;
    

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

    
    
    class QINIU_EXPORT_DLL QNPublishResultCallback
    {
    public:
        /**
        * 发布成功后触发此回调
        */
        virtual void OnPublished() = 0;
    
        /**
        * 发布失败后触发此回调
        *
        * @param error_code 错误码
        * @param error_message 错误消息
        */
        virtual void OnPublishError(int error_code, const std::string& error_message) = 0;
    protected:
        ~QNPublishResultCallback() {}
    };
    

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

    
    
    class QNClientEventListener
    {
    public:
        // 当远端 track 发布时会触发此回调
         virtual void OnUserPublished(const std::string& remote_user_id_, const RemoteTrackList& track_list) = 0;
    }
    

## 取消发布 Track

调用 `QNRTCClient.UnPublish` 取消发布本地媒体流。

    
    
    // 取消发布本地音视频 track，支持可变参数
    virtual int UnPublish(LocalTrackList& track_list) = 0;
    

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

    
    
    class QNClientEventListener
    {
    public:
        // 当远端 track 取消发布时会触发此回调
       virtual void OnUserUnpublished(const std::string& remote_user_id, const RemoteTrackList& track_list) = 0;
    }
    

## 订阅远端 Track

在 v4.x.x 版本后提供了默认自动订阅的功能，用户可以通过调用 `QNRTCClient.SetAutoSubscribe`
进行对自动订阅功能的开启与关闭，默认为开启状态。

    
    
    virtual void SetAutoSubscribe(bool auto_subscribe) = 0;
    

在自动订阅功能关闭时，用户可以通过调用 `QNRTCClient.Subscribe` 接口订阅远端 Tracks。

    
    
    // 订阅远端音视频 track，支持可变参数
    virtual void Subscribe(const RemoteTrackList& track_list) = 0;
    

本地订阅远端用户媒体流成功后，会触如下回调：

    
    
    class QNClientEventListener 
    {
    public:
        // 当成功订阅远端 track 时会触发此回调
        virtual void OnSubscribed(const std::string& remote_user_id, const RemoteAudioTrackList& remote_audio_track_list, const RemoteVideoTrackList& remote_video_track_list) = 0;
    }
    

## 取消订阅远端 Track

调用 `QNRTCClient.UnSubscribe` 接口取消订阅远端 Tracks。

    
    
    virtual void UnSubscribe(const RemoteTrackList& track_list) = 0;
    

以上内容是否对您有帮助？
human: 如何处理七牛云的实时音视频背景音乐混音

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > Windows >背景音乐混音

#  背景音乐混音

最近更新时间: 2022-03-24 14:27:55

本文主要介绍背景音乐混音功能的使用。

用户可在连麦过程中将需要混音的音乐文件使用电脑中的音乐播放器进行播放，SDK 通过监听电脑声卡来获取需要混音的声音数据

## Windows

### 开启声卡监听

SDK 当前支持基于
[QNMicrophoneAudioTrack](https://developer.qiniu.com/rtc/api/9433/qnmicrophoneaudiotrack)
或
[QNCustomAudioTrack](https://developer.qiniu.com/rtc/api/9409/qncustomaudiotrack)
的混音功能, 在创建完
[QNMicrophoneAudioTrack](https://developer.qiniu.com/rtc/api/9433/qnmicrophoneaudiotrack)
或者
[QNCustomAudioTrack](https://developer.qiniu.com/rtc/api/9409/qncustomaudiotrack)
实例之后，调用
[QNRTCClient::MixDesktopAudio](https://developer.qiniu.com/rtc/api/9420/qnlocalaudiotrack#MixDesktopAudio)
接口来开启监听

    
    
    virtual void MixAudioWithSoundCard(bool enable, float volume_scale_ratio = 1.0f) = 0;
    

以上内容是否对您有帮助？
human: 如何处理七牛云的实时音视频视频大小流

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > Windows >视频大小流

#  视频大小流

最近更新时间: 2022-03-24 14:40:39

本部分介绍视频大小流的使用方式。

## 功能介绍

![大小流示意图](http://docs.qnsdk.com/multistream.png)

当用户 A 开启大流时，会发送多个不同分辨率的视频码流到服务端；此时，不同的用户需要订阅 A
的视频流时可以根据自己的需要或者服务端的策略来订阅到不同质量的视频流。

## 开启大小流

在创建摄像头 track 时，可以通过 track config 提供的 `multi_profile_enabled` 成员来启用大小流功能，以
QNCameraVideoTrack 为例，其启用方式如下：

    
    
        QNCameraVideoTrackConfig camera_info = {{width, height, 30, 2000},
                                                {width, height, 30},
                                                video_dev_id,
                                                CAMERA_TAG,
                                                enable_simulcast_}; // 是否开启大小流
    QNCameraVideoTrack video_track = QNRTC::CreateCameraVideoTrack(camera_info);
    

开启大小流功能后，发送端可以通过获取统计信息的接口
[QNRTCClient.GetLocalVideoTrackStats](https://developer.qiniu.com/rtc/api/9446/QNRTCClient#GetLocalVideoTrackStats)
来感知发送情况。

## 订阅大小流

订阅端可以通过
[QNRemoteVideoTrack.IsMultiProfileEnabled](https://developer.qiniu.com/rtc/api/9443/QNRemoteVideoTrack#IsMultiProfileEnabled)
接口判断远端用户是否发布大小流。若接口返回 true，则可通过
[QNRemoteVideoTrack.SetProfile](https://developer.qiniu.com/rtc/api/9443/QNRemoteVideoTrack#SetProfile)
来订阅指定的 QNTrackProfile。

示例代码如下：

    
    
    if (remote_video_track.IsMultiProfileEnabled()) {
        remote_video_track.SetProfile(qiniu::QNTrackProfile::kMedium);
    }
    

> **注意：SetProfile 接口仅是设置预期的流等级，并不代表实际的订阅等级，若实际发送端还未发送指定等级的流，则将无法订阅到指定的
> profile**

当订阅指定 profile 生效后，将通过回调
[QNTrackInfoChangedListener.OnVideoProfileChanged](https://developer.qiniu.com/rtc/api/9453/QNTrackInfoChangedListener#OnVideoProfileChanged)
告知。

## 注意事项

  * **开启大小流功能设置编码宽高最低为 1280 x 720**
  * **目前仅支持在发送端发布单路 camera 视频 track 的场景下，使用大小流功能**
  * **对于开启大小流的用户，建议保证有良好的网络环境，保证多流发送质量**

以上内容是否对您有帮助？
human: 如何处理七牛云的实时音视频通话质量统计

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > Windows >通话质量统计

#  通话质量统计

最近更新时间: 2022-03-24 16:17:57

本文主要介绍 SDK 如何对通话过程中的网络以及音视频的质量进行监控。

> 获取通话中的质量监测信息前，请确保您已经**加入了房间** 并且**已经发布或订阅了相关的音视频 Track** 。

# 音频质量统计

## 获取本地音频质量统计

SDK 质量统计接口均为**主动调用接口** ，您可以在适当的时机通过调用
[QNRTCClient::GetLocalAudioTrackStats](https://developer.qiniu.com/rtc/api/9446/QNRTCClient#GetLocalAudioTrackStats)
接口获取当前本地的音频质量统计信息，并通过 trackID 来获取对应轨道的质量统计。获取到的质量统计内容
[QNLocalAudioTrackStats](https://developer.qiniu.com/rtc/api/9421/QNLocalAudioTrackStats)
主要包含如下信息：

属性| 描述  
---|---  
uplink_bitrate| 本地音频上行的码率，单位 bps  
uplink_rtt| 本地音频上行的网络延时，单位 ms  
uplink_lostrate| 本地音频上行的丢包率，范围 [0, 100]  
  
## 获取远端音频质量统计

SDK 质量统计接口均为**主动调用接口** ，您可以在适当的时机通过调用
[QNRTCClient::GetRemoteAudioTrackStats](https://developer.qiniu.com/rtc/api/9446/QNRTCClient#GetRemoteAudioTrackStats)
接口获取当前远端的音频质量统计信息，并通过 trackID 来获取对应轨道的质量统计。获取到的质量统计内容
[QNRemoteAudioTrackStats](https://developer.qiniu.com/rtc/api/9439/QNRemoteAudioTrackStats)
主要包含如下信息：

属性| 描述  
---|---  
downlink_bitrate| 本地拉取远端音频时下行的码率，单位 bps  
downlink_lostrate| 本地拉取远端音频时下行的丢包率，范围 [0, 100]  
uplink_rtt| 远端音频上行的网络延时，单位 ms  
uplink_lostrate| 远端音频上行的丢包率，范围 [0, 100]  
  
# 视频质量统计

## 获取本地视频质量统计

SDK 质量统计接口均为**主动调用接口** ，您可以在适当的时机通过调用
[QNRTCClient::GetLocalVideoTrackStats](https://developer.qiniu.com/rtc/api/9446/QNRTCClient#GetLocalVideoTrackStats)
接口获取当前本地的视频质量统计信息，并通过 trackID 来获取对应轨道的质量统计。获取到的质量统计内容
[QNLocalVideoTrackStats](https://developer.qiniu.com/rtc/api/9425/QNLocalVideoTrackStats)
主要包含如下信息：

属性| 描述  
---|---  
profile|
当前所统计视频的[质量等级](https://developer.qiniu.com/rtc/api/9454/QNTrackProfile)，profile
说明亦可参考[视频大小流](https://developer.qiniu.com/rtc/development_guidelines/9550/multi_stream)文档  
uplink_framerate| 本地视频上行的帧率，单位 fps  
uplink_bitrate| 本地视频上行的码率，单位 bps  
uplink_rtt| 本地视频上行的网络延时，单位 ms  
uplink_lostrate| 本地视频上行的丢包率，范围 [0, 100]  
  
## 获取远端视频质量统计

SDK 质量统计接口均为**主动调用接口** ，您可以在适当的时机通过调用
[QNRTCClient::GetRemoteVideoTrackStats](https://developer.qiniu.com/rtc/api/9446/QNRTCClient#GetRemoteVideoTrackStats)
接口获取当前远端的视频质量统计信息，并通过 trackID 来获取对应轨道的质量统计。获取到的质量统计内容
[QNRemoteVideoTrackStats](https://developer.qiniu.com/rtc/api/9444/QNRemoteVideoTrackStats)
主要包含如下信息：

属性| 描述  
---|---  
profile|
当前订阅的视频的[质量等级](https://developer.qiniu.com/rtc/api/9454/QNTrackProfile)，profile
说明亦可参考[视频大小流](https://developer.qiniu.com/rtc/development_guidelines/9550/multi_stream)文档  
downlink_framerate| 本地拉取远端视频时下行的帧率，单位 fps  
downlink_bitrate| 本地拉取远端视频时下行的码率，单位 bps  
downlink_lostrate| 本地拉取远端视频时下行的丢包率，范围 [0, 100]  
uplink_rtt| 远端视频上行的网络延时，单位 ms  
uplink_lostrate| 远端视频上行的丢包率，范围 [0, 100]  
  
# 示例代码

上述已经简单介绍了质量统计信息的获取方式，相对应的示例代码可参考[体验 demo](https://github.com/pili-
engineering/QNRTC-Windows)。

以上内容是否对您有帮助？
human: 如何处理七牛云的实时音视频错误码

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > Windows >错误码

#  错误码

最近更新时间: 2022-03-24 15:40:56

本文主要介绍 QNRTC SDK 各端相关的错误码及其建议的处理方式。

> 若返回的错误码本文未提及，请[提交工单](https://support.qiniu.com/tickets/new)或者联系七牛技术支持同学协助解决

# 房间相关错误码

枚举值| 错误码| 说明| 处理方式  
---|---|---|---  
SUCCESS| 0| 无错误| 无  
ERROR_TOKEN_ERROR| 10001| 房间 Token 错误| 表示您提供的房间 token 不符合七牛 token 签算规则，详情请参考
[RoomToken 签发服务](https://doc.qnsdk.com/rtn/docs/server_overview#1)  
ERROR_TOKEN_EXPIRED| 10002| 房间 Token 过期| 表示您的房间 token 过期，需要重新生成 token 再加入  
ERROR_PLAYER_ALREADY_EXIST| 10022| 房间内已经有同名用户|
后台如果配置为开启“禁止自动踢人”，则同一用户重复加入/未正常退出再加入会触发此错误  
ERROR_MEDIA_CAP_NOT_SUPPORT| 10054| 媒体协商失败| 表示该设备不支持指定的音视频格式，无法进行连麦的操作  
ERROR_AUTH_FAILED| 21001| 加入房间认证失败| 服务验证时出错，可能为服务网络异常，也可能是 token 验证失败，建议检查签算
token 的信息是否异常，若 token 无误，可重新尝试加入房间  
ERROR_RECONNECT_FAILED| 21003| 30s 内未能重连成功或者重连时房间已被销毁| 建议检查网络并重新申请 token
加入房间。当发生该错误时，之前创建的转推任务将被服务销毁，如有需要，应在下次成功加入房间后按业务需要恢复  
ERROR_FATAL| 21005| 非预期错误| 表示 RTC 生命周期异常，需要释放资源并重新初始化  
  
> **SDK 重连机制：**
>
>   * SDK 内部会尝试无限重连
>   * 如果 30s 内无法完成有效的重连过程，则超时后的重连请求在到达 RTC 服务后会抛出 `ERROR_RECONNECT_FAILED` 错误
>

# 设备采集相关错误码

枚举值| 错误码| 说明| 处理方式  
---|---|---|---  
ERROR_DEVICE_CAMERA_EVICTED| 23002| 摄像头被其他应用抢占| 请确认是否有其他应用抢占摄像头  
ERROR_MIC_INIT_FAILED| 23006| 系统麦克风初始化错误，无权限或者麦克风被占用|
请确认应用是否获取音频录制的权限或者麦克风是否被占用  
ERROR_MIC_CAPTURE_FAILED| 23007| 麦克风录制失败| 可尝试取消发布并重新发布麦克风 Track  
Err_Speaker_Init_failed| 23008| 扬声器无权限或者被占用| 请确认应用是否获取音频播放的权限或者扬声器被占用  
  
# 发布 Track 相关错误码

枚举值| 错误码| 说明| 处理方式  
---|---|---|---  
ERROR_INVALID_PARAMETER| 10053| 非法参数| 请检查待发布 Track 是否为本地 Track，并且不为空  
ERROR_INVALID_STATE| 21002| 非法状态| 请检查是否已经加入房间  
ERROR_FATAL| 21005| 非预期错误| RTC 生命周期异常，需要释放资源并重新初始化  
  
# CDN 转推相关错误码

枚举值| 错误码| 说明| 处理方式  
---|---|---|---  
ERROR_NO_PERMISSION| 10051| 无操作权限| 请检查用户的 token 签算权限  
ERROR_INVALID_PARAMETER| 10053| 参数错误| 请检查操作的参数是否合法  
ERROR_INVALID_STATE| 21002| 状态异常| 请检查房间状态，加入房间后才可以创建转推任务  
ERROR_NETWORK_TIMEOUT| 21004| 操作超时| 请重新尝试操作  
ERROR_FATAL| 21005| 服务端错误| 请重新尝试操作或者联系七牛技术支持同学协助定位  
  
# 跨房媒体转发相关错误码

枚举值| 错误码| 说明| 处理方式  
---|---|---|---  
Err_Relay_Token_Invalid| 24000| Token 验证失败| 请确认 Token 签算是否正确  
Err_Relay_Already_Start| 24001| 已开启跨房| 请勿重复操作  
Err_Relay_Not_Start| 24002| 跨房没有开启| 请先开启跨房再进行操作  
Err_Relay_Destination_Room_Not_Existed| 24003| 目标房间不存在| 请确认跨房的目标房间是否存在  
Err_Relay_Player_In_Dest_Room| 24004| 用户不在目标房间内| 请确认用户是否在目标房间内  
Err_Relay_Start_Failed| 24004| 跨房开启失败| 请确认跨房参数是否正确  
Err_Invalid_Client_Mode| 24006| 使用场景不符| 请切换到互动直播场景  
Err_Invalid_Client_Role| 24007| 用户角色不符| 请根据当前场景切换到指定角色再进行操作  
  
以上内容是否对您有帮助？
human: 如何处理七牛云的实时音视频初始化

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > Linux >初始化

#  初始化

最近更新时间: 2022-03-28 16:03:48

本部分介绍了实时音视频的初始化方式及其配置项。

在加入房间前，SDK 提供了一系列的方法用来进行初始化配置。在配置好后通过 QNRTC::CreateClient 创建 QNRTCClient对象 即可。

## 初始化

    
    
    qiniu::QNRTCSetting setting;
    qiniu::QNRTC::Init(setting, this);
    

## 设置日志等级

通过调用 `QNRTC::SetLogFile` 设置 SDK 的日志等级

    
    
    static int32_t SetLogFile(QNLogLevel level, const std::string& dir_name, const std::string& file_name);
    

以上内容是否对您有帮助？
human: 如何处理七牛云的实时音视频房间管理

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > Linux >房间管理

#  房间管理

最近更新时间: 2022-03-28 17:18:31

房间表示一个多人的视频会话，本部分介绍如何进行房间管理，获取房间信息以及用户信息等常见功能。

## 加入房间

本地调用 [QNRTCClient.Join(String
token)](https://developer.qiniu.com/rtc/api/11288/QNRTCClient-Linux#Join) 通过
roomToken 加入房间。

    
    
    virtual void Join(const std::string& token, const std::string& user_data = "") = 0;
    

示例代码如下：

    
    
    client->Join(room_token);
    

>   1. 请确保在 `QNConnectionState.kDisconnected` 状态下调用该接口加入房间，否则接口调用无效
>   2. 加入房间时根据业务需求，每个用户可通过 `user_data` 携带自定义数据
>

关于 roomToken 在服务端的生成可查阅 [RoomToken
的签算](https://doc.qnsdk.com/rtn/docs/rtn_startup)。

本地加入房间成功后，会触发如下回调：

**本地用户收到的回调：**

当成功加入房间后，会通过
[QNClientEventListener.OnConnectionStateChanged](https://developer.qiniu.com/rtc/api/11261/QNClientEventListener-
Linux#OnConnectionStateChanged) 接收到房间状态改变的通知

    
    
    class QNClientEventListener
    {
    public:
        // 当房间状态改变时会触发此回调，成功加入房间后，回调状态为 QNConnectionState.kConnected
        virtual void OnConnectionStateChanged(QNConnectionState state, const QNConnectionDisconnectedInfo& info) = 0;
    }
    

**远端用户收到的回调：**

    
    
    class QNClientEventListener
    {
    public:
        // 当远端用户加入房间时会触发此回调
        virtual void OnUserJoined(const std::string& remote_user_id, const std::string& user_data) = 0;
    }
    

* * *

## 离开房间

本地调用
[QNRTCClient.Leave()](https://developer.qiniu.com/rtc/api/11288/QNRTCClient-
Linux#Leave) 退出房间。本地退出房间成功后，会触发如下回调：

**本地用户收到的回调：**

    
    
    class QNClientEventListener
    {
    public:
        // 当房间状态改变时会触发此回调，成功离开房间后，回调状态为 QNConnectionState.kDisconnected，QNConnectionDisconnectedInfo 回调 Reason 为 kLeave
        void OnConnectionStateChanged(QNConnectionState state, const QNConnectionDisconnectedInfo& info) = 0;
    }
    

**远端用户收到的回调：**

    
    
    class QNClientEventListener
    {
    public:
        // 当远端用户离开房间时会触发此回调
        virtual void OnUserLeft(const std::string& remote_user_id) = 0;
    }
    

* * *

## 房间信息

### 获取房间内远端用户信息

本地可调用 [QNRTCClient.GetRemoteUsers(const std::string&
userId)](https://developer.qiniu.com/rtc/api/11288/QNRTCClient-
Linux#GetRemoteUsers%5B1/2%5D) 接口获取音视频通话房间中的指定用户。

    
    
    virtual QNRemoteUser& GetRemoteUsers(const std::string& userId) = 0;out/
    

本地可调用
[QNRTCClient.GetRemoteUsers()](https://developer.qiniu.com/rtc/api/11288/QNRTCClient-
Linux#GetRemoteUsers%5B2/2%5D) 接口获取音视频通话房间中的远端用户列表。

    
    
    virtual RemoteUserList& GetRemoteUsers() = 0;
    

其中，[QNRemoteUser](https://developer.qiniu.com/rtc/api/11214/QNRemoteUser-
Linux) 代表远端用户的信息，通过该对象可以获取指定 user 发布的音视频列表以及本地对其的订阅情况。

以上内容是否对您有帮助？
human: 如何处理七牛云的实时音视频发布和订阅

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

#  发布和订阅

最近更新时间: 2022-03-28 17:17:24

本部分介绍能够实现向房间发布或取消发布媒体流，订阅或停止订阅媒体流等操作。

## 发布 Track

发布 Track 前，需要对 Track
进行配置和创建，详情请见[音视频采集](https://developer.qiniu.com/rtc/development_guidelines/11371/media-
capture-linux)，创建好 Track 后即可将该 Track 通过 `QNRTCClient.Publish` 向房间内进行发布。

    
    
    virtual int Publish(LocalTrackList& track_list) = 0;
    

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

    
    
    class QINIU_EXPORT_DLL QNPublishResultCallback
    {
    public:
        /**
        * 发布成功后触发此回调
        */
        virtual void OnPublished() = 0;
    
        /**
        * 发布失败后触发此回调
        *
        * @param error_code 错误码
        * @param error_message 错误消息
        */
        virtual void OnPublishError(int error_code, const std::string& error_message) = 0;
    protected:
        ~QNPublishResultCallback() {}
    };
    

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

    
    
    class QNClientEventListener
    {
    public:
        // 当远端 track 发布时会触发此回调
         virtual void OnUserPublished(const std::string& remote_user_id_, const RemoteTrackList& track_list) = 0;
    }
    

## 取消发布 Track

调用 `QNRTCClient.UnPublish` 取消发布本地媒体流。

    
    
    // 取消发布本地音视频 track，支持可变参数
    virtual int UnPublish(LocalTrackList& track_list) = 0;
    

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

    
    
    class QNClientEventListener
    {
    public:
        // 当远端 track 取消发布时会触发此回调
       virtual void OnUserUnpublished(const std::string& remote_user_id, const RemoteTrackList& track_list) = 0;
    }
    

## 订阅远端 Track

在 v4.x.x 版本后提供了默认自动订阅的功能，用户可以通过调用 `QNRTCClient.SetAutoSubscribe`
进行对自动订阅功能的开启与关闭，默认为开启状态。

    
    
    virtual void SetAutoSubscribe(bool auto_subscribe) = 0;
    

在自动订阅功能关闭时，用户可以通过调用 `QNRTCClient.Subscribe` 接口订阅远端 Tracks。

    
    
    // 订阅远端音视频 track，支持可变参数
    virtual void Subscribe(const RemoteTrackList& track_list) = 0;
    

本地订阅远端用户媒体流成功后，会触如下回调：

    
    
    class QNClientEventListener 
    {
    public:
        // 当成功订阅远端 track 时会触发此回调
        virtual void OnSubscribed(const std::string& remote_user_id, const RemoteAudioTrackList& remote_audio_track_list, const RemoteVideoTrackList& remote_video_track_list) = 0;
    }
    

## 取消订阅远端 Track

调用 `QNRTCClient.UnSubscribe` 接口取消订阅远端 Tracks。

    
    
    virtual void UnSubscribe(const RemoteTrackList& track_list) = 0;
    

以上内容是否对您有帮助？
human: 如何处理七牛云的实时音视频视频大小流

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > Linux >视频大小流

#  视频大小流

最近更新时间: 2022-03-28 17:07:49

本部分介绍视频大小流的使用方式。

## 功能介绍

![大小流示意图](http://docs.qnsdk.com/multistream.png)

当用户 A 开启大流时，会发送多个不同分辨率的视频码流到服务端；此时，不同的用户需要订阅 A
的视频流时可以根据自己的需要或者服务端的策略来订阅到不同质量的视频流。

## 开启大小流

在创建摄像头 track 时，可以通过 track config 提供的 `multi_profile_enabled` 成员来启用大小流功能，以
QNCameraVideoTrack 为例，其启用方式如下：

    
    
    QNCameraVideoTrackConfig video_track_config;
    video_track_config.id = camera_device_id;
    video_track_config.capture_config = {width, height, fps};
    video_track_config.encoder_config = {width, height, fps, bitrate};
    video_track_config.multi_profile_enabled = true; // 是否开启大小流
    QNCameraVideoTrack video_track = QNRTC::CreateCameraVideoTrack(video_track_config);
    

开启大小流功能后，发送端可以通过获取统计信息的接口
[QNRTCClient.GetLocalVideoTrackStats](https://developer.qiniu.com/rtc/api/11288/QNRTCClient-
Linux#GetLocalVideoTrackStats) 来感知发送情况。

## 订阅大小流

订阅端可以通过
[QNRemoteVideoTrack.IsMultiProfileEnabled](https://developer.qiniu.com/rtc/api/11215/QNRemoteVideoTrack-
Linux#IsMultiProfileEnabled) 接口判断远端用户是否发布大小流。若接口返回 true，则可通过
[QNRemoteVideoTrack.SetProfile](https://developer.qiniu.com/rtc/api/11215/QNRemoteVideoTrack-
Linux#SetProfile) 来订阅指定的 QNTrackProfile。

示例代码如下：

    
    
    if (remote_video_track.IsMultiProfileEnabled()) {
        remote_video_track.SetProfile(qiniu::QNTrackProfile::kMedium);
    }
    

> **注意：SetProfile 接口仅是设置预期的流等级，并不代表实际的订阅等级，若实际发送端还未发送指定等级的流，则将无法订阅到指定的
> profile**

当订阅指定 profile 生效后，将通过回调
[QNTrackInfoChangedListener.OnVideoProfileChanged](https://developer.qiniu.com/rtc/api/11223/QNTrackInfoChangedListener-
Linux#OnVideoProfileChanged) 告知。

## 注意事项

  * **开启大小流功能设置编码宽高最低为 1280 x 720**
  * **目前仅支持在发送端发布单路 camera 视频 track 的场景下，使用大小流功能**
  * **对于开启大小流的用户，建议保证有良好的网络环境，保证多流发送质量**

以上内容是否对您有帮助？
human: 如何处理七牛云的实时音视频通话质量统计

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > Linux >通话质量统计

#  通话质量统计

最近更新时间: 2022-03-28 17:21:13

本文主要介绍 SDK 如何对通话过程中的网络以及音视频的质量进行监控。

> 获取通话中的质量监测信息前，请确保您已经**加入了房间** 并且**已经发布或订阅了相关的音视频 Track** 。

# 音频质量统计

## 获取本地音频质量统计

SDK 质量统计接口均为**主动调用接口** ，您可以在适当的时机通过调用
[QNRTCClient::GetLocalAudioTrackStats](https://developer.qiniu.com/rtc/api/11288/QNRTCClient-
Linux#GetLocalAudioTrackStats) 接口获取当前本地的音频质量统计信息，并通过 trackID
来获取对应轨道的质量统计。获取到的质量统计内容
[QNLocalAudioTrackStats](https://developer.qiniu.com/rtc/api/11273/QNLocalAudioTrackStats-
Linux) 主要包含如下信息：

属性| 描述  
---|---  
uplink_bitrate| 本地音频上行的码率，单位 bps  
uplink_rtt| 本地音频上行的网络延时，单位 ms  
uplink_lostrate| 本地音频上行的丢包率，范围 [0, 100]  
  
## 获取远端音频质量统计

SDK 质量统计接口均为**主动调用接口** ，您可以在适当的时机通过调用
[QNRTCClient::GetRemoteAudioTrackStats](https://developer.qiniu.com/rtc/api/11288/QNRTCClient-
Linux#GetRemoteAudioTrackStats) 接口获取当前远端的音频质量统计信息，并通过 trackID
来获取对应轨道的质量统计。获取到的质量统计内容
[QNRemoteAudioTrackStats](https://developer.qiniu.com/rtc/api/11285/QNRemoteAudioTrackStats-
Linux) 主要包含如下信息：

属性| 描述  
---|---  
downlink_bitrate| 本地拉取远端音频时下行的码率，单位 bps  
downlink_lostrate| 本地拉取远端音频时下行的丢包率，范围 [0, 100]  
uplink_rtt| 远端音频上行的网络延时，单位 ms  
uplink_lostrate| 远端音频上行的丢包率，范围 [0, 100]  
  
# 视频质量统计

## 获取本地视频质量统计

SDK 质量统计接口均为**主动调用接口** ，您可以在适当的时机通过调用
[QNRTCClient::GetLocalVideoTrackStats](https://developer.qiniu.com/rtc/api/11288/QNRTCClient-
Linux#GetLocalVideoTrackStats) 接口获取当前本地的视频质量统计信息，并通过 trackID
来获取对应轨道的质量统计。获取到的质量统计内容
[QNLocalVideoTrackStats](https://developer.qiniu.com/rtc/api/11274/QNLocalVideoTrackStats-
Linux) 主要包含如下信息：

属性| 描述  
---|---  
profile|
当前所统计视频的[质量等级](https://developer.qiniu.com/rtc/api/11293/QNTrackProfile-
Linux)，profile
说明亦可参考[视频大小流](https://developer.qiniu.com/rtc/development_guidelines/11370/multi-
stream-linux)文档  
uplink_framerate| 本地视频上行的帧率，单位 fps  
uplink_bitrate| 本地视频上行的码率，单位 bps  
uplink_rtt| 本地视频上行的网络延时，单位 ms  
uplink_lostrate| 本地视频上行的丢包率，范围 [0, 100]  
  
## 获取远端视频质量统计

SDK 质量统计接口均为**主动调用接口** ，您可以在适当的时机通过调用
[QNRTCClient::GetRemoteVideoTrackStats](https://developer.qiniu.com/rtc/api/11288/QNRTCClient-
Linux#GetRemoteVideoTrackStats) 接口获取当前远端的视频质量统计信息，并通过 trackID
来获取对应轨道的质量统计。获取到的质量统计内容
[QNRemoteVideoTrackStats](https://developer.qiniu.com/rtc/api/11286/QNRemoteVideoTrackStats-
Linux) 主要包含如下信息：

属性| 描述  
---|---  
profile|
当前订阅的视频的[质量等级](https://developer.qiniu.com/rtc/api/11293/QNTrackProfile-
Linux)，profile
说明亦可参考[视频大小流](https://developer.qiniu.com/rtc/development_guidelines/11370/multi-
stream-linux)文档  
downlink_framerate| 本地拉取远端视频时下行的帧率，单位 fps  
downlink_bitrate| 本地拉取远端视频时下行的码率，单位 bps  
downlink_lostrate| 本地拉取远端视频时下行的丢包率，范围 [0, 100]  
uplink_rtt| 远端视频上行的网络延时，单位 ms  
uplink_lostrate| 远端视频上行的丢包率，范围 [0, 100]  
  
以上内容是否对您有帮助？
human: 如何处理七牛云的实时音视频错误码

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > Linux >错误码

#  错误码

最近更新时间: 2022-03-28 16:57:03

本文主要介绍 QNRTC SDK 各端相关的错误码及其建议的处理方式。

> 若返回的错误码本文未提及，请[提交工单](https://support.qiniu.com/tickets/new)或者联系七牛技术支持同学协助解决

# 房间相关错误码

枚举值| 错误码| 说明| 处理方式  
---|---|---|---  
QNRTC_OK| 0| 无错误| 无  
Err_Token_Error| 10001| 房间 Token 错误| 表示您提供的房间 token 不符合七牛 token 签算规则，详情请参考
[RoomToken 签发服务](https://doc.qnsdk.com/rtn/docs/server_overview#1)  
Err_Token_Expired| 10002| 房间 Token 过期| 表示您的房间 token 过期，需要重新生成 token 再加入  
Err_User_Already_Exist| 10022| 房间内已经有同名用户|
后台如果配置为开启“禁止自动踢人”，则同一用户重复加入/未正常退出再加入会触发此错误  
Err_Media_Not_Support| 10054| 媒体协商失败| 表示该设备不支持指定的音视频格式，无法进行连麦的操作  
Err_Auth_Failed| 21001| 加入房间认证失败| 服务验证时出错，可能为服务网络异常，也可能是 token 验证失败，建议检查签算
token 的信息是否异常，若 token 无误，可重新尝试加入房间  
Err_Reconnect_Failed| 21003| 30s 内未能重连成功或者重连时房间已被销毁| 建议检查网络并重新申请 token
加入房间。当发生该错误时，之前创建的转推任务将被服务销毁，如有需要，应在下次成功加入房间后按业务需要恢复  
Err_Fatal| 21005| 非预期错误| 表示 RTC 生命周期异常，需要释放资源并重新初始化  
  
> **SDK 重连机制：**
>
>   * SDK 内部会尝试无限重连
>   * 如果 30s 内无法完成有效的重连过程，则超时后的重连请求在到达 RTC 服务后会抛出 `Err_Reconnect_Failed` 错误
>

# 设备采集相关错误码

枚举值| 错误码| 说明| 处理方式  
---|---|---|---  
Err_Mic_Init_Failed| 23006| 系统麦克风初始化错误，无权限或者麦克风被占用| 请确认应用是否获取音频录制的权限或者麦克风是否被占用  
Err_Mic_Capture_Failed| 23007| 麦克风录制失败| 可尝试取消发布并重新发布麦克风 Track  
Err_Speaker_Init_failed| 23008| 扬声器无权限或者被占用| 请确认应用是否获取音频播放的权限或者扬声器被占用  
  
# 发布 Track 相关错误码

枚举值| 错误码| 说明| 处理方式  
---|---|---|---  
Err_Invalid_Parameter| 10053| 非法参数| 请检查待发布 Track 是否为本地 Track，并且不为空  
Err_Invalid_State| 21002| 非法状态| 请检查是否已经加入房间  
Err_Fatal| 21005| 非预期错误| RTC 生命周期异常，需要释放资源并重新初始化  
  
# CDN 转推相关错误码

枚举值| 错误码| 说明| 处理方式  
---|---|---|---  
Err_No_Permission| 10051| 无操作权限| 请检查用户的 token 签算权限  
Err_Invalid_Parameter| 10053| 参数错误| 请检查操作的参数是否合法  
Err_Invalid_State| 21002| 状态异常| 请检查房间状态，加入房间后才可以创建转推任务  
Err_Network_Timeout| 21004| 操作超时| 请重新尝试操作  
Err_Fatal| 21005| 服务端错误| 请重新尝试操作或者联系七牛技术支持同学协助定位  
  
# 跨房媒体转发相关错误码

枚举值| 错误码| 说明| 处理方式  
---|---|---|---  
Err_Relay_Token_Invalid| 24000| Token 验证失败| 请确认 Token 签算是否正确  
Err_Relay_Already_Start| 24001| 已开启跨房| 请勿重复操作  
Err_Relay_Not_Start| 24002| 跨房没有开启| 请先开启跨房再进行操作  
Err_Relay_Destination_Room_Not_Existed| 24003| 目标房间不存在| 请确认跨房的目标房间是否存在  
Err_Relay_Player_In_Dest_Room| 24004| 用户不在目标房间内| 请确认用户是否在目标房间内  
Err_Relay_Start_Failed| 24004| 跨房开启失败| 请确认跨房参数是否正确  
Err_Invalid_Client_Mode| 24006| 使用场景不符| 请切换到互动直播场景  
Err_Invalid_Client_Role| 24007| 用户角色不符| 请根据当前场景切换到指定角色再进行操作  
  
以上内容是否对您有帮助？
human: 如何处理七牛云的实时音视频初始化

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > WXApp >初始化

#  初始化

最近更新时间: 2022-02-28 15:35:22

本部分介绍了实时音视频的初始化方式及其配置项。

在加入房间前，SDK 提供了一系列的方法用来进行初始化配置。在配置完成后通过 `QNRTC.createClient` 创建 **QNRTCClient**
对象 即可。

# 设置日志等级

通过调用
[QNRTC.setLogLevel](https://developer.qiniu.com/rtc/10958/WXAppQNRTC#setLogLevel)
设置 SDK 的日志等级。默认等级为 `VERBOSE`。

例如，下面代码会关闭 SDK 的日志输出：

    
    
    import QNRTC, { QNLogLevel } from "qnwxapp-rtc";
    
    QNRTC.setLogLevel(QNLogLevel.NONE);
    

# 创建房间客户端对象

当完成所需配置后，就可以通过
[QNRTC.createClient](https://developer.qiniu.com/rtc/10958/WXAppQNRTC#createClient)
来创建房间客户端对象
[QNRTCClient](https://developer.qiniu.com/rtc/10950/WXAppQNRTCClient)。后续的关于房间、发布订阅的逻辑均通过该对象来操作。

    
    
    import QNRTC from "qnwxapp-rtc";
    
    const mClient = QNRTC.createClient();
    

> 注意，同一个页面，该方法仅允许执行一次。即 **QNRTCClient** 对象应当只创建一个，当作单例对象使用。

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