音频后处理
更新时间: 2024/08/23 10:24:52
本章节主要介绍音视频SDK提供的各种音频后处理功能。后处理主要指的收到远端音频数据后的处理,主要分为单个远端用户PCM音频数据及播放前的PCM音频数据。目前音频后处理只提供简单的数据回调回调功能,暂不支持修改数据的功能。
音频后处理
单个用户PCM音频数据
- API 介绍
如果用户期望获取某一个远端用户的PCM音频数据,可以通过 registerRemoteAudioCallBack
注册相应的监听器。
- API 原型
java /**
* 注册远端用户 pcm 音频数据回调
*
* @param account 远端用户account ,用户离开SDK会自动取消注册
* @param callback 监听器 ,填 null 表示取消之前的注册的
* @return 是否注册成功
*/
public abstract boolean registerRemoteAudioCallBack(String account, IAVChatRemoteAudioCallBack callback);
- 参数说明
参数 | 说明 |
---|---|
account | 期望监听的远端用户accid |
callback | 远端数据回调,多个用户可以共用一个callback ,null 表示反注册 |
javapublic interface IAVChatRemoteAudioCallBack {
/**
* 远端用户 pcm 音频回调
* 注意 :此回调是同步回调,并且数据只能读不能修改,一定要先拷贝有效数据( 回调结束后,原始的AudioFrame可能会被SDK复用修改 ),再投递到子线程去<br/> *
* @param account 用户account
* @param audioFrame 音频数据
*/
void onAudioFrame(String account, AudioFrame audioFrame);
}
- 参数说明
参数 | 说明 |
---|---|
account | 期望监听的远端用户accid |
audioFrame | 音频PCM 数据 |
- 注意
onAudioFrame
是同步回调,并且数据只能读不能修改,一定要先拷贝有效数据( 回调结束后,原始的AudioFrame可能会被SDK复用修改 ),再投递到子线程去。参考以下代码:
javaint len = audioFrame.getChannels() * audioFrame.getSamplesPerChannel() * audioFrame.getBytesPerSample();
byte[] bytes = new byte[len];
audioFrame.getData().get(bytes, 0, len);
backgroundHandler.post(new Runnable() {
@Override
public void run() {
outputStream.write(bytes)
}
});
};
- 示例
java// IAVChatRemoteAudioCallBack
IAVChatRemoteAudioCallBack callBack = new IAVChatRemoteAudioCallBack(){
public void onAudioFrame(String account, AudioFrame audioFrame) {
int len = audioFrame.getChannels() * audioFrame.getSamplesPerChannel() * audioFrame.getBytesPerSample();
byte[] bytes = new byte[len];
audioFrame.getData().get(bytes, 0, len);
backgroundHandler.post(new Runnable() {
@Override
public void run() {
outputStream.write(bytes)
}
});
}
}
};
// 注册监听器
AVChatManager.getInstance().registerRemoteAudioCallBack(account, callBack);
//使用完了,反注册监听器
AVChatManager.getInstance().registerRemoteAudioCallBack(account, null);
播放PCM音频数据回调
如果用户期望获取播放前的PCM音频数据,可以通过 registerPlayAudioCallBack
注册相应的监听器。
- API 原型
java /**
* 注册播放前 pcm 音频数据回调
*
* @param callback 监听器 ,填 null 表示取消之前的注册的
* 说明:如果用户需要特定的采集率但又不想自己重采样,可以修改{@link AVChatParameters#KEY_AUDIO_PLAYBACK_DEFAULT_SAMPLE_RATE}
* @return 是否注册成功
*/
public abstract boolean registerPlayAudioCallBack(IAVChatPlayAudioCallBack callback);
- 参数说明
参数 | 说明 |
---|---|
callback | 播放前视频数据回调 , null 为取消监听 |
javapublic interface IAVChatPlayAudioCallBack {
/**
* 播放前 pcm 音频数据回调<br/>
* 注意 :此回调是同步回调,并且数据只能读不能修改,一定要先拷贝有效数据( 回调结束后,原始的AudioFrame可能会被SDK复用修改 ),再投递到子线程去<br/>
* @param audioFrame 音频数据
* @return true : 保留原始数据,继续播放 , false :丢弃原始数据,不再播放
*/
boolean onPlayAudioFrame(AudioFrame audioFrame);
}
- 参数说明
参数 | 说明 |
---|---|
audioFrame | 音频PCM 数据 |
- 注意
onPlayAudioFrame
同步回调,并且数据只能读不能修改,一定要先拷贝有效数据( 回调结束后,原始的AudioFrame可能会被SDK复用修改 ),再投递到子线程去,参考以下代码 :
javaint len = audioFrame.getChannels() * audioFrame.getSamplesPerChannel() * audioFrame.getBytesPerSample();
byte[] bytes = new byte[len];
audioFrame.getData().get(bytes, 0, len);
backgroundHandler.post(new Runnable() {
@Override
public void run() {
outputStream.write(bytes)
}
});
};
- 示例
java
// IAVChatPlayAudioCallBack
IAVChatPlayAudioCallBack callBack = new IAVChatPlayAudioCallBack(){
public boolean onPlayAudioFrame(AudioFrame audioFrame) {
int len = audioFrame.getChannels() * audioFrame.getSamplesPerChannel() * audioFrame.getBytesPerSample();
byte[] bytes = new byte[len];
audioFrame.getData().get(bytes, 0, len);
backgroundHandler.post(new Runnable() {
@Override
public void run() {
outputStream.write(bytes)
}
});
};
return true;
}
// 注册
AVChatManager.getInstance().registerPlayAudioCallBack(callBack);
//使用完了,取消注册
AVChatManager.getInstance().registerPlayAudioCallBack(null);
此文档是否对你有帮助?