实时音视频传输过程中,声网 SDK 通常会启动默认的音视频模块进行采集和渲染。在以下场景中,你可能会发现默认的音视频模块无法满足开发需求:
基于此,声网 Unity SDK 支持使用自定义的音视频源或渲染器,实现相关场景。本文介绍如何实现自定义音频采集和渲染。
开始自定义采集和渲染前,请确保你已在项目中实现基本的通话或者直播功能,详见实现语音通话或实现音频互动直播。
参考如下步骤,在你的项目中实现自定义音频采集功能:
SetExternalAudioSource
指定外部音频采集设备。PushAudioFrame
发送给 SDK 进行后续操作。示例代码
参考下文代码在你的项目中实现自定义音频采集。
// 设置外部音频采集参数。
public int SetExternalAudioSource(bool enabled, int sampleRate, int channels)
{
mRtcEngine.SetExternalAudioSource(enabled, sampleRate, channels);
}
// 推送外部音频帧。
public int PushAudioFrame(AudioFrame audioFrame)
{
mRtcEngine.PushAudioFrame(audioFrame);
}
public struct AudioFrame
{
// 音频帧类型。详见 #AUDIO_FRAME_TYPE。
public AUDIO_FRAME_TYPE type;
// 每个声道的采样点数。
public int samples;
// 每个采样点的字节数。通常为十六位,即两个字节。
public int bytesPerSample;
// 声道数量(如果是立体声,数据是交叉的)
// - 1: 单声道。
// - 2: 双声道。
public int channels;
// 采样率。
public int samplesPerSec;
// 声音数据缓存区(如果是立体声,数据是交叉存储的)。
// 缓存区数据大小:buffer = samples × channels × bytesPerSample。
public byte[] buffer;
// 外部音频帧的渲染时间戳。你可以使用该时间戳还原音频帧顺序;在有视频的场景中(包含使用外部视频源的场景),该参数可以用于实现音视频同步。
public long renderTimeMs;
// 预留参数。
public int avsync_type;
};
API 参考
参考如下步骤,在你的项目中实现自定义音频渲染功能:
SetExternalAudioSink
开启并设置外部音频渲染。PullAudioFrame
拉取远端发送的音频数据。示例代码
// 设置外部音频渲染参数。
public int SetExternalAudioSink(bool enabled, int sampleRate, int channels)
{
mRtcEngine.SetExternalAudioSink(enabled, sampleRate, channels);
}
// 拉取远端音频数据。
public int PullAudioFrame(IntPtr audioBuffer, int type, int samples, int bytesPerSample, int channels, int samplesPerSec, long renderTimeMs, int avsync_type)
{
mRtcEngine.PullAudioFrame(audioBuffer, type, samples, bytesPerSample, channels, samplesPerSec, renderTimeMs, avsync_type);
}
API 参考
回调函数里处理音频数据要尽量高效,且保证算法稳定,避免影响整个客户端或产生崩溃。
需要设置 RAW_AUDIO_FRAME_OP_MODE_READ_WRITE
才可以读写和操作数据。
自定义音频采集和渲染场景中,需要开发者具有采集或渲染音频数据的能力: