音视频和纯音频通话中,获取通话音量可以实现多种有用的功能,例如:

当你希望调整通话音量时,除了通过操作系统进行设置外,也可以通过调用 SDK 接口,分别设置采集、播放或混音音量。

混音音量调节详见使用混音功能。

alt

前提条件
获取用户音量
实现方法

你可以通过调用 enableAudioPropertiesReport 方法,设置音量回调周期,单位为毫秒,然后在 onLocalAudioPropertiesReport 和 onRemoteAudioPropertiesReport 回调中分别获取用户及对应的音量信息。
音量值对应的音量档位详见 API 文档。

示例代码

     /**
  * 启用音频信息提示
  */
- (void)enableAudioPropertiesReport {
    ByteRTCAudioPropertiesConfig *audioPropertiesConfig = [[ByteRTCAudioPropertiesConfig alloc] init];
    audioPropertiesConfig.interval = 300;
    [self.rtcVideo enableAudioPropertiesReport:audioPropertiesConfig];
}
/**
  * 回调获取本地麦克风和屏幕音频流采集的音频信息
  * @param engine ByteRTCVideo 对象
  *  @param audioPropertiesInfos  本地音频信息,详见 LocalAudioPropertiesInfo
  */
- (void)rtcEngine:(ByteRTCVideo *)engine onLocalAudioPropertiesReport:(NSArray<ByteRTCLocalAudioPropertiesInfo *> *)audioPropertiesInfos {
    // 本地用户音量回调
}

/**
  * 回调获取订阅的远端用户的音频信息
  * @param engine ByteRTCVideo 对象
  *  @param audioPropertiesInfos  远端音频信息,其中包含音频流属性、房间 ID、用户 ID ,详见 ByteRTCRemoteAudioPropertiesInfo
  * @param totalRemoteVolume 订阅的所有远端流的总音量,范围是 [0,255]
  */
- (void)rtcEngine:(ByteRTCVideo *)engine onRemoteAudioPropertiesReport:(NSArray<ByteRTCRemoteAudioPropertiesInfo *> *)audioPropertiesInfos totalRemoteVolume:(NSInteger)totalRemoteVolume {
    // 远端用户音量回调
}
/**
  * 回调获取房间内的最活跃用户信息
  * @param engine ByteRTCVideo 对象
  *  @param  roomId  房间 ID
  *  @param  uid 最活跃用户(ActiveSpeaker)的用户 ID
  */
- (void)rtcEngine:(ByteRTCVideo *)engine onActiveSpeaker:(NSString *)roomId uid:(NSString *)uid {
    // 房间内的最活跃用户信息
}
objectivec

/**
  * 启用音频信息提示
  */
public void enableAudioPropertiesReport() {
    AudioPropertiesConfig config = new AudioPropertiesConfig(300);
    mRTCVideo.enableAudioPropertiesReport(config);
}

private final IRTCVideoEventHandler mRTCVideoEventHandle = new IRTCVideoEventHandler() {
    /**
      * 回调获取本地麦克风和屏幕音频流采集的音频信息
      * @param audioPropertiesInfos 本地音频信息,详见 LocalAudioPropertiesInfo
      */
    @Override
    public void onLocalAudioPropertiesReport(LocalAudioPropertiesInfo[] audioPropertiesInfos) {
        // 本地用户音量回调
    }

    /**
     * 回调获取订阅的远端用户的音频信息
     * @param audioPropertiesInfos 远端音频信息,其中包含音频流属性、房间 ID、用户 ID ,详见 RemoteAudioPropertiesInfo
     * @param totalRemoteVolume 订阅的所有远端流的总音量
     */
    @Override
    public void onRemoteAudioPropertiesReport(RemoteAudioPropertiesInfo[] audioPropertiesInfos, int totalRemoteVolume) {
        // 远端用户音量回调
    }

    /**
     * 回调获取房间内的最活跃用户信息
     * @param roomId  房间 ID
     * @param uid 最活跃用户(ActiveSpeaker)的用户 ID
     */
    @Override
    public void onActiveSpeaker(String roomId, String uid) {
        // 房间内的最活跃用户信息
    }
    
    ...
java
 
    /**
  * 启用音频信息提示
  */
void RtcEngineWrap::enableAudioPropertiesReport() {
    bytertc::AudioPropertiesConfig config;
    config.interval = 300;
    video_engine_->enableAudioPropertiesReport(config);
}

/**
  * 回调获取本地麦克风和屏幕音频流采集的音频信息
  * @param audio_properties_infos 本地音频信息,详见 [LocalAudioPropertiesInfo](70098.html#localaudiopropertiesinfo) 
  * @param audio_properties_info_number 数组长度
  */
void RtcEngineWrap::onLocalAudioPropertiesReport(
    const LocalAudioPropertiesInfo * audio_properties_infos,
    int audio_properties_info_number) {
    // 本地用户音量回调
}

/**
 * 回调获取订阅的远端用户的音频信息
 * @param audio_properties_infos 远端音频信息,其中包含音频流属性、房间 ID、用户 ID ,详见 RemoteAudioPropertiesInfo
 * @param audio_properties_info_number 数组长度
 * @param total_remote_volume  所有订阅的远端流的总音量,范围是 [0,255]
 */
void RtcEngineWrap::onRemoteAudioPropertiesReport(
        const bytertc::RemoteAudioPropertiesInfo* audio_properties_infos,
        int audio_properties_info_number, int total_remote_volume) {
    // 远端用户音量回调
}
/**
  * 回调获取房间内的最活跃用户信息
  * @param room_id    房间 ID
  * @param  uid 最活跃用户(ActiveSpeaker)的用户 ID
  */
void RtcEngineWrap::onActiveSpeaker(
    const char* room_id,
    const char* uid) {
    // 房间内的最活跃用户信息
}
cpp
API参考
AndroidiOSMacWindowsLinuxWeb
启用音量提示enableAudioPropertiesReportenableAudioPropertiesReport:enableAudioPropertiesReport:enableAudioPropertiesReportenableAudioPropertiesReportenableAudioPropertiesReport()
本地音量回调onLocalAudioPropertiesReportrtcEngine:onLocalAudioPropertiesReport:rtcEngine:onLocalAudioPropertiesReport:onLocalAudioPropertiesReportonLocalAudioPropertiesReportonLocalAudioPropertiesReport()
远端用户音量回调onRemoteAudioPropertiesReportrtcEngine:onRemoteAudioPropertiesReport:totalRemoteVolume:rtcEngine:onRemoteAudioPropertiesReport:totalRemoteVolume:onRemoteAudioPropertiesReportonRemoteAudioPropertiesReportonRemoteAudioPropertiesReport()
活跃用户回调onActiveSpeakerrtcEngine:onActiveSpeaker:uid:rtcEngine:onActiveSpeaker:uid:onActiveSpeakeronActiveSpeakeronActiveSpeaker()
调整采集音量

采集是指音频输入设备,例如麦克风,采集到声音数据并存储到本地的过程。

alt

实现方法

你可以通过调用 setCaptureVolume 方法,实现音量参数调整。
该方法中 volume 参数表示录音信号的音量,取值范围为 [0,400]:

示例代码

[self.rtcVideo setCaptureVolume:ByteRTCStreamIndexMain volume:120];
objectivec

mRTCVideo.setCaptureVolume(StreamIndex.STREAM_INDEX_MAIN, 120);
java

video_engine_->setCaptureVolume(StreamIndex::kStreamIndexMain, 120);
cpp
API参考
AndroidiOSMacWindowsLinux
采集音量setCaptureVolumesetCaptureVolume:volume:setCaptureVolume:volume:setCaptureVolumesetCaptureVolume
调整音量播放

播放指客户端接收到远端音视频文件,并通过本地播放设备播放的过程。

alt

实现方法
示例代码

int volume = 120;
NSString *uid = @"";
NSString *roomId = @"";
[self.rtcVideo setPlaybackVolume:volume];
[self.rtcVideo setRemoteAudioPlaybackVolume:roomId remoteUid:uid playVolume:volume];
objectivec

int volume = 120;
String uid = "";
String roomId = "";
mRTCVideo.setPlaybackVolume(volume);
mRTCVideo.setRemoteAudioPlaybackVolume(roomId, uid, volume);
java

int volume = 120;
const char *uid = "";
const char *room_id = "";
video_engine_->setPlaybackVolume(volume);
video_engine_->setRemoteAudioPlaybackVolume(room_id, uid, volume);
cpp
API参考
AndroidiOSMacWindowsLinux
所有远端用户音量setPlaybackVolumesetPlaybackVolume:setPlaybackVolume:setPlaybackVolumesetPlaybackVolume
指定远端用户音量setRemoteAudioPlaybackVolumesetRemoteAudioPlaybackVolume:remoteUid:playVolume:setRemoteAudioPlaybackVolume:remoteUid:playVolume:setRemoteAudioPlaybackVolumesetRemoteAudioPlaybackVolume
FAQ

Q: Android 端调用 enableAudioPropertiesReport 成功后,收不到本端的音量回调。

A: RTC SDK 内部采用弱引用持有回调实例,需要自行管理回调实例的生命周期。例如:不能用局部内部类形式创建,必须以成员内部类的形式创建。