音频数据回调
简介
在音频连麦的过程中,我们经常有这种需求,展示当前是谁在发言(比如当某人说话时就在他的麦克风图标上做高亮处理)或是绘制当前音频的波形图等等。为了实现这些需求,我们就需要实时地去获取音频 Track 中正在播放的音频数据。
当然,SDK 已经为您提供了相关的方法帮助您更便捷地完成上面的需求,只要获取到了类型为 audio
的 Track 对象,都能通过访问该对象的以下方法来实现音频数据回调:
- getCurrentTimeDomainData 获取当前音频的时域数据
- getCurrentFrequencyData 获取当前音频的频域数据
- onAudioBuffer 用于获取音频 Buffer 数据(AudioBuffer,解码后)
下面将详细介绍这 3 种回调,以及各自的使用场景。
API 说明
我们知道,音频数据是根据采样率的大小在一个数组里按时间顺序填充的采样数据,播放音频时,也会时序地将这个数组中的数据按批次取出并送入声卡中,声卡中正在处理的那一批音频数据,就是我们在那一刻听到的声音。
所以这里的第一个方法 getCurrentTimeDomainData,就是实时地去获取当前正在处理的音频数据(实际上这并不是声卡当前正在处理的数据,只是尽量精确的一个离当前播放 buffer 最近的范围为 2048 长度的音频)。不过这里要注意,我们不能通过不断地调用这个方法来收集音频的原始数据,这个方法仅用于一些实时的音频分析和处理(比如我们绘制声波图)。
如果想要收集音频的原始数据,使用我们的第三个方法 onAudioBuffer,这个函数的返回不能保证实时性,但是会根据播放的进度不断地将之前用于播放的音频数据回调回来。
好了,这样我们还剩下最后一个方法没有介绍,其实很简单,第二个方法 getCurrentFrequencyData 就是将当前的时序音频数据做了一次 STFT 变换得到的频域数据,一般可用用来绘制频谱图,或者用来判断某个频段是否有声音(是否有人说话)。
const handleAudioBuffer = (buffer) => {
console.log("get audio buffer", buffer);
}
// 收集音频播放过程中的 Buffer 数据
track.onAudioBuffer(handleAudioBuffer);
// 获取当前的时域数据(2048 长的 Uint8Array)
const timeDomainData = track.getCurrentTimeDomainData();
// 获取当前的频域数据(2048 长的 Uint8Array)
const frequencyData = track.getCurrentFrequencyData();