iOS音频外部采集与渲染(音视频SDK高级功能八)

本篇介绍即构科技音视频SDK高级功能系列第八篇——音频外部采集与渲染。

1、使用场景

1.1 外部采集

以下情况时,建议使用音频外部采集功能:

  • 客户需要从现有音频流、音频文件、或者定制的采集系统中获得采集后输入,交给 SDK 传输。

  • 客户有自己对 PCM 输入源做特殊的音效处理的需求,在音效处理后输入,交给 SDK 传输。

1.2 外部渲染

当客户有自己渲染的需求,例如对拉取到的原始 PCM 数据做特殊应用或者处理后再渲染,建议使用 SDK 的音频外部渲染功能。

请注意:

音频外部采集和外部渲染是一体的,所以如果开发者采用了外部渲染,则在有需要的情况下,应当自己实现外部采集。同理,采用了外部采集,则在有需要的情况下,应当自己实现外部渲染。

开发者采用外部采集和渲染后,SDK 内部不负责声音增强、噪音抑制、回音消除等功能,需要用户自己实现。

2、相关接口

音频外部采集和渲染是一体的,相关接口都位于 IAudioDataInOutput 类中,结构如下所示:

audio_in_output.h

class IAudioDataInOutput
{
public:
    virtual void startCapture() = 0;    // 启用外部采集
    virtual void stopCapture() = 0;        // 停止外部采集
    virtual void startRender() = 0;        // 启用外部渲染
    virtual void stopRender() = 0;        // 停止外部渲染
    virtual bool onRecordAudioFrame(AudioFrame& audioFrame) = 0;     // 输入采集数据给 SDK
    virtual bool onPlaybackAudioFrame(AudioFrame& audioFrame) = 0;   // 从 SDK 获取可渲染数据
};

其中,AudioFrame 表示音频帧,具体结构为:

audio_in_output.h

struct AudioFrame
{
    int frameType;   // 帧类型,参考 FrameType          
    int samples;               
    int bytesPerSample;        
    int channels;              
    int sampleRate;            
    double timeStamp;            
    int configLen;             
    int bufLen;                

    unsigned char* buffer;     
};

enum FrameType    
{
    TYPE_PCM                = 0x1001,           //PCM 帧
    TYPE_AAC_STREAM         = 0x1003,           //AAC 编码帧
};

当 frameType 为 TYPE_PCM 时,各字段的含义说明:
在这里插入图片描述
当 frameType 为 TYPE_AAC_STREAM 时,各字段的含义说明:
在这里插入图片描述

关于 buffer 结构,请注意:

  • 如果 configLen == 0,则 buffer 中全部是 aac encode data 数据。

  • 如果 configLen == bufLen,则 buffer 中全部是 aac special config 数据。

  • 如果 (configLen != 0) && (configLen < bufLen),则 buffer 中含有 configLen 长度的 aac special config 数据和 (bufLen - configLen) 长度的 encode data 数据。

下文将详细讲述如何使用 IAudioDataInOutput 实现音频外部采集和渲染。

2.1 开启外部音频设备

使用音频外部采集和外部渲染之前,必须先启用外部音频设备,调用如下接口:

zego-api-external-audio-device-oc.h

/**
 设置外部音频设备,包括外部音频采集和外部音频渲染

 @param enable true 开启,false 关闭
 @discussion 必须在 InitSDK 之前设置;
 @discussion 开发者采用外部采集和渲染后,SDK 内部不负责声音增强、噪音抑制、回音消除等功能,需要用户自己实现。
 */
+ (void)enableExternalAudioDevice:(bool)enable;

2.2 音频外部采集

音频外部采集的接口调用步骤如下图所示:
在这里插入图片描述

请注意

  • 调用 onRecordAudioFrame(AudioFrame& audioFrame) 输入采集数据给 SDK 时,audioFrame 只是输入参数

  • 数据 buffer 内存由外部调用者负责分配和释放,各字段均由外部调用者填写。

2.3 音频外部渲染

音频外部渲染的接口调用步骤如下图所示:
在这里插入图片描述

请注意

调用 onPlaybackAudioFrame(AudioFrame& audioFrame) 从 SDK 获取可渲染数据时,参数
audioFrame 即为输入参数,也为输出参数。

数据 buffer 内存由外部调用者负责分配和释放。

当 audioFrame 作为输入参数时,外部渲染模块参数需要按照如下方式填写:
在这里插入图片描述
当 audioFrame 作为输出参数时,SDK 会按照外部渲染要求填充好 buffer 中的数据,会修改 bufLen = 2 x samples x channels,其他字段不变。

猜你喜欢

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