声网默认的音频模块可以满足在 app 中使用基本音频功能的需求。声网 SDK 支持使用自定义的音频源和自定义的音频渲染模块为你的 app 添加特殊的音频功能。
实时音频传输过程中,声网 SDK 通常会开启默认的音频模块。在以下场景中,你可能会发现默认的音频模块无法满足开发需求,需要自定义音频采集或自定义音频渲染。例如:
使用自定义音频源管理音频帧的采集、处理和播放时,需要使用声网 SDK 外部方法。
下图展示在自定义音频采集、音频渲染时,音频数据的传输过程。
自定义音频采集
pushExternalAudioFrame
,将采集到的音频帧发送给 SDK。自定义音频渲染
pullPlaybackAudioFrame
获取远端用户发送的音频数据。在进行操作之前,请确保你已经在项目中实现了基本的实时音视频功能。详见实现视频通话或实现视频直播。
本节介绍如何实现自定义音频采集。
参考以下调用时序图,在你的 app 中实现自定义音频采集:
参考如下步骤,在你的项目中实现自定义音频采集功能:
调用 joinChannel
前,调用 setExternalAudioSource
指定音频源。
// 指定自定义音频源
engine.setExternalAudioSource(true, DEFAULT_SAMPLE_RATE, DEFAULT_CHANNEL_COUNT, 1, true, true);
// 本地用户加入频道
ChannelMediaOptions option = new ChannelMediaOptions();
option.autoSubscribeAudio = true;
option.autoSubscribeVideo = true;
int res = engine.joinChannel(accessToken, channelId, 0, option);
使用 SDK 外部方法自行实现音频的采集和处理。
调用 pushExternalAudioFrame
,将音频帧发送给 SDK,留作备用。
engine.pushExternalAudioFrame(ByteBuffer.wrap(buffer), 0, 0);
本节介绍如何实现自定义音频渲染。你可以采用如下两种方式实现自定义音频渲染。
参考如下调用时序,在你的项目中调用自定义音频渲染 API 实现自定义音频渲染。
调用 joinChannel
前,调用 setExternalAudioSink
开启和配置自定义音频渲染。
rtcEngine.setExternalAudioSink(
true, // 开启自定义音频渲染
44100, // 采样率(Hz)。你可以将该值设置为 16000,32000,441000 或者 48000
1 // 自定义音频源的声道数。你可以将该值设置为 1 或 2
);
加入频道后,调用 pullPlaybackAudioFrame
获取远端用户发送的音频数据。使用你自己的音频渲染器处理音频数据,然后播放已渲染的数据。
private class FileThread implements Runnable {
@Override
public void run() {
while (mPull) {
int lengthInByte = 48000 / 1000 * 2 * 1 * 10;
ByteBuffer frame = ByteBuffer.allocateDirect(lengthInByte);
int ret = engine.pullPlaybackAudioFrame(frame, lengthInByte);
byte[] data = new byte[frame.remaining()];
frame.get(data, 0, data.length);
// 写入本地文件或由播放器进行渲染
FileIOUtils.writeFileFromBytesByChannel("/sdcard/agora/pull_48k.pcm", data, true, true);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
开始前,请确保你的项目中已实现原始音频数据。详见原始音频数据。
参考如下步骤,在你的项目中调用原始音频数据 API 实现自定义音频渲染:
onRecordAudioFrame
,onPlaybackAudioFrame
,onMixedAudioFrame
或者 onPlaybackAudioFrameBeforeMixing
获取待播放的音频数据。本节介绍文中使用方法的更多信息以及相关页面的链接。
声网在 GitHub 上提供了一个开源的示例项目。 你可以在 GitHub 上参考源代码或进行下载体验。
setExternalAudioSource
[1/2]setExternalAudioSource
[2/2]pushExternalAudioFrame
[1/2]pushExternalAudioFrame
[2/2]setExternalAudioSink
pullPlaybackAudioFrame
[1/2]pullPlaybackAudioFrame
[2/2]