互动视频
  • iOS : Objective-C
  • Android
  • macOS
  • Windows
  • Linux
  • Web
  • 小程序
  • Electron
  • 概述
  • 限制说明
  • SDK 下载
  • 快速开始
  • 常用功能
  • 推拉流进阶
  • 视频进阶
  • 音频进阶
  • 其他功能
  • 废弃接口
  • API 文档
  • 常见错误码
  • 常见问题
  • AI教育
  • KTV 合唱
  • 视频直播
  • 视频通话
  • 游戏直播
  • 直播答题
  • 娃娃机
  • 文档中心
  • 互动视频
  • 音频进阶
  • 混音中带媒体次要信息

混音中带媒体次要信息

更新时间:2022-08-18 14:29

1 功能简介

ZegoLiveRoom SDK 为开发者提供了混音功能。

混音是指,SDK 从 App 获取一路音频数据,将其与采集的音频数据,整合为一路混音数据,进而推流。

直播过程中的掌声,口哨,背景音等音效均可通过混音实现。

混音的过程中可以带有(不能大于 1000 Bytes)媒体次要信息。

2 步骤

混音的使用流程如下:

  1. App 启用混音功能

  2. App 设置混音音量

  3. App 设置媒体次要信息开关(如果不需要发送媒体次要信息,可不用设置,默认为关闭)

  4. App 将混音数据中带有媒体次要信息传递给 SDK

2.1 启用混音功能

调用此 API 启用混音功能。

zego-api-audio-aux-oc.h

/**
 混音开关

 @param enable true 启用混音输入,false 关闭混音输入。默认 false
 @return true 成功,false 失败
 @attention 必须确保在 initSDK 后调用
 @note 主播端开启混音后,SDK 在 [ZegoLiveRoomApi (Publisher) -onAuxCallback:dataLen:sampleRate:channelCount:] 中获取混音输入数据
 */
- (bool)enableAux:(BOOL)enable;

请注意,后续操作均基于开启混音功能的基础上。

2.2 设置混音音量

启用混音后,调用此 API 调整混音音量。

ZegoLiveRoomApi-Publisher.h

/**
 设置混音音量

 @param volume 0~100,默认为 50
 */
- (void)setAuxVolume:(int)volume;

也可调用此 API 设置混音静音。

ZegoLiveRoomApi-Publisher.h

/**
 混音静音开关

 @param bMute true: aux 输入播放静音,false: 不静音。默认 false
 @return true 成功,false 失败
 @attention 推流开始前调用本 API 进行参数配置
 */
- (bool)muteAux:(bool)bMute;

请注意,SDK 对上述两个混音音量相关的 API 的调用时机无要求,混音前或混音后调用均可,取决于用户需求。

2.3 App 设置媒体次要信息开关(如果不需要发送媒体次要信息,可不用设置,默认为关闭)

启用混音后,如果需要传递媒体次要信息,则需要开启媒体次要信息开关,如果不需要发送媒体次要信息 则可以不用开启,默认为不开启

ZegoLiveRoomApi-Publisher.h

/**
发送媒体次要信息开关

@param start true 开启媒体次要信息传输, false 关闭媒体次要信息传输。start 为 true 时,onlyAudioPublish 开关才有效
@param onlyAudioPublish true 纯音频直播,不传输视频数据,false 音视频直播,传输视频数据。默认为 false。如果本次只有音频直播,必须将 onlyAudioPublish 置为 true,此时会由音频来驱动次要信息的传输,同时忽略视频流传输
@discussion 初始化 SDK 后,开始推流前调用。
*/
- (void)setMediaSideFlags:(bool)start onlyAudioPublish:(bool)onlyAudioPublish;

请注意,SDK 如果需要在混音功能中发送媒体次要信息,必须要开启媒体次要信息开关才能发送成功。

2.4 App 将混音数据中带有媒体次要信息传递给 SDK

启用混音后,SDK 通过此 API 获取待传递的混音数据和媒体次要信息

zego-api-audio-aux-oc.h

/** 混音音频数据输入回调。
当开启混音后,通过此回调获取混音音频数据。
注意:
1. 支持 16k 32k 44.1k 48k 采样率、单声道或者双声道、16位深的PCM 音频数据;
2. 用户根据实际填写采样率及声道数;
3. 为确保混音效果,请不要在此 API 中执行耗时操作
@param pDataLen
*pDataLen既是输入参数也是输出参数;
作为输入参数,SDK会提供好长度值,用户按照这个长度写入数据即可,数据足够的情况下,无需更改*pDataLen的值
作为输出参数,如果填写的数据不足SDK提供的长度值,则赋值*pDataLen = 0;
或者最后的尾音不足SDK提供的长度值,可以用静音数据补齐。
@param pSampleRate 混音数据采样率,支持16k、32k、44.1k、48k
@param pNumChannels 混音数据声道数,支持1、2
@param pSideInfo 媒体次要信息数据缓冲区地址
@param pSideInfoLength 媒体次要信息数据缓冲区长度
@param bPacket  媒体次要信息数据是否外部已经打包好包头
@attention 用户调用该 API 将混音数据传递给 SDK
@note 混音数据 bit depth 必须为 16
*/
- (void)onAuxCallback:(void *)pData dataLen:(int *)pDataLen sampleRate:(int *)pSampleRate channelCount:(int *)pChannelCount sideInfo:(unsigned char*)pSideInfo sideInfoLen:(int*) pSideInfoLength packet:(bool*)pPacket

示例代码片段如下: 示例代码中pcm文件采样率为:44100 声道数为: 2

ZegoLiveViewController.m

- (void)onAuxCallback:(void *)pData dataLen:(int *)pDataLen sampleRate:(int *)pSampleRate channelCount:(int *)pChannelCount sideInfo:(unsigned char*)pSideInfo sideInfoLen:(int*) pSideInfoLength packet:(bool*)pPacket
{
    if (self.auxData == nil)
    {
        //初始化auxData
        NSURL *auxURL = [[NSBundle mainBundle] URLForResource:@"a.pcm" withExtension:nil];
        if (auxURL)
        {
            self.auxData = [NSData dataWithContentsOfURL:auxURL options:0 error:nil];
            self.pPos = (void *)[self.auxData bytes];
        }
    }

    if (self.auxData)
    {
        int nLen = (int)[self.auxData length];
        if (self.pPos == 0)
            self.pPos = (void *)[self.auxData bytes];

        const void *pAuxData = [self.auxData bytes];
        if (pAuxData == NULL)
            return;

        *pSampleRate = 44100;
        *pChannelCount = 2;

        int nLeftLen = (int)(pAuxData + nLen - self.pPos);
        if (nLeftLen < *pDataLen) {
            self.pPos = (void *)pAuxData;
            *pDataLen = 0;
            return;
        }

        memcpy(pData, self.pPos, *pDataLen);
        self.pPos = self.pPos + *pDataLen;
    }
    //------带有媒体次要信息示例代码-------
    //注意: 发送媒体次要信息前提必须要带有混音数据
    //需要发送的信息
    Byte mediaSideInfo[] ={0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69};
    //媒体次要信息长度
    *pSideInfoLength = 10;
    //是否外部已经打包好包头, true:已打包, false:未打包
    *pPacket=false;
    memcpy(pSideInfo, mediaSideInfo, *pSideInfoLength);
}

请注意:

  1. 以上演示的是循环播放音频,请开发者按照各自的需求实现该方法,不要直接复制。
  2. 如果数据足够,则copy pDataLen长度的数据到pData,如果不足要不补齐静音到SDK指定的pDataLen长度,要不设置 *pDataLen = 0。
本篇目录