实时音频传输过程中,声网 SDK 通常会启动默认的音频模块进行采集和渲染。在以下场景中,你可能会发现默认的音频模块无法满足开发需求:
基于此,声网 Native SDK 支持使用自定义的音频源或渲染器,实现相关场景。本文介绍如何实现自定义音频采集和渲染。
我们在 GitHub 上提供一个开源的示例项目,你可以前往下载,或查看其中的源代码。
开始自定义采集和渲染前,请确保你已在项目中实现基本的通话或者直播功能,详见一对一通话或互动直播。
参考如下步骤,在你的项目中实现自定义音频采集功能:
joinChannel
前,通过调用 setExternalAudioSource
指定音频源。pushExternalAudioFrame
发送给 SDK 进行后续操作。参考下图时序在你的项目中实现自定义音频采集。
自定义音频采集的数据流转如下:
pushExternalAudioFrame
将音频帧推送给 SDK参考下文代码在你的项目中实现自定义音频采集。
setExternalAudioSource
指定音频源。// 指定音频源
engine.setExternalAudioSource(true, DEFAULT_SAMPLE_RATE, DEFAULT_CHANNEL_COUNT);
// 本地用户加入频道
int res = engine.joinChannel(accessToken, channelId, "Extra Optional Data", 0);
pushExternalAudioFrame
把音频帧推送到 SDK。 public class RecordThread extends Thread
{
private AudioRecord audioRecord;
public static final int DEFAULT_SAMPLE_RATE = 16000;
public static final int DEFAULT_CHANNEL_COUNT = 1, DEFAULT_CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO;
private byte[] buffer;
RecordThread()
{
int bufferSize = AudioRecord.getMinBufferSize(DEFAULT_SAMPLE_RATE, DEFAULT_CHANNEL_CONFIG,
AudioFormat.ENCODING_PCM_16BIT);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, DEFAULT_SAMPLE_RATE, DEFAULT_CHANNEL_COUNT,
AudioFormat.ENCODING_PCM_16BIT, bufferSize);
buffer = new byte[bufferSize];
}
// 开始音频录制。读取并将音频帧发送到 SDK。
@Override
public void run()
{
try
{
// 开始音频录制
audioRecord.startRecording();
while (!stopped)
{
// 读取录制的音频帧
int result = audioRecord.read(buffer, 0, buffer.length);
if (result >= 0)
{
// 将录制的音频帧发送到 SDK
CustomAudioSource.engine.pushExternalAudioFrame(
buffer, System.currentTimeMillis());
}
else
{
logRecordError(result);
}
Log.e(TAG, "Data size:" + result);
}
release();
}
catch (Exception e)
{e.printStackTrace();}
}
...
}
参考如下步骤,在你的项目中实现自定义音频渲染功能:
joinChannel
前,通过调用 setExternalAudioSink
开启并设置外部音频渲染。pullPlaybackAudioFrame
拉取远端发送的音频数据。参考下图时序在你的项目中实现自定义音频渲染。
自定义音频渲染的数据流转如下:
pullPlaybackAudioFrame
拉取远端发送的音频数据参考下文代码在你的项目中实现自定义音频渲染。
// 首先开启自定义音频渲染
rtcEngine.setExternalAudioSink(
true, // 开启外部音频渲染
44100, // 采样率,可以有 8 k,16 k,32 k,44.1 k 和 48 kHz 等模式
1 // 外部音源的通道数,最多 2 个
);
// 主动拉取远端音频帧进行播放
rtcEngine.pullPlaybackAudioFrame(
data, // byte[] 类型的音频数据
lengthInByte // 拉取的音频数据的字节数,单位为 byte
);
自定义音频采集和渲染场景中,需要开发者具有采集或渲染音频数据的能力: