自定义音频处理
2024-02-27
功能简介
自定义音频处理一般用于去除语音中的干扰,由于 SDK 已经对采集的音频原始数据进行了回声消除、噪声抑制等处理,通常情况下,开发者无需再重复处理。
如果开发者想在采集音频数据后或拉取远端音频数据渲染前,通过自定义处理实现特殊功能时(例如变声、美声等),可以参考本文档。
前提条件
在自定义音频处理之前,请确保:
- 已在 ZEGO 控制台 创建项目,并申请有效的 AppID 和 AppSign,详情请参考 控制台 - 项目信息。
- 已在项目中集成 ZEGO Express SDK,并实现了基本的音视频推拉流功能,详情请参考 快速开始 - 集成 和 快速开始 - 实现流程。
使用步骤
1 创建 SDK 引擎
调用 createEngine 接口创建 SDK 引擎实例,详情可参考 快速开始 - 实现流程 的 “创建引擎”。
2 设置音频自定义处理对象并实现回调方法
调用 registerAudioPlugin 接口设置音频自定义处理插件对象,并通过原生插件提供的回调方法:自定义音频处理本地采集 PCM 音频帧回调 onProcessCapturedAudioData
和自定义音频处理远端拉流 PCM 音频帧回调 onProcessRemoteAudioData
。在回调方法中直接处理获取的 data
,即可实现对推拉流音频数据的处理。
let plugin: number = GetNativeAudioProcessPlugin();
ZegoExpressEngine.getInstance().registerAudioPlugin(2, plugin);
这里需要通过原生插件的形式来处理音频数据,避免音频数据的多次拷贝。
class ZegoExpressAudioPlugin :
public ZegoExpressOHOSAudioDataProcessPluginBase
{
public:
virtual void onProcessCapturedAudioData(unsigned char * /*data*/, unsigned int /*dataLength*/,
ZegoAudioFrameParam * /*param*/, double /*timestamp*/) override;
virtual void onProcessCapturedAudioDataAfterUsedHeadphoneMonitor(unsigned char * /*data*/,
unsigned int /*dataLength*/,
ZegoAudioFrameParam * /*param*/,
double /*timestamp*/) override;
virtual void onProcessRemoteAudioData(unsigned char * /*data*/, unsigned int /*dataLength*/,
ZegoAudioFrameParam * /*param*/,
const std::string & /*streamID*/, double /*timestamp*/) override;
virtual void onProcessPlaybackAudioData(unsigned char * /*data*/, unsigned int /*dataLength*/,
ZegoAudioFrameParam * /*param*/, double /*timestamp*/) override;
};
3 自定义音频处理
-
在开始推流或启动本地预览前,调用 enableCustomAudioCaptureProcessing 接口开启本地采集自定义音频处理。开启后,开发者可以通过原生插件提供的
onProcessCapturedAudioData
回调收到本地采集的音频帧,并可以对音频数据进行修改。 -
在开始拉流前,调用 enableCustomAudioRemoteProcessing 接口开启远端拉流自定义音频处理。开启后,开发者可以通过原生插件提供的
onProcessRemoteAudioData
收到远端拉流的音频帧,并且可以对音频数据进行修改。
let config = new ZegoCustomAudioProcessConfig();
config.channel = ZegoAudioChannel.Mono;
config.sampleRate = ZegoAudioSampleRate.SampleRate16K;
config.samples = 0;
ZegoExpressEngine.getInstance().enableCustomAudioCaptureProcessing(true, config);
ZegoExpressEngine.getInstance().enableCustomAudioRemoteProcessing(true, config);