原始音频数据
本文介绍如何对采集到的原始音频数据进行前处理和后处理。
技术原理
音频传输过程中,我们可以对采集到的音频数据进行前处理和后处理,获取想要的播放效果。
对于有自行处理音频数据需求的场景,声网提供原始数据功能。你可以在将数据发送给编码器前进行前处理,对捕捉到的音频信号进行修改;也可以在将数据发送给解码器后进行后处理,对接收到的音频信号进行修改。
API 调用时序
下图展示使用原始音频数据的调用时序:
前提条件
在进行操作之前,请确保你已经在项目中实现了基本的实时音视频功能。详见实现音视频互动。
实现方法
参考如下步骤,在你的项目中实现原始音频数据功能:
- 加入频道前,创建一个
IAudioFrameObserver
实例,并调用registerAudioFrameObserver
方法注册音频观测器。 - 调用
set
为前缀的方法配置音频帧格式。 - 实现
onRecordAudioFrame
,onPlaybackAudioFrame
,onPlaybackAudioFrameBeforeMixing
和onMixedAudioFrame
回调。 以上回调会对音频帧进行采集和处理。 如果以上回调的返回值是false
,则说明对音频帧的处理无效。
Java
// 调用 registerAudioFrameObserver 注册音频观测器,并传入 IAudioFrameObserve 实例
engine.registerAudioFrameObserver(new IAudioFrameObserver() {
// 实现 onRecordAudioFrame 回调
@Override
public boolean onRecordAudioFrame(byte[] samples, int numOfSamples, int bytesPerSample, int channels, int samplesPerSec) {
if(isEnableLoopBack){
mAudioPlayer.play(samples, 0, numOfSamples * bytesPerSample);
}
return false;
}
// 实现 onPlaybackAudioFrame 回调
@Override
public boolean onPlaybackAudioFrame(byte[] samples, int numOfSamples, int bytesPerSample, int channels, int samplesPerSec) {
return false;
}
// 实现 onPlaybackAudioFrameBeforeMixing 回调
@Override
public boolean onPlaybackAudioFrameBeforeMixing(byte[] samples, int numOfSamples, int bytesPerSample, int channels, int samplesPerSec, int uid) {
return false;
}
// 实现 onMixedAudioFrame 回调
@Override
public boolean onMixedAudioFrame(byte[] samples, int numOfSamples, int bytesPerSample, int channels, int samplesPerSec) {
return false;
}
// 调用 set 为前缀的方法,配置每个回调采集到的音频帧
engine.setRecordingAudioFrameParameters(SAMPLE_RATE, SAMPLE_NUM_OF_CHANNEL, Constants.RAW_AUDIO_FRAME_OP_MODE_READ_WRITE,SAMPLES_PER_CALL);
engine.setMixedAudioFrameParameters(SAMPLE_RATE, SAMPLES_PER_CALL);
engine.setPlaybackAudioFrameParameters(SAMPLE_RATE, SAMPLE_NUM_OF_CHANNEL, Constants.RAW_AUDIO_FRAME_OP_MODE_READ_WRITE,SAMPLES_PER_CALL);
});
参考信息
本节介绍本文中使用方法的更多信息以及相关页面的链接。
示例项目
声网在 GitHub 上提供一个开源的示例项目:ProcessAudioRawData