jancd/qiniu-developer_ShareGPT huggingface dataset:
human: 如何处理七牛云的实时音视频CDN 直推

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > Android >CDN 直推

#  CDN 直推

最近更新时间: 2024-02-23 19:46:16

本文主要介绍单主播直推 CDN 的使用场景。

在单人直播时，SDK 将主播的音视频直接推流到 CDN 分发，观众端不需要加入 RTC 房间，只需要通过播放器进行拉流播放。

>   * QNCDNStreamingConfig 中的 videoTrack 和 audioTrack 参数，确保在整个推流开始和结束的过程中是有效的
>

使用方式如下：

# 创建 QNCDNStreamingClient

QNCDNStreamingClient 为 RTMP 推流的统一管理类，通过
[QNRTC.createCDNStreamingClient](https://developer.qiniu.com/rtc/api/8732/QNRTC#createCDNStreamingClient)
接口来创建
[QNCDNStreamingClient](https://developer.qiniu.com/rtc/api/12649/QNCDNStreamingClient)
对象

    
    
    QNCDNStreamingClient streamingClient = QNRTC.createCDNStreamingClient();
    

# 设置状态回调和统计信息回调

在进行 CDN 直推之前，需要设置 CDN 直推流的状态监听：

    
    
    streamingClient.setCDNStreamingListener(new QNCDNStreamingListener() {
        @Override
        public void onCDNStreamingConnectionStateChanged(QNConnectionState state, int errorCode, String message) {
            // 直播流状态改变时触发此回调
        }
    
        @Override
        public void onCDNStreamingStats(QNCDNStreamingStats stats) {
            // 定期回调直播流统计信息
        }
    });
    

# 开始推流

开始推流之前，需要配置推流参数
[QNCDNStreamingConfig](https://developer.qiniu.com/rtc/api/12650/QNCDNStreamingConfig)。
通过调用
[QNCDNStreamingClient.start](https://developer.qiniu.com/rtc/api/12649/QNCDNStreamingClient#start)
开始推流。使用代码参考如下：

    
    
    // 配置推流参数
    QNCDNStreamingConfig config = new QNCDNStreamingConfig()
            .setVideoTrack(cameraVideoTrack)
            .setAudioTrack(microphoneAudioTrack)
            .setPublishUrl("rtmp://xxx/hub/publishUrl");
    // 开始推流
    streamingClient.start(config);
    

# 停止推流

调用
[QNCDNStreamingClient.stop](https://developer.qiniu.com/rtc/api/12649/QNCDNStreamingClient#stop)
停止推流。使用代码参考如下：

    
    
    // 停止推流
    streamingClient.stop();
    

# 示例代码

RTMP 直推 CDN 的示例代码可参考 [QNRTC-API-Examples](https://github.com/pili-
engineering/QNRTC-Android/tree/master/QNRTC-API-Examples)

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

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > Android >音频场景实践

#  音频场景实践

最近更新时间: 2022-11-24 18:42:11

本文主要介绍实时音视频通话过程中的一些特殊音频场景的使用方式。

# 音乐交互类场景

若您的业务场景中包含乐器弹奏、唱歌、外部设备音乐的播放（如伴奏）等音乐交互场景，为了避免系统的降噪对乐器弹奏、伴奏等音乐产生影响，建议在用户演奏时通过
[QNRTC.setAudioScene](https://developer.qiniu.com/rtc/api/8732/QNRTC#setAudioScene)
接口将音频场景设置为
[QNAudioScene.SOUND_EQUALIZE](https://developer.qiniu.com/rtc/api/12165/QNAudioScene#SOUND_EQUALIZE)，该场景对环境音和音乐声的还原性更优，可以为用户提供更好的演奏体验。

# 背景音乐（音效）场景

若您的业务场景有添加背景音乐的需求，可以通过 SDK 提供的混音管理类实现：

  * [QNAudioMusicMixer](https://developer.qiniu.com/rtc/api/11921/QNAudioMusicMixer): 音乐混音，多用于对时长较长的背景音乐的混音，同时仅支持对一路音频进行混音
  * [QNAudioEffectMixer](https://developer.qiniu.com/rtc/api/11923/QNAudioEffectMixer): 音效混音，多用于对时长较短的音乐的混音，如掌声、欢呼声、喝彩声等氛围音以及礼物音效等。支持同时对多路音效文件进行混音
  * [QNAudioSourceMixer](https://developer.qiniu.com/rtc/api/12212/QNAudioSourceMixer): 音源混音，多用于对音频原始数据 (pcm) 的混音，支持同时对多路音源数据进行混音

## 本地播放

从 v5.2.0 版本开始，SDK 支持关闭混音音乐、音效的推送功能，关闭推送后，混音音乐、音效将只做本地播放。

若您的业务**仅需本地播放音乐、音效，无需将音乐声音推送到远端**
，那么为了避免系统的降噪对通话质量产生影响，我们建议您**通过上述混音接口替代其他音频播放器来实现本地音乐的播放** 。

关闭远端推送的接口示例如下：

    
    
    // 停止背景音乐混音的推送
    QNAudioMusicMixer.setPublishEnabled(false);
    // 停止音效混音的推送
    QNAudioEffectMixer.setPublishEnabled("effectID", false);
    // 停止音源混音的推送
    QNAudioSourceMixer.setPublishEnabled("sourceID", false);
    

# 游戏场景

游戏直播等场景通常需要实现游戏声音的录制、推送功能。为了实现对游戏音频的录制，需要满足如下前提条件：

  * 游戏应用允许其声音被第三方应用捕获
  * 您的应用具有相应权限，并实现了“捕获播放的音频”功能

对于上述条件的实现方式，可以参考 [Android
官方文档](https://developer.android.google.cn/guide/topics/media/playback-
capture)。

在具备了上述前提条件后，即可通过如下方式完成游戏声音的录制和推送：

  * 捕获游戏声音
  * 将游戏声音作为一路音源推送至 SDK，并通过 SDK 推送至远端。音源混音可参考 [QNAudioSourceMixer](https://developer.qiniu.com/rtc/api/12212/QNAudioSourceMixer)

# 参考文档

  * [QNAudioScene](https://developer.qiniu.com/rtc/api/12165/QNAudioScene)
  * [QNAudioMusicMixer](https://developer.qiniu.com/rtc/api/11921/QNAudioMusicMixer)
  * [QNAudioEffectMixer](https://developer.qiniu.com/rtc/api/11923/QNAudioEffectMixer)
  * [QNAudioSourceMixer](https://developer.qiniu.com/rtc/api/12212/QNAudioSourceMixer)
  * [“捕获播放的音频”官方文档](https://developer.android.google.cn/guide/topics/media/playback-capture)

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

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

#  视频大小流

最近更新时间: 2023-08-17 15:51:54

本文主要介绍视频大小流的使用方式。

# 功能介绍

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

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

# 开启大小流

在创建音视频 [Track](https://developer.qiniu.com/rtc/quick_start/9909/the-rtc-basic-
concept#track) 时，可以通过 Track config 提供的 `setMultiProfileEnabled` 接口来启用大小流功能，以
QNCameraVideoTrack 为例，其启用方式如下：

    
    
    QNCameraVideoTrackConfig cameraVideoTrackConfig = new QNCameraVideoTrackConfig(TAG_CAMERA)
            .setMultiProfileEnabled(true); // 配置启用大小流
    mCameraVideoTrack = QNRTC.createCameraVideoTrack(cameraVideoTrackConfig);
    

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

# 订阅大小流

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

示例代码如下：

    
    
    if (remoteVideoTrack.isMultiProfileEnabled()) {
        remoteVideoTrack.setProfile(QNTrackProfile.MEDIUM);
    }
    

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

当订阅指定 profile 生效后，将通过回调
[QNTrackInfoChangedListener.onVideoProfileChanged](https://developer.qiniu.com/rtc/api/8820/QNTrackInfoChangedListener#onVideoProfileChanged)
告知，具体使用方式如下：

    
    
    remoteVideoTrack.setTrackInfoChangedListener(new QNTrackInfoChangedListener() {
        @Override
        public void onVideoProfileChanged(QNTrackProfile profile) {
            // 当订阅的 profile 发生改变时触发，该 profile 为当前实际订阅到的 profile
        }
    });
    

# 注意事项

  * **开启大小流功能设置编码宽高最低为 1280 x 720**
  * **目前仅支持在发送端发布单路视频 Track 的场景下，使用大小流功能**
  * **大小流场景下，需确保在创建视频 Track 时通过[QNVideoEncoderConfig](https://developer.qiniu.com/rtc/api/8701/QNVideoEncoderConfig#QNVideoEncoderConfig%5B2/4%5D) 将视频降级模式 [QNDegradationPreference](https://developer.qiniu.com/rtc/8772/video-size-flow-android/12393/QNDegradationPreference) 设置为 `QNDegradationPreference.MAINTAIN_RESOLUTION` 或者 `QNDegradationPreference.ADAPT_BITRATE_ONLY`，保证推流分辨率不会改变**
  * **对于开启大小流的用户，建议保证有良好的网络环境，保证多流发送质量**

# 示例代码

大小流场景的示例代码可参考 [QNRTC-API-Examples](https://github.com/pili-engineering/QNRTC-
Android/blob/master/QNRTC-API-
Examples/app/src/main/java/com/qiniu/droid/rtc/api/examples/activity/MultiProfileActivity.java)。

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

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > Android >通话音量监听

#  通话音量监听

最近更新时间: 2023-10-25 15:05:54

本文主要介绍如何通过 SDK 获取本地和远端用户在通话过程中的音量，进而判断用户是否在讲话。

> 实现方式是通过周期性调用 SDK 接口获取本地及远端音频 Track 的音量值，再通过音量值来判断用户是否在讲话

# 监听本地音量

SDK 提供了
[QNLocalAudioTrack.getVolumeLevel](https://developer.qiniu.com/rtc/api/8660/QNLocalAudioTrack#getVolumeLevel)
接口用于获取本地音频 Track 的音量。

以麦克风 Track 为例，可以通过如下方式实现对本地采集音量的感知：

    
    
    mAudioVolumeTimer = new Timer();
    mAudioVolumeTimer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            float localVolume = mMicrophoneAudioTrack.getVolumeLevel();
            if (localVolume >= 0.1f) {
                // 本地用户正在讲话
            }
        }
    }, 0, GET_VOLUME_LEVEL_INTERVAL);
    

其中，`GET_VOLUME_LEVEL_INTERVAL` 为获取音量值的时间间隔，可根据您的场景自行定义其大小。

> 若用户通过
> [QNLocalAudioTrack.setMuted](https://developer.qiniu.com/rtc/api/8660/QNLocalAudioTrack#setMuted)
> 将自己静音，由于该操作仅会静默推送出去的音频帧，并未停止音频采集，因此，仍可通过 `getVolumeLevel` 接口获取到有效的采集音量值。

# 监听远端音量

SDK 提供了
[QNRemoteAudioTrack.getVolumeLevel](https://developer.qiniu.com/rtc/api/8674/QNRemoteAudioTrack#getVolumeLevel)
接口用于获取远端音频 Track 的音量。

可以通过如下方式实现对远端音频 Track 音量的感知：

    
    
    mAudioVolumeTimer = new Timer();
    mAudioVolumeTimer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            float remoteVolume = mRemoteAudioTrack.getVolumeLevel();
            if (remoteVolume >= 0.1f) {
                // 远端用户正在讲话
            }
        }
    }, 0, GET_VOLUME_LEVEL_INTERVAL);
    

其中，`GET_VOLUME_LEVEL_INTERVAL` 为获取音量值的时间间隔，可根据您的场景自行定义其大小

# 语音激励

从 v5.2.6 版本开始，SDK 可通过
[QNRTCClient.enableAudioVolumeIndication](https://developer.qiniu.com/rtc/api/8684/QNRTCClient#enableAudioVolumeIndication)
接口开启语音激励功能。开启后，房间内用户的语音音量将会以从大到小的顺序，根据配置的时间间隔进行周期性的回调。使用示例如下：

    
    
    mClient = QNRTC.createClient(new QNClientEventListener() {
        @Override
        public void onUserVolumeIndication(List<QNAudioVolumeInfo> userVolumeList) {
          // 语音激励的回调通知，音量将以从大到小的顺序进行回调
        }
    });
    mClient.enableAudioVolumeIndication(3000);  // 配置语音激励回调间隔为 3000ms
    

其中，`enableAudioVolumeIndication` 的参数为指定的回调周期， ≤0 表示禁用该功能，>0 表示指定间隔，单位为
ms，默认关闭，最小取值为 100

**注意** ：若是本地用户，则返回的音量列表中，QNVolumeInfo 中的 userID 字段将会为 ""

# 注意事项

  1. 在安静的环境下，**获取到 0.3x 大小的数值可能为环境音的音量，是预期的现象** ，可根据需求自行决定判断用户是否讲话的音量阈值
  2. 本地音量获取的数值会受到 [QNLocalAudioTrack.setVolume](https://developer.qiniu.com/rtc/api/8660/QNLocalAudioTrack#setVolume) 接口的影响，在确定讲话阈值的时候需要搭配使用
  3. 获取音量接口为主动接口，需要您启动一个定时器，进行周期性的音量获取

# 示例代码

上述已经简单介绍了通话音量的监听方式，相对应的示例代码可参考 [QNRTC-API-Examples](https://github.com/pili-
engineering/QNRTC-Android/blob/master/QNRTC-API-
Examples/app/src/main/java/com/qiniu/droid/rtc/api/examples/activity/MicrophoneOnlyActivity.java)。

以上内容是否对您有帮助？
human: 如何处理七牛云的实时音视频音视频本地录制

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > Android >音视频本地录制

#  音视频本地录制

最近更新时间: 2024-06-28 17:54:33

本文主要介绍连麦过程中音视频本地录制的使用场景。

>   * v6.2.0 版本开始支持使用
> [QNMediaRecorder](https://developer.qiniu.com/rtc/api/12726/QNMediaRecorder-
> Android) 进行音视频本地录制的操作
>   * 支持录制格式：wav、aac、mp4
>   * 音频 Track 添加混音时，混音数据不支持参与录制保存
>   * 录制 mp4
> 的情况下，需确保开启了[保持分辨率](https://developer.qiniu.com/rtc/api/12393/QNDegradationPreference#MAINTAIN_RESOLUTION)的配置
>

使用方式如下：

# 创建 QNMediaRecorder

SDK 当前支持基于
[QNLocalAudioTrack](https://developer.qiniu.com/rtc/api/8660/QNLocalAudioTrack)
和
[QNLocalVideoTrack](https://developer.qiniu.com/rtc/api/8663/QNLocalVideoTrack)
的录制功能，可以通过
[QNRTC.createMediaRecorder](https://developer.qiniu.com/rtc/api/8732/QNRTC#createMediaRecorder)
来创建
[QNMediaRecorder](https://developer.qiniu.com/rtc/api/12726/QNMediaRecorder-
Android) 对象

    
    
    QNMediaRecorder mediaRecorder = QNRTC.createMediaRecorder();
    mediaRecorder.setMediaRecorderListener(new QNMediaRecorderListener());
    

其中，[QNMediaRecorderListener](https://developer.qiniu.com/rtc/api/12725/QNMediaRecorderListener)
为音视频本地录制回调监听，回调方法定义如下：

    
    
    /**
     * 媒体录制信息更新回调
     *
     * @param info 媒体录制信息
     */
    void onRecordInfoUpdated(QNMediaRecordInfo info);
    
    /**
     * 媒体录制状态改变回调
     *
     * @param state 录制状态
     * @param code 状态码
     */
    void onRecordStateChanged(QNMediaRecorderState state, int code);
    

音视频本地录制的错误码可参考[录制相关错误码](https://developer.qiniu.com/rtc/development_guidelines/9904/rtc-
error-code-android#8)

# 开始录制

需要设置录制相关配置参考如下：

  * **文件路径** ：请确保路径完整精确到文件名和类型，存在有效且有读写权限，支持 wav、aac、mp4
  * **音频源** ：可以设置麦克风或自定义音频，仅支持一路音频轨的设置，重复设置会被覆盖。
  * **视频源** ：可以设置摄像头或自定义视频，仅支持一路视频轨的设置，重复设置会被覆盖。

参考代码如下：

    
    
    QNLocalAudioTrack audioTrack = QNRTC.createMicrophoneAudioTrack();
    QNLocalVideoTrack videoTrack = QNRTC.createCameraVideoTrack();
    
    QNMediaRecorderConfig mediaConfig = new QNMediaRecorderConfig(filePath, audioTrack, videoTrack);
    
    int result = mediaRecorder.startRecording(mediaConfig);
    if (result != 0) {
        //开始录制发生错误
    }
    

# 停止录制

参考代码如下：

    
    
    int result = mediaRecorder.stopRecording();
    if (result != 0) {
        //结束录制发生错误
    }
    

# 注意事项

  1. 录制实现相关配置时，应当务必保证保存地址、Track 有效可用
  2. 建议实现 [QNMediaRecorderListener](https://developer.qiniu.com/rtc/api/12725/QNMediaRecorderListener) 回调，对应实际状态做相应处理
  3. 开始录制或停止录制时，根据返回值的结果做相应的业务处理，可避免后续非预期行为
  4. 对自定义音视频进行录制时，应当确保音视频同步传入，否则可能存在音频录制后播放非预期的情况

# 示例代码

音视频本地录制场景的示例代码可参考 [QNRTC-API-Examples](https://github.com/pili-
engineering/QNRTC-Android/blob/master/QNRTC-API-
Examples/app/src/main/java/com/qiniu/droid/rtc/api/examples/activity/MediaRecorderActivity.java)。

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

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

#  初始化

最近更新时间: 2022-10-27 14:56:14

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

> 在使用 SDK 前，请务必调用
> [QNRTC.initRTC](https://developer.qiniu.com/rtc/api/8834/QNRTC-iOS#initRTC)
> 方法进行 RTC 环境的初始化工作

# 默认配置初始化

直接使用
[QNRTCConfiguration.defaultConfiguration](https://developer.qiniu.com/rtc/api/8838/QNRTCConfiguration-
iOS#defaultConfiguration) 默认配置进行初始化，示例代码如下：

    
    
    QNRTCConfiguration *configuration = [QNRTCConfiguration defaultConfiguration];
    

若 QNRTCConfiguration 的默认配置无法满足您的场景需要，您可通过
[QNRTCConfiguration](https://developer.qiniu.com/rtc/api/8838/QNRTCConfiguration-
iOS) 下的几个 init 方法进行自定义配置初始化。

# 设置媒体传输方式

通过调用初始化方法
[QNRTCConfiguration.initWithPolicy[1/3]](https://developer.qiniu.com/rtc/api/8838/QNRTCConfiguration-
iOS#initWithPolicy%5B1/3%5D) 设置媒体传输方式，默认使用 UDP 传输。

    
    
    QNRTCConfiguration *configuration = [[QNRTCConfiguration alloc] initWithPolicy:QNRTCPolicyForceUDP];
    

其中，媒体传输方式 [QNRTCPolicy](https://developer.qiniu.com/rtc/9257/user-guidance-
iOS/rtc/9254) 有如下几种，可根据实际情况自行选择：

    
    
    typedef NS_ENUM(NSUInteger, QNRTCPolicy) {
        QNRTCPolicyForceUDP = 0,  // 使用 UDP
        QNRTCPolicyForceTCP,      // 使用 TCP
        QNRTCPolicyPreferUDP,     // 优先 UDP，不通的话自动改为 TCP
    };
    

# 推流固定分辨率开关

通过调用初始化方法
[QNRTCConfiguration.initWithPolicy[2/3]](https://developer.qiniu.com/rtc/api/8838/QNRTCConfiguration-
iOS#initWithPolicy%5B2/3%5D) 设置是否在推流时使用固定分辨率，即编码分辨率不随网络变化而波动，默认为 NO 不开启。

    
    
    QNRTCConfiguration *configuration = [[QNRTCConfiguration alloc] initWithPolicy:QNRTCPolicyForceUDP maintainResolutionEnabled:NO];
    

# 通话模式开关

通过调用初始化方法
[QNRTCConfiguration.initWithPolicy[3/3]](https://developer.qiniu.com/rtc/api/8838/QNRTCConfiguration-
iOS#initWithPolicy%5B3/3%5D) 设置是否使用通话模式，默认为 YES 开启。

    
    
    QNRTCConfiguration *configuration = [[QNRTCConfiguration alloc] initWithPolicy:QNRTCPolicyForceUDP maintainResolutionEnabled:NO communicationModeOn:YES];
    

> 使用声卡并配戴耳机的情况下，建议关闭，可解决声卡模式不匹配带来的音频异常无效等问题

**注意：关闭通话模式将直接关闭硬件回声消除，不佩戴耳机的情况下连麦，可能出现回声。**

# 初始化 QNRTC

在配置好
[QNRTCConfiguration](https://developer.qiniu.com/rtc/api/8838/QNRTCConfiguration-
iOS) 后，通过 [QNRTC.initRTC](https://developer.qiniu.com/rtc/api/8834/QNRTC-
iOS#initRTC) 传入。

    
    
    [QNRTC initRTC:configuration];
    

# 销毁 QNRTC

通过 [QNRTC.deinit](https://developer.qiniu.com/rtc/api/8834/QNRTC-iOS#deinit)
销毁。在 QNRTC 使用结束后，请务必主动在 dealloc 前调用此接口来释放相应资源

    
    
    [QNRTC deinit];
    

# 设置日志等级

通过调用 [QNRTC.setLogLevel](https://developer.qiniu.com/rtc/api/8834/QNRTC-
iOS#setLogLevel) 设置 SDK 的日志等级，默认是

    
    
    [QNRTC setLogLevel:QNRTCLogLevelInfo];
    

设置成功后，可以通过
[QNRTC.enableFileLogging](https://developer.qiniu.com/rtc/api/8834/QNRTC-
iOS#enableFileLogging) 接口开启日志文件保存。

# 设置是否将扬声器作为默认音频输出设备

通过调用
[QNRTC.setAudioRouteToSpeakerphone](https://developer.qiniu.com/rtc/api/8834/QNRTC-
iOS#setAudioRouteToSpeakerphone) 设置是否将扬声器作为默认音频输出设备，默认音频路由为扬声器。

    
    
    [QNRTC setAudioRouteToSpeakerphone:YES];
    

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

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > iOS >CDN 直推

#  CDN 直推

最近更新时间: 2024-01-18 17:23:53

本文主要介绍单主播直推 CDN 的使用场景。

在单人直播时，SDK 将主播的音视频直接推流到 CDN 分发，观众端不需要加入 RTC 房间，只需要通过播放器进行拉流播放。

>   * QNCDNStreamingConfig 中的 videoTrack 和 audioTrack 参数，确保在整个推流开始和结束的过程中是有效的
>

使用方式如下：

# 创建 QNCDNStreamingClient

QNCDNStreamingClient 为 RTMP 推流的统一管理类，通过
[QNRTC.createCDNStreamingClient](https://developer.qiniu.com/rtc/api/8834/QNRTC-
iOS#createCDNStreamingClient) 接口来创建
[QNCDNStreamingClient](https://developer.qiniu.com/rtc/api/12634/QNCDNStreamingClient-
iOS) 对象

    
    
    QNCDNStreamingClient *streamingClient = [QNRTC createCDNStreamingClient];
    

# 设置状态回调和统计信息代理

将代理实现类设置给 streamingClient 的 delegate

    
    
    streamingClient.delegate = self;
    

其中 delegate
[QNCDNStreamingDelegate](https://developer.qiniu.com/rtc/12641/CDN%20%E7%9B%B4%E6%8E%A8/rtc/api/12635/QNCDNStreamingDelegate)
代理回调方法定义如下：

    
    
    /*!
     * @abstract 推流状态回调
     *
     * @param client 推流实例
     * @param state 推流状态
     * @param code 错误码，请参考 QNErrorCode
     * @param message 描述信息
     *
     * @since v6.0.0
     */
    - (void)cdnStreamingClient:(QNCDNStreamingClient *)client didCDNStreamingConnectionStateChanged:(QNConnectionState)state
                     errorCode:(int)code
                       message:(NSString *)message;
    
    /*!
     * @abstract 推流统计信息回调
     *
     * @param stats 统计信息
     * @see QNCDNStreamingStats.
     *
     * @since v6.0.0
     */
    - (void)cdnStreamingClient:(QNCDNStreamingClient *)client didCDNStreamingStats:(QNCDNStreamingStats *)stats;
    
    

# 开始推流

开始推流之前，需要配置推流参数
[QNCDNStreamingConfig](https://developer.qiniu.com/rtc/api/12636/QNCDNStreamingConfig-
iOS)。 通过调用 [QNCDNStreamingClient.startWithConfig] 开始推流。使用代码参考如下：

    
    
    // 配置推流参数
    QNCDNStreamingConfig *streamingConfig = [[QNCDNStreamingConfig alloc] init];
    streamingConfig.audioTrack = microphoneAudioTrack;
    streamingConfig.videoTrack = cameraVideoTrack;
    streamingConfig.publishUrl = @"rtmp://host/app/stream";
    // 开始推流
    [streamingClient startWithConfig:streamingConfig];
    

# 停止推流

调用 [QNCDNStreamingClient.stop] 停止推流。使用代码参考如下：

    
    
    // 停止推流
    [streamingClient stop];
    

# 示例代码

RTMP 直推 CDN 的示例代码可参考 [API-Examples-iOS](https://github.com/pili-
engineering/QNRTC-iOS/blob/master/QNRTC-API-Examples/Api-Examples-
iOS/Module/CDN%20Streaming/CDNStreamingLive/CDNStreamingLiveExample.m)

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

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

#  视频大小流

最近更新时间: 2022-09-08 11:57:13

本部分介绍视频[大小流](https://developer.qiniu.com/rtc/quick_start/9909/the-rtc-basic-
concept#multi_stream)的使用方式。

# 功能介绍

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

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

# 开启大小流

在创建音视频 [Track](https://developer.qiniu.com/rtc/quick_start/9909/the-rtc-basic-
concept#track) 时，可以通过
[QNCameraVideoTrackConfig.multiStreamEnable](https://developer.qiniu.com/rtc/api/8844/QNCameraVideoTrackConfig-
iOS#multiStreamEnable) 接口来启用大小流功能，以
[QNCameraVideoTrack](https://developer.qiniu.com/rtc/api/8852/QNCameraVideoTrack-
iOS) 为例，其启用方式如下：

    
    
    QNCameraVideoTrackConfig *cameraVideoTrackConfig = [QNCameraVideoTrackConfig defaultCameraVideoTrackConfig]; 
    // 配置启用大小流
    cameraVideoTrackConfig.multiStreamEnable = YES;
    QNCameraVideoTrack *cameraVideoTrack = [QNRTC createCameraVideoTrackWithConfig:cameraVideoTrackConfig];
    

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

# 订阅大小流

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

示例代码如下：

    
    
    if (remoteVideoTrack.isMultiProfileEnabled) {
    	[remoteVideoTrack setProfile:QNTrackProfileMedium];
    }
    

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

当订阅指定 profile 生效后，将通过回调
[QNRemoteVideoTrackDelegate.didVideoProfileChanged](https://developer.qiniu.com/rtc/api/11947/QNRemoteVideoTrackDelegate#didVideoProfileChanged)
告知，具体使用方式如下：

    
    
    - (void)remoteVideoTrack:(QNRemoteVideoTrack *)remoteVideoTrack didVideoProfileChanged:(QNTrackProfile)profile {
    	// 当订阅的 profile 发生改变时触发，该 profile 为当前实际订阅到的 profile
    }
    

# 注意事项

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

# 示例代码

大小流场景的示例代码可参考 [API-Examples-iOS](https://github.com/pili-engineering/QNRTC-
iOS/blob/master/QNRTC-API-Examples/Api-Examples-
iOS/Module/Other/MultiProfile/MultiProfileExample.m)

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

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > iOS >通话音量监听

#  通话音量监听

最近更新时间: 2022-09-08 11:45:06

本文主要介绍如何通过 SDK 获取本地和远端用户在通话过程中的音量，进而判断用户是否在讲话。

> 实现方式是通过周期性调用 SDK 接口获取本地及远端音频 Track 的音量值，再通过音量值来判断用户是否在讲话

# 监听本地音量

SDK 提供了
[QNLocalAudioTrack.getVolumeLevel](https://developer.qiniu.com/rtc/api/8854/QNLocalAudioTrack-
iOS#getVolumeLevel) 接口用于获取本地音频 Track 的音量。

以麦克风 Track 为例，可以通过如下方式实现对本地采集音量的感知：

    
    
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:kGetVolumeLevelInterval target:self selector:@selector(updateAudioTrackVolume) userInfo:nil repeats:YES];
    
    - (void)updateAudioTrackVolume {
        float localVolumeLevel = [self.microphoneAudioTrack getVolumeLevel];
        if (localVolume >= 0.1f) {
            // 本地用户正在讲话
        }
    }
    

其中，`kGetVolumeLevelInterval` 为获取音量值的时间间隔，可根据您的场景自行定义其大小

# 监听远端音量

SDK 提供了
[QNRemoteAudioTrack.getVolumeLevel](https://developer.qiniu.com/rtc/api/8859/QNRemoteAudioTrack-
iOS#getVolumeLevel) 接口用于获取远端音频 Track 的音量。

可以通过如下方式实现对远端音频 Track 音量的感知：

    
    
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:kGetVolumeLevelInterval target:self selector:@selector(updateAudioTrackVolume) userInfo:nil repeats:YES];
    
    - (void)updateAudioTrackVolume {
        float remoteVolumeLevel = [self.remoteAudioTrack getVolumeLevel];
        if (remoteVolume >= 0.1f) {
            // 远端用户正在讲话
        }
    }
    

其中，`kGetVolumeLevelInterval` 为获取音量值的时间间隔，可根据您的场景自行定义其大小

# 注意事项

  1. 在安静的环境下，**获取到 0.0x 大小的数值可能为环境音的音量，是预期的现象** ，可根据需求自行决定判断用户是否讲话的音量阈值
  2. 本地音量获取的数值会受到 [QNLocalAudioTrack.setVolume](https://developer.qiniu.com/rtc/api/8854/QNLocalAudioTrack-iOS#setVolume) 接口的影响，在确定讲话阈值的时候需要搭配使用
  3. 获取音量接口为主动接口，需要您启动一个定时器，进行周期性的音量获取

# 示例代码

上述已经简单介绍了通话音量的监听方式，相对应的示例代码可参考 [API-Examples-iOS](https://github.com/pili-
engineering/QNRTC-iOS/blob/master/QNRTC-API-Examples/Api-Examples-
iOS/Module/Audio/MicrophoneAudio/MicrophoneAudioExample.m)。

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

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

#  初始化

最近更新时间: 2022-07-14 15:44:53

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

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

# 设置日志等级

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

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

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

# 设置媒体传输方式

通过调用
[QNRTC.setTransportPolicy](https://developer.qiniu.com/rtc/9070/WebQNRTC#setTransportPolicy)
设置媒体传输方式。默认使用 `PREFER_UDP`。

例如，下面代码强制媒体数据使用 TCP 传输：

    
    
    import QNRTC, { QNTransportPolicy } from "qnweb-rtc";
    
    QNRTC.setTransportPolicy(QNTransportPolicy.FORCE_TCP)
    

> 注意，该选项应当在加入房间之前配置，否则不会生效。

# 创建房间客户端对象

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

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

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

# 示例代码

完成示例代码可参考 [API-Examples-Web](https://github.com/pili-engineering/QNRTC-
Web/tree/master/API-Examples-Web)

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