音频前处理:回声消除、噪声抑制等(音视频SDK高级功能六)

音频前处理技术一般用于去除语音中的干扰。本篇文章介绍即构科技音视频SDK高级功能第六篇,ZegoLiveRoom SDK 为开发者提供了音频前处理的功能,还是以iOS环境为例。

关于如何使用SDK,请参照《SDK集成指引》。SDK 已经针对采集的音频数据进行了回声消除、噪声抑制等的处理,因此通常情况下,开发者无需再重复处理。如果开发者想对 SDK 采集的原始数据进行自定义处理,实现特殊功能(例如变声等),可参考本文档。

音频前处理的使用流程如下:

  1. App 设置预处理参数

  2. App 定义并实现音频前处理函数

  3. App 设置音频前处理函数

步骤

1、设置预处理参数

预处理参数为 AVE::ExtPrepSet 结构体类型,结构体中的变量的含义如下:

struct ExtPrepSet
{
    bool bEncode;        // 是否对前处理后的数据进行编码。如果为 true,则将前处理后的数据编码为 aac,此时 nSamples 变量有效,需要设置为编码一帧所需要的采样数;如果为 false,则不对前处理后数据进行编码,直接输出 PCM 数据,此时 nSamples 变量无效。
    int nSampleRate;    // 采样率,App 中音频前处理模块期望的输入数据采样率。如果为 0,则默认为 SDK 内部采样率
    int nChannel;        // 声道,App 中音频前处理模块期望的输入数据声道数。如果为 0,则默认为 SDK 内部声道数
    int nSamples;        // 采样数,bEncode = false 时,如果 nSamples = 0,则使用 SDK 内部采样数,SDK 将 10ms音频数据传递给外部前处理模块;如果 nSamples != 0(则 nSamples 的有效取值在 [160, 2048] 间),SDK 会传递设定采样数长度的音频数据给外部预处理模块,一些音频处理算法可能并不需要 10 ms 长度的音频数据。bEncode = true 时,AAC 编码一帧可设的采样数为(480/512/1024/1960/2048)
};

示例代码片段如下:

AVE::ExtPrepSet set;
set.bEncode = false;    // 不需要编码前处理后的数据,输出 PCM 数据
set.nChannel = 0;
set.nSamples = 0;
set.nSampleRate = 0;

2、实现音频前处理函数

扫描二维码关注公众号,回复: 4365063 查看本文章

音频前处理函数由开发者自定义,要求输入参数分别为 const AVE::AudioFrame& inFrame 和 AVE::AudioFrame& outFrame。其中 inFrame 为采集的音频数据,outFrame 为处理后返回给 SDK 的数据。

示例代码片段如下:

ZegoAVKitManager.m

void prep2_func(const AVE::AudioFrame& inFrame, AVE::AudioFrame& outFrame)
{
    outFrame.frameType = inFrame.frameType;
    outFrame.samples = inFrame.samples;
    outFrame.bytesPerSample = inFrame.bytesPerSample;
    outFrame.channels = inFrame.channels;
    outFrame.sampleRate = inFrame.sampleRate;
    outFrame.timeStamp = inFrame.timeStamp;
    outFrame.configLen = inFrame.configLen;
    outFrame.bufLen = inFrame.bufLen;
    memcpy(outFrame.buffer, inFrame.buffer, inFrame.bufLen);
}

请注意,上述示例代码,只是将采集的音频数据进行简单的复制。实际使用中,开发者需要按照各自的需求特点,对采集的音频数据做处理。

3、设置音频前处理函数

调用此 API 设置音频前处理函数,SDK 会在音频编码前调用。

ZegoLiveRoomApi-AudioIO.h

/**
 设置音频前处理函数

 @param prepSet 预处理的采样率等参数设置
 @param callback 采样数据回调
 @note 调用者调用此 API 设置音频前处理函数。SDK 会在音频编码前调用,inFrame 为采集的音频数据,outFrame 为处理后返回给 SDK 的数据
 */
+ (void)setAudioPrep2:(AVE::ExtPrepSet)prepSet dataCallback:(void(*)(const AVE::AudioFrame& inFrame, AVE::AudioFrame& outFrame))callback;

示例代码片段如下:

ZegoAVKitManager.m

[ZegoLiveRoomApi setAudioPrep2:set dataCallback:prep2_func];

猜你喜欢

转载自blog.csdn.net/sinat_20146421/article/details/84190573