文档中心
Old_Live_Room 互动视频
文档中心
体验 App
SDK 中心
API 中心
常见问题
代码市场
进入控制台
立即注册
登录
中文站 English
  • 文档中心
  • 互动视频
  • 音频进阶
  • 音频外部采集与渲染

音频外部采集与渲染

更新时间:2023-04-14 16:13

1 使用场景

1.1 外部采集

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

  1. 客户需要从现有音频流、音频文件、或者定制的采集系统中获得采集后输入,交给 SDK 传输。
  2. 客户有自己对 PCM 输入源做特殊的音效处理的需求,在音效处理后输入,交给 SDK 传输。

1.2 外部渲染

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

音频的采集和渲染分为 3 种情况:

  • 内部采集、内部渲染
  • 自定义采集、自定义渲染
  • 自定义采集、内部渲染

开发者请根据自己的业务场景,选择合适的音频采集和渲染方式。

2 相关接口

音频外部采集和渲染的相关接口都位于 zego-api-external-audio-device.h 文件中,如下所示:

zego-api-external-audio-device.h

    /**
     推流通道音频采集源类别
     */
    typedef enum ZegoExternalAudioDeviceSourceType
    {
        kZegoExternalAudioDeviceSourceTypeNone                     = -1,   /**< 关闭外部音源 */
        kZegoExternalAudioDeviceSourceTypeSameAsMainPublishChannel = 0,    /**< 和主推流通道一样 */
        kZegoExternalAudioDeviceSourceTypeExternalCapture          = 1,    /**< 使用外部采集 */
        kZegoExternalAudioDeviceSourceTypePlayer                   = 2,    /**< 使用媒体播放器的音源 */
    } ZegoAudioDeviceSrcType;

    /**
     设置推流通道的音源

     @param publish_channel_index 选定推流通道
     @param source_type 音频来源, 详见 ZegoExternalAudioDeviceSourceType 定义
     @return 详见 enum ZegoErrorCode
     @note 必须在开启预览或者启动推流/拉流 前调用才有效
     @note 开发者采用外部采集和渲染后,SDK 内部不负责声音增强、噪音抑制、回音消除等功能,需要用户自己实现
     @note 当 publish_channel_index = 0 时表示主通道, 只支持外部采集方式
     @note 当 publish_channel_index = 1 时表示辅助通道, 支持三种音源模式, 和主推流通道一样, 使用外部采集, 使用媒体播放器的音源
     @note 当 publish_channel_index > 1 时, 当前只支持外部采集方式
     @note 当 source_type 选择 kZegoExternalAudioDeviceSourceTypeNone 时表示关闭外部音源, 主通道使用内部采集音源, 其他通道无音源
     */
    ZEGOAVKIT_API int zego_external_audio_device_set_audio_source(int publish_channel_index, ZegoExternalAudioDeviceSourceType source_type);

    /**
     开始外部音频采集(通知 SDK)

     @param publish_channel_index 选定推流通道
     @return 详见 enum ZegoErrorCode
     */
    ZEGOAVKIT_API int zego_external_audio_device_start_capture(int publish_channel_index);

    /**
     结束外部音频采集(通知 SDK)

     @param publish_channel_index 选定推流通道
     @return 详见 enum ZegoErrorCode
     */
    ZEGOAVKIT_API int zego_external_audio_device_stop_capture(int publish_channel_index);

    /**
     把采集到的音频数据(AAC 或者 PCM) 塞给 SDK。

     @param publish_channel_index 选定推流通道
     @param audio_frame 采集到的音频帧
     @return 详见 enum ZegoErrorCode
     @note 必须在启动推流以后,且已经调用了 zego_external_audio_device_start_capture API,此接口调用才有效
     @note 必须在反初始化 SDK 之前停止调用
     */
    ZEGOAVKIT_API int zego_external_audio_device_on_record_audio_frame(int publish_channel_index, struct ZegoAudioFrame* audio_frame);

    /**
     开始外部音频播放(通知 SDK)

     @return 详见 enum ZegoErrorCode
     */
    ZEGOAVKIT_API int zego_external_audio_device_start_render();

    /**
     结束外部音频播放(通知 SDK)

     @return 详见 enum ZegoErrorCode
     */
    ZEGOAVKIT_API int zego_external_audio_device_stop_render();

    /**
     从 SDK 取音频渲染数据(PCM)

     @param audio_frame 得到的音频数据
     @return 详见 enum ZegoErrorCode
     @note 必须在启动拉流以后,且已经调用了 zego_external_audio_device_start_render API,此接口调用才有效
     @note 必须在反初始化 SDK 之前停止调用
     */
    ZEGOAVKIT_API int zego_external_audio_device_on_playback_audio_frame(struct ZegoAudioFrame* audio_frame);

其中,ZegoAudioFrame 表示音频帧,具体使用方式为:

zego-api-audio-frame.h

    /** 音频帧类型 */
    typedef enum ZegoAudioFrameType
    {
        kZegoAudioFrameTypePCM          = 0x1001,   /** PCM 数据 */
        kZegoAudioFrameTypeAACStream    = 0x1003,   /** AAC 编码数据流 */
    } ZegoAudioFrameType;

    /** 音频帧结构 */
    struct ZegoAudioFrame;

    /**
     创建音频帧对象

     @return 返回创建的对象,使用完毕后必须调用 zego_audio_frame_destroy() 接口释放
     */
    ZEGOAVKIT_API struct ZegoAudioFrame* zego_audio_frame_create();

    /**
     释放音频帧对象

     @param audio_frame 所有释放的对象
     */
    ZEGOAVKIT_API void zego_audio_frame_destroy(struct ZegoAudioFrame* audio_frame);

    /**
     设置帧数据类型

     @param audio_frame 音频帧
     @param frame_type 帧数据类型,参考 enum ZegoAudioFrameType,默认 kZegoAudioFrameTypePCM
     @return 参考 enum ZegoErrorCode
     */
    ZEGOAVKIT_API int zego_audio_frame_set_frame_type(struct ZegoAudioFrame* audio_frame, enum ZegoAudioFrameType frame_type);

    /**
     获取帧数据类型

     @param audio_frame 音频帧
     @param frame_type 帧数据类型,参考 enum ZegoAudioFrameType,默认 kZegoAudioFrameTypePCM
     @return 参考 enum ZegoErrorCode
     */
    ZEGOAVKIT_API int zego_audio_frame_get_frame_type(/* in */struct ZegoAudioFrame* audio_frame, /* out */enum ZegoAudioFrameType& frame_type);

    /**
     设置采集/渲染配置

     @param audio_frame 音频帧
     @param channels 通道数,支持 1(单声道) 或 2(立体声)
     @param sample_rate 采样率
     @return 参考 enum ZegoErrorCode
     */
    ZEGOAVKIT_API int zego_audio_frame_set_frame_config(struct ZegoAudioFrame* audio_frame, int channels, int sample_rate);

    /**
     获取采集/渲染配置

     @param audio_frame 音频帧
     @param channels 通道数,支持 1(单声道) 或 2(立体声)
     @param sample_rate 采样率
     @return 参考 enum ZegoErrorCode
     */
    ZEGOAVKIT_API int zego_audio_frame_get_frame_config(/* in */struct ZegoAudioFrame* audio_frame, /* out */int& channels, /* out */int& sample_rate);

    /**
     设置采集到/待渲染的数据

     @param audio_frame 音频帧
     @param samples 采样数
     @param data 音频数据,注意:内部不会拷贝数据,需要由调用方管理其生命周期
     @return 参考 enum ZegoErrorCode
     @attention 仅支持 16 比特量化深度
     */
    ZEGOAVKIT_API int zego_audio_frame_set_frame_data(struct ZegoAudioFrame* audio_frame, int samples, unsigned char* data);

    /**
     获取采集到/待渲染的数据

     @param audio_frame 音频帧
     @param samples 采样数
     @param data 音频数据,注意:内部不会拷贝数据,需要由调用方管理其生命周期
     @return 参考 enum ZegoErrorCode
     @attention 仅支持 16 比特量化深度
     */
    ZEGOAVKIT_API int zego_audio_frame_get_frame_data(/* in */struct ZegoAudioFrame* audio_frame, /* out */int& samples, /* out */unsigned char** data);

    /**
     设置 AAC 编码数据属性

     @param audio_frame 音频帧
     @param timestamp 时间戳,如果数据中只有 AAC 配置信息,填 0
     @param data_length 总数据长度,注意 data_length = AAC编码结果长度 + special_config_length
     @param special_config_length AAC 配置信息长度
     @return 参考 enum ZegoErrorCode
     */
    ZEGOAVKIT_API int zego_audio_frame_set_aac_properties(struct ZegoAudioFrame* audio_frame, double timestamp, int data_length, int special_config_length);

    /**
     获取 AAC 编码数据属性

     @param audio_frame 音频帧
     @param timestamp 时间戳,如果数据中只有 AAC 配置信息,填 0
     @param data_length 总数据长度,注意 data_length = AAC编码结果长度 + special_config_length
     @param special_config_length AAC 配置信息长度
     @return 参考 enum ZegoErrorCode
     */
    ZEGOAVKIT_API int zego_audio_frame_get_aac_properties(/* in */struct ZegoAudioFrame* audio_frame, /* out */double& timestamp, /* out */int& data_length, /* out */int& special_config_length);
  • 当 frameType 为 TYPE_PCM 时,各参数的含义说明:
标记 设置方法 获取方法 说明
samples zego_audio_frame_set_frame_data(第二参数) zego_audio_frame_get_frame_data(第二参数) 此帧包含的 PCM 采样数
channels zego_audio_frame_set_frame_config(第二参数) zego_audio_frame_get_frame_config(第二参数) 声道数,取值为 [1, 2]
sampleRate zego_audio_frame_set_frame_config(第三参数) zego_audio_frame_get_frame_config(第三参数) PCM 采集采样率,取值为 [8000, 16000, 22050, 24000, 32000, 44100, 48000]
timeStamp zego_audio_frame_set_aac_properties(第二参数) zego_audio_frame_get_aac_properties(第二参数) 固定为 0,PCM 帧忽略此参数
configLen zego_audio_frame_set_aac_properties(第四参数) zego_audio_frame_get_aac_properties(第四参数) 固定为 0,PCM 帧忽略此参数
bufLen zego_audio_frame_set_aac_properties(第三参数) zego_audio_frame_get_aac_properties(第三参数) buffer 中含有的 PCM 数据长度,单位为字节。对于 PCM 帧:bufLen = 2 x samples x channels
buffer zego_audio_frame_set_frame_data(第三参数) zego_audio_frame_get_frame_data(第三参数) 此时 buffer 中的数据由 PCM 组成。结构如下图

  • 当 frameType 为 TYPE_AAC_STREAM 时,各参数的含义说明如下。
标记 设置方法 获取方法 说明
samples zego_audio_frame_set_frame_data(第二参数) zego_audio_frame_get_frame_data(第二参数) AAC 编码一帧所需要的采样数,取值为 [480, 512, 1024, 1960, 2048]
channels zego_audio_frame_set_frame_config(第二参数) zego_audio_frame_get_frame_config(第二参数) 声道数,取值为 [1, 2]
sampleRate zego_audio_frame_set_frame_config(第三参数) zego_audio_frame_get_frame_config(第三参数) AAC 编码采样率,取值为 [8000, 16000, 22050, 24000, 32000, 44100, 48000]
timeStamp zego_audio_frame_set_aac_properties(第二参数) zego_audio_frame_get_aac_properties(第二参数) 编码时间戳
configLen zego_audio_frame_set_aac_properties(第四参数) zego_audio_frame_get_aac_properties(第四参数) AAC 编码的 audio specific config 长度
bufLen zego_audio_frame_set_aac_properties(第三参数) zego_audio_frame_get_aac_properties(第三参数) buffer 中含有的数据长度,单位为字节
buffer zego_audio_frame_set_frame_data(第三参数) zego_audio_frame_get_frame_data(第三参数) 此时 buffer 中的数据由 aac specific config 和 encode data 组成。结构如下图

关于 buffer 结构:

  1. 如果 configLen == 0,则 buffer 中全部是 aac encode data 数据。
  2. 如果 configLen == bufLen,则 buffer 中全部是 aac specific config 数据。
  3. 如果 (configLen != 0) && (configLen < bufLen),则 buffer 中含有 configLen 长度的 aac specific config 数据和 (bufLen - configLen) 长度的 encode data 数据。

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

2.1 开启外部音频设备

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

zego-api-external-audio-device.h

    /**
     设置推流通道的音源

     @param publish_channel_index 选定推流通道
     @param source_type 音频来源, 详见 ZegoExternalAudioDeviceSourceType 定义
     @return 详见 enum ZegoErrorCode
     @note 必须在开启预览或者启动推流/拉流 前调用才有效
     @note 开发者采用外部采集和渲染后,SDK 内部不负责声音增强、噪音抑制、回音消除等功能,需要用户自己实现
     @note 当 publish_channel_index = 0 时表示主通道, 只支持外部采集方式
     @note 当 publish_channel_index = 1 时表示辅助通道, 支持三种音源模式, 和主推流通道一样, 使用外部采集, 使用媒体播放器的音源
     @note 当 publish_channel_index > 1 时, 当前只支持外部采集方式
     @note 当 source_type 选择 kZegoExternalAudioDeviceSourceTypeNone 时表示关闭外部音源, 主通道使用内部采集音源, 其他通道无音源
     */
    ZEGOAVKIT_API int zego_external_audio_device_set_audio_source(int publish_channel_index, ZegoExternalAudioDeviceSourceType source_type);

2.2 音频外部采集

音频外部采集的接口调用步骤如下图所示:(要换成对应函数)

  1. 调用 zego_external_audio_device_on_record_audio_frame(int publish_channel_index, struct ZegoAudioFrame* audio_frame) 输入采集数据给 SDK 时,audio_frame 只是输入参数
  2. 数据 buffer 内存由外部调用者负责分配和释放,各字段均由外部调用者填写。

2.3 音频外部渲染

音频外部渲染的接口调用步骤如下图所示:(要换成对应函数)

  1. 调用 zego_external_audio_device_on_playback_audio_frame(struct ZegoAudioFrame* audio_frame) 从 SDK 获取可渲染数据时,参数 audio_frame 即为输入参数,也为输出参数。
  2. 数据 buffer 内存由外部调用者负责分配和释放。
  • 当 audioFrame 作为输入参数时,外部渲染模块参数需要按照如下方式填写:
标记 填写
frameType TYPE_PCM
samples 此次渲染帧外部需要的 PCM 数据采样数
channels 需要的声道数,取值 [1, 2]
sampleRate 外部渲染需要的采样率,取值为 [16000, 32000, 44100, 48000]
timeStamp 固定为 0,忽略
configLen 固定为 0,忽略
bufLen 外部已经分配好的 buffer 的长度,单位为字节。buffer 长度应该不小于 2 x samples x channels
buffer 外部已经分配好的 buffer
  • 当 audioFrame 作为输出参数时,SDK 会按照外部渲染要求填充好 buffer 中的数据,会修改 bufLen = 2 x samples x channels,其他字段不变。
本篇目录
  • 免费试用
  • 提交工单
    咨询集成、功能及报价等问题
    电话咨询
    400 1006 604
    咨询客服
    微信扫码,24h在线

    联系我们

  • 文档反馈