🎊 音频频谱与声浪

音频频谱与声浪

音频频谱与声浪 更新时间:2022-10-11 16:12

1 功能简介

1.1 功能描述

声浪,即某条流音量的大小。主要应用场景,判断麦上的用户谁在说话,并做UI展示,例如:

音频功率谱,即数字音频信号在各频点的能量值;例如:

1.2 常用场景

在直播、语聊房、K歌房场景中,为增加产品的趣味性和互动性,ZEGO SDK 提供了展现音频功率谱的能力,即将时域的音频数字信号转换成频域的音频数字信号。对此种场景有需求的开发者无需具有专业的数字信号领域相关知识,即可通过 ZEGO SDK 获取采集或者拉流的音频的功率谱数据。

在语聊房或无视频画面的K歌场景中,常需要拉多路流并显示其中正在讲话的用户,ZEGO SDK 提供了甄别用户是否有说话,说话音量大小(声浪)的能力;方便开发者在业务 App 界面上展示麦上用户的麦位音量大小的 UI。

2 使用步骤

相关功能的 Demo 源码,请联系 ZEGO 技术支持获取。

2.1 初始化 SDK

参考文档:快速开始 - 实现流程 的 “3.1 创建引擎”。

2.2 使用声浪功能

2.2.1 导入声浪相关的类

import com.zego.zegoavkit2.soundlevel.ZegoSoundLevelMonitor;

import com.zego.zegoavkit2.soundlevel.IZegoSoundLevelCallback;

import com.zego.zegoavkit2.soundlevel.ZegoSoundLevelInfo;

2.2.2 获取 ZegoSoundLevelMonitor 的单例对象

// 该方法为静态单例,可以直接全局获取

ZegoSoundLevelMonitor zegoSoundLevelMonitor = ZegoSoundLevelMonitor.getInstance();

2.2.3 设置监控/回调周期

// 设置声浪监听的周期,即回调抛出数据的频率,单位为ms,最小值为100ms,最大值为3000ms,不设默认为200ms;

zegoSoundLevelMonitor.setCycle(millisecond);

注意:修改监控周期需要先停止监控器再开启监控器

2.2.4 监听回调并处理回调数据

// 设置声浪相关回调,由于SDK内部会抛出己方推流和拉到的流的声浪数据,所以需要设置相关回调来监听抛出的数据并处理,

// 业务可以根据自己的需求展现在控件上

ZegoSoundLevelMonitor.getInstance().setCallback(new IZegoSoundLevelCallback(){

/**

* 拉流声浪数据回调,停止拉流之后不会再抛出,回调值范围为[0-100]

*

* @param zegoSoundLevelInfo

*/

@Override

public void onSoundLevelUpdate(ZegoSoundLevelInfo[] zegoSoundLevelInfos) {

// 这里会抛出拉流的声浪的数据,业务方可以根据自己的场景或需求进行展现

...

}

/**

* 本地音量采集回调,由于是引擎启动期间(在推流 或 拉流 或 存在SDK的本地预览)有效,即使停止推流还会回调,回调值范围为[0-100]

*

* @param zegoSoundLevelInfo

*/

@Override

public void onCaptureSoundLevelUpdate(ZegoSoundLevelInfo zegoSoundLevelInfo) {

// 这里会抛出推流的声浪的数据,业务方可以根据自己的场景或需求进行展现

...

}

});

2.2.5 启动声浪监听

启动监听后会立即触发本端声浪回调,远端声浪回调需要拉流后才会触发。

ZegoSoundLevelMonitor.getInstance().start();

2.2.6 关闭声浪监听

onSoundLevelUpdate 与 onCaptureSoundLevelUpdate回调不再触发

ZegoSoundLevelMonitor.getInstance().stop();

2.3 使用音频功率谱功能关键步骤

2.3.1 导入音频功率谱的类

import com.zego.zegoavkit2.frequencyspectrum.ZegoFrequencySpectrumMonitor;

import com.zego.zegoavkit2.frequencyspectrum.IZegoFrequencySpectrumCallback;

import com.zego.zegoavkit2.frequencyspectrum.ZegoFrequencySpectrumInfo;

2.3.2 获取 ZegoFrequencySpectrumMonitor 的单例对象

// 该方法为静态单例,可以直接全局获取

ZegoFrequencySpectrumMonitor frequencySpectrumMonitor = ZegoFrequencySpectrumMonitor.getInstance();

2.3.3 设置监控/回调周期

// 设置音频功率谱监听的周期,即回调抛出数据的频率,单位为ms,最小值为10ms,不设默认为500ms;

frequencySpectrumMonitor.setCycle(millisecond);

注意:修改监控周期需要先停止监控器再开启监控器

2.3.4 监听回调并处理回调数据

// 设置频谱相关回调,由于SDK内部会抛出己方推流和拉到的流的音频频谱的数据,所以需要设置相关回调来监听抛出的数据并处理

ZegoFrequencySpectrumMonitor.getInstance().setCallback(new IZegoFrequencySpectrumCallback() {

/**

* 拉流频率功率谱数据回调,停止拉流之后不会再抛出,回调值范围为[0-2^30]

*

* @param zegoFrequencySpectrumInfos

*/

@Override

public void onFrequencySpectrumUpdate(ZegoFrequencySpectrumInfo[] zegoFrequencySpectrumInfos) {

// 这里会抛出拉流的音频功率谱的数据,业务方可以根据自己的场景或需求进行展现

...

}

/**

* 本地音量采集回调,由于是引擎启动期间(在推流 或 拉流 或 存在SDK的本地预览)有效,即使停止推流还会回调,回调值范围为[0-2^30]

*

* @param zegoFrequencySpectrumInfo

*/

@Override

public void onCaptureFrequencySpectrumUpdate(ZegoFrequencySpectrumInfo zegoFrequencySpectrumInfo) {

// 这里会抛出推流的音频功率谱的数据,业务方可以根据自己的场景或需求进行展现

...

}

});

2.3.5 启动音频功率谱监听

启动监听后会立即触发本端音频功率谱回调,远端音频功率谱回调需要拉流后才会触发。

ZegoFrequencySpectrumMonitor.getInstance().start();

2.3.6 关闭音频功率谱监听

onFrequencySpectrumUpdate 和 onCaptureFrequencySpectrumUpdate回调不再触发

ZegoFrequencySpectrumMonitor.getInstance().stop();

2.4 登录房间

参考文档:快速开始-登录房间

2.5 推流或拉流

推流参考文档:快速开始-推流拉流参考文档:快速开始-拉流

3 API 参考列表

3.1 声浪相关 API

方法

描述

ZegoSoundLevelMonitor.getInstance()

获取声浪监听器

setCallback(IZegoSoundLevelCallback callback)

设置声浪的回调

setCycle(int timeInMS)

设置声浪回调的周期

start()

启动声浪监听

stop()

停止声浪监听

3.2 音频功率谱相关 API

方法

描述

ZegoFrequencySpectrumMonitor.getInstance()

获取音频频率功率谱监听器

setCallback(IZegoFrequencySpectrumCallback callback)

设置音频功率谱的回调

setCycle(int timeInMS)

设置音频频率功率谱回调的周期

start()

启动音频功率谱监听

stop()

停止音频功率谱监听

4 相关文档

快速开始-初始化SDK

快速开始-登录房间

快速开始-推流

快速开始-拉流

5 FAQ

Q1:为什么设置监听周期无效果?

答:音频功率谱与声浪功能暂时不支持热设置,需要先停止监听,修改监听周期之后,再重新启动监听

Q2: 差不多大小的声音,不同手机回调的音量值竟然不一样?

答:Android 系统厂商多样,所使用的底层硬件不尽相同,系统处理音频采集的驱动也很可能不一样,造成在相同分贝的音量大小在不同手机抛出的音量值很可能是不一样的。

Q3: 同样分贝的音量大小,为什么在只推流的时候跟既推流又拉流的时候,回调的推流音量的值也不一样?

答:在只推流的情况下和既推流又拉流的情况下。SDK使用的音频设备模式是不一样的,这是 Android 系统因素导致。只推流的时候使用的是SDK内部的音频处理方式,而既推流又拉流的时候使用的是系统的音频处理方式。因此会出现不一样的情况。声浪功能一般用于UI展示哪些推流用户在说话,因此对只推流的情况,这种情况并不是很敏感。

Q4: 按照文档引入音频功率谱的包,找不到这些包?

答:由于通用包大小考虑,音频功率谱会增大通用SDK包的大小,因此默认的SDK无音频功率谱功能,如果需要,可以联系ZEGO 技术支持获取。

Q5: 为什么没说话的时候依然有对应的回调值不为0?

答:这是因为环境的背景音导致,一般正常环境的背景不太可能出现完全静音的情况,因此在不说话的时候依然有较小的数值回调出来是正常的。

Q6: 为什么我在使用SDK的高级功能音频外部采集之后,声浪和音频频谱的采集的回调没有收到采集的音量?

答:因为声浪和音频频谱的功能都是在SDK内部的音频前处理时做的,当使用音频外部采集的功能时,SDK只负责音频数据的传输。在使用音频外部采集时,不会对外部采集的音频数据做前处理,因此无法获得外部采集音频的声浪和频谱数据。

Q7: 只有拉流没有推流为什么会收到onCaptureSoundLevelUpdate或onCaptureFrequencySpectrumUpdate,并且流名为空和音量为0?

答:这是由于这两个采集回调在启动监听的时候就会抛出回调,此时如果本机无推流,还是会抛出这两个回调,但是流名为空,且对应数据为0.

🎯 相关推荐

“只生一个”好不好?原国家卫计委副主任这样解释
非物质文化遗产
菠菜365

非物质文化遗产

📅 08-15 👀 6627
软件开发文档如何写
365bet是什么

软件开发文档如何写

📅 11-05 👀 8672