Talk 场景方案

语音电台

场景概述

语音电台即主播模式目前主要应用于大型MMO类游戏。在用户进入游戏界面时,就可以看到语音房间的入口。因一个游戏内可能有多个房间,如主播房间、国家指挥房间、帮派指挥房间等,入口通常会用菜单选项表示,便于用户切换。主播和指挥房间通常由游戏根据主播、国家指挥等身份已设定好,通常为固定的房间号。主播使用游密提供的主播工具进行语音直播,听众端集成游密IM SDK+Talk SDK。

下述为语音电台听众端的接口调用流程,前提是保证Talk SDK 和IM SDK都已经正确添加导入到项目工程中,并可以正常调用SDK 中的API接口。

听众端

Step1.注册SDK回调和进行SDK初始化,登录

  1. 设置Talk SDK 回调(SetCallback)用于接收回调消息,这个函数必须最先调用:
    void SetCallback(string strObjName);
  2. 监听OnEvent事件,用于接收各接口的回调结果:

    void OnEvent()
  3. 初始化Talk SDK ,游戏启动时即可调用游密初始化,Talk的SDK和IM的SDK都需要先初始化。调用的接口为:YouMeVoiceAPI.GetInstance().init(strAppKey,strSecrect,serverZone,"")
    IM SDK的 IMAPI.Instance().init(strAppKey,strSecrect,serverZone)

参数说明
strAppKey:从游密后台申请到的 app key, 这个是你们应用程序的唯一标识。
strSecrect:对应 strAPPKey 的私钥, 这个需要妥善保存,不要暴露给其他人。
serverZone:设置首选连接服务器的区域码。

  1. 注册IM SDK的回调监听:根据业务需求监听所需要的相应回调: SetMessageCallback

    public void SetLoginListen(YIMEngine.LoginListen listen);   //登录和登出
    public void SetMessageListen(YIMEngine.MessageListen listen);  //设置消息回调
    public void SetChatRoomListen(YIMEngine.ChatRoomListen listen);  //设置聊天室回调
    public void SetDownloadListen(YIMEngine.DownloadListen listen) ;  //设置下载回调
    public void SetContactListen (YIMEngine.ContactListen listen); //(可选)  设置联系人回调
    public void SetNoticeListen(NoticeListen listen); //(可选) 设置公告回调
    public void SetAudioPlayListen(AudioPlayListen listen);   //设置语音播放回调
    public void SetLocationListen(LocationListen listen); //(可选)  设置地理位置回调
    public void SetReconnectListen(ReconnectListen listen); //(可选)设置重连回调
    public void SetFriendListen(FriendListen listen); //(可选)设置好友回调
    public void SetUserProfileListen (UserProfileListen listen); //(可选)设置用户信息回调
  2. IM 需要先登录之后才能调用IM的其他接口。登录:Login
    public ErrorCode Login(string strYouMeID,string strPasswd,string strToken="");

    参数说明
    strYouMeID:用户ID,由调用者分配,不可为空字符串,只可由字母或数字或下划线组成,长度限制为255字节。
    strPasswd:用户密码,不可为空字符串,如无特殊要求可以设置为固定字符串。
    strToken:使用服务器token验证模式时使用该参数,否则使用默认值""即可,由restAPI获取token值。

Step2.加入频道

Talk SDK:主播和听众需要加入同一个语音频道,主播端通过主播工具启动麦克风开启说话,听众端以听众的身份加入,不启用麦克风,而是打开扬声器收听; IM SDK:主播和听众加入到同一个群聊频道,用于接收和发送消息,听众可以在游戏端向主播发送文字消息或者礼物消息。
调用接口:
joinChannleSingleMode :加入主播语音频道(Talk)
JoinChatRoom:加入主播的文本群聊频道(IM)

Step3 听众端发送消息或礼物

  1. 听众端发送消息,主播端收看。用于在语音直播中,听众端发送文字消息,类似弹幕到群聊频道中,主播在主播工具中接收显示。 发送文本消息:SendTextMessage

  2. 听众端发送礼物消息,礼物发送如果需要统计积分需要在后台处配置礼物细信息,配置步骤见下“运营管理平台-使用说明-配置礼物信息”,比如听众需要给主播打赏礼物,发送棒棒糖、火箭等礼物。 发送礼物消息:SendGift
    public ErrorCode SendGift(string strAnchorId,string strChannel,int iGiftID,int iGiftCount,ExtraGifParam extParam,ref ulong serial)

    参数说明
    strAnchorId:主播的userid,也就是后台配置的主播账号。
    strChannel:主播所在的IM频道。
    iGiftID:后台"主播管理"里面的"礼物配置"里面对应的礼物标识,0表示只是留言。
    iGiftCount:礼物物品数量。
    extParam: 扩展内容,参考ExtraGifParam类熟悉说明 extParam为必填参数,且必须进行初始化赋值,以免发送的礼物消息数据没入库统计
    serial: 消息序列号。

示例

ExtraGifParam extraGifParam = new ExtraGifParam();
extraGifParam.NickName = "测试名";
extraGifParam.ServerArea = "99服";
extraGifParam.Location = "1区";
extraGifParam.Score = 50000;
extraGifParam.Level = 1;
extraGifParam.VipLevel = 3;
extraGifParam.Extra = "";
ErrorCode errorCode =  IMAPI.Instance().SendGift("主播id", "IM频道", 2, 2, extraGifParam,ref serial);

返回值
如果成功返回YOUME_SUCCESS,否则返回错误码,具体请参考YouMeErrorCode类型定义。

主播端

使用主播工具进行登录

主播工具登录

使用主播工具进行上播

主播

运营管理平台

功能简介

游密“运营管理平台”内嵌于游密官网控制台的游戏界面,功能包含主播配置、禁言管理、关键字管理等。 路径:游密官网控制台 https://console.youme.im/ 访问:游戏-运营管理平台。

如何开通

运营管理平台功能入口默认为关闭状态,需在游密 QQ 群或向游密商务人员申请开放入口,服务价格请联系游密商务。

使用说明

主播配置: 主播配置

添加主播账号:注意:主播游戏ID需要和主播账号一致性: 添加账号

添加主播的功能主要是创建主播账号和密码,用于主播登录主播助手(Windows 客户端工具)和主播消息助手(页面):

主播频道添加

添加主播排班:

主播排班配置

选择要上播的主播和上播的频道: 添加主播排班

配置礼物信息: 听众端需要给主播打赏礼物时,发送的礼物消息,需要先在这里配置礼物信息,发送的礼物消息才能会把积分统计到数据表中。 配置礼物信息

查询主播、礼物等信息(服务端RestAPI接口)

公共部分:
appkey:app在游密通信云注册申请的appkey,可在游密后台进行查看。
identifier:用户名标识,调用REST API一般为app管理员账号,如“admin”。
curtime:当前UTC时间戳,从1970年1月1日0点0分0秒开始到现在的秒数(string类型)。
checksum:sha1(appsecret + curtime),两个参数拼接的字符串,进行sha1计算,转化成16进制字符(string,小写)。其中appsecret可在游密后台进行查看。
注:
checksum有效期:出于安全考虑,每个checksum有效期为5分钟,建议每次请求都生成新的checksum,同时服务器进行NTP同步时间。

主播功能分为“中国大陆”和“新加坡”两个区域。两个区域数据不互通。
接口的域名跟着的服务区域进行变化,具体如下:
中国大陆 接口域名:api.youme.im
新加坡 接口域名:sgapi.youme.im
下面的具体接口说明,均以中国大陆为例。

查询主播基本信息

查询主播基本信息。

  • 请求URL
    https://api.youme.im/v1/im/query_anchor_info?appkey=123456789&identifier=admin&curtime=123456789&checksum=123456789abcdefg
  • header

    Content-Type: application/json
  • body

    {
    "UserID": "wrqw",
    "AnchorID": "juzi"
    }

    body为json格式,各个字段解释如下:
    UserID: 主播用户游戏ID,app内唯一,字符串。
    AnchorID: 主播用户在游密控制台上的登录账号名,字符串。
    以上两个用户信息至少给定一个。

  • 响应
    {
    "Nickname" : "wqerw",
    "ProfilePhoto" : "https://sl.youme.im/f1d42a6f57c68da44d7a6b3c656e83fc.png",
    "Signature" : "个性签名",
    "UserID": "wrqw",
    "AnchorID": "juzi"
    }

    Nickname: 昵称。
    ProfilePhoto: 头像。
    Signature: 签名。

查询多个主播基本信息

查询多个主播基本信息。

  • 请求URL
    https://api.youme.im/v1/im/query_multi_anchor_info?appkey=123456789&identifier=admin&curtime=123456789&checksum=123456789abcdefg
  • header

    Content-Type: application/json
  • body

    {
    "UserList" : [
    {
        "UserID": "1133"
    }]
    }

    body为json格式,各个字段解释如下:
    UserList: 可选字段,主播用户列表,为空数组时返回所有主播用户列表,数组。
    UserID: 主播用户游戏ID,app内唯一,字符串。
    UserSeq: 可选字段,"UserList"为空时有效,主播用户序列号,首次获取时置0。
    Limit: 可选字段,"UserList"为空时有效,拉取主播用户个数限制。

  • 响应
    {
    "UserList" : [
      {
         "NickName" : "请问",
         "ProfilePhoto" : "https://sl.youme.im/f1d42a6f57c68da44d7a6b3c656e83fc.png",
         "Signature" : "个性签名",
         "UserID" : "1133",
         "AnchorID": "taozi"
      }
    ]
    }

    UserList:用户列表。
    Nickname: 昵称。
    ProfilePhoto: 头像。
    Signature: 签名。

查询主播积分

根据时间段查询主播某天收到的积分信息或积分排行榜。

  • 请求URL
    https://api.youme.im/v1/im/query_im_user_score_rank?appkey=123456789&identifier=admin&curtime=123456789&checksum=123456789abcdefg
  • header

    Content-Type: application/json
  • body实例1

    {
    "UserID":"wrqw",
    "Date":"20170420",
    "Limit": 5,
    "NeedFavoriteAnchor": 1
    }

    body为json格式,各个字段解释如下:
    UserID:主播用户ID,app内唯一,字符串。
    Date:日期,格式为YYYYMMDD
    Summary:可选字段,是否汇总信息。
    SvrArea:可选字段,用户区服,查询积分排行榜时有效。
    Limit:可选字段,最大信息条数(大于0,不大于200),查询积分排行榜时有效。
    NeedFavoriteAnchor: 是否需要返回排行榜中每个用户对应的送礼物最多的主播信息,1是需要返回,其它值不需要,整数,可选字段,查询积分排行榜时有效。

  • 响应实例1

    {
    "ScoreCount" : 2,
    "ScoreList" : [
      {
        "Score" : "10000",
        "GiftCount" : "100",
        "SendID" : "luffy",
        "NickName": "nick2",
        "SvrArea":  "area2",
        "Location": "loca2",
        "FavoriteAnchor": [
                {
                    "AnchorID": "anchor03",
                    "GiftCount": 30,
                    "GiftScore": 1920
                }
            ]
      },
      {
        "Score" : "999",
        "GiftCount" : "100",
        "SendID" : "sanji",
        "NickName": "nick1",
        "SvrArea":  "area1",
        "Location": "loca1",
        "FavoriteAnchor": [
                {
                    "AnchorID": "anchor01",
                    "GiftCount": 20,
                    "GiftScore": 500
                }
            ]
      }
    ]
    }

    ScoreCount:积分总数。
    ScoreList:积分对象列表,最多200条。
    NickName:用户昵称。
    Location:用户阵营。
    FavoriteAnchor:是该用户送礼物最多的主播信息。
    AnchorID:是接收礼物的主播ID,GiftScore:是主播收到的礼物积分,GiftCount:是主播收到的礼物个数)。
    若用户送礼物最多的有好几个主播,则一并返回(最多返回10个)。

  • body实例2

    {
    "UserID":"wrqw",
    "Date":"20170420",
    "Summary" : "1"
    }
  • 响应实例2
    {
    "GiftTotal" : "123",
    "Score" : "10999"
    }

    GiftTotal:礼物总数 Score: 积分总数

获取主播用户的排班时间

根据频道ID、日期和主播用户ID查询主播用户排班信息。

  • 请求URL
    https://api.youme.im/v1/im/query_anchor_sche?appkey=123456789&identifier=admin&curtime=123456789&checksum=123456789abcdefg
  • header

    Content-Type: application/json
  • body

    {
    "ChannelID": "2011234",
    "Date": "20170420",
    "AnchorID" : "user1"
    }

    body为json格式,各个字段解释如下:
    ChannelID: 用户所在频道ID,字符串,必填参数。
    Date: 日期,字符串,格式为YYYYMMDD,可选参数。当未指定时,则查询当天日期的排班信息(注:查询时隐含只查询出排班还未过期的排班信息,即排班开始时间大于查询时间,或者排班结束时间大于查询时间)。
    AnchorID: 主播用户ID,字符串,选填,不填时拉取到的是该频道的所有主播排班信息。

  • 响应
    {
    "ActionStatus" : "OK",
    "ErrorCode" : 0,
    "ErrorInfo" : "",
    "Sche" : [
      {
        "ChannelID" : "2011234",
        "AnchorID" : "user1",
        "Date" : "20170420",
        "BeginTime" : "17:00:00",
        "EndTime" : "18:00:00",
    "GameID" : "u#123456"
      }
    ]
    }

    GameID:主播用户的游戏ID

查询指定组合条件的礼物积分

根据发送礼物的用户ID、主播用户ID、区服名、频道ID查询满足条件的礼物积分。

  • 请求URL
    https://api.youme.im/v1/im/query_im_gift_score?appkey=123456789&identifier=admin&curtime=123456789&checksum=123456789abcdefg
  • header

    Content-Type: application/json
  • body

    {
    "StartDate": "20170517",
    "EndDate": "20170517",
    "UserID": "user1"
    }

    body为json格式,各个字段解释如下:
    StartDate: 查询起始日期,字符串,格式为YYYYMMDD,起始日期若给定,则与当前自然日期相比不可以往前超过35天,可选字段。
    EndDate: 查询结束日期,字符串,格式为YYYYMMDD,可选字段。
    注:若StartDate和EndDate同时不给定,则查询历史累积至当前自然日期的。
    UserID: 发送礼物的用户ID,字符串,可选字段。
    AnchorID: 收到礼物的主播用户ID,字符串,可选字段。
    SvrArea: 频道所在区服名,字符串,可选字段。
    ChannelID: 频道ID,字符串,可选字段。

  • 响应
    {
    "NickName": "nick1",
    "Location": "loca1",
    "GiftScore": 1000,
    "GiftCount": 50
    }

    NickName:用户昵称。
    Location:用户阵营。
    GiftCount:礼物个数。
    GiftScore:礼物积分。

查询指定组合条件的礼物积分排行榜

根据接收礼物的主播用户ID、区服名、频道ID查询满足条件的礼物积分排行榜。

  • 请求URL
    https://api.youme.im/v1/im/query_im_gift_score_rank?appkey=123456789&identifier=admin&curtime=123456789&checksum=123456789abcdefg
  • header

    Content-Type: application/json
  • body

    {
    "StartDate": "20170517",
    "EndDate": "20170517",
    "Limit": 10,
    "NeedFavoriteAnchor":  1
    }

    body为json格式,各个字段解释如下:
    StartDate: 查询起始日期,字符串,格式为YYYYMMDD,起始日期若给定,则与当前自然日期相比不可以往前超过35天,可选字段。
    EndDate: 查询结束日期,字符串,格式为YYYYMMDD,可选字段。
    注:若StartDate和EndDate同时不给定,则查询历史累积至当前自然日期的。
    AnchorID: 收到礼物的主播用户ID,字符串,可选字段。
    SvrArea: 频道所在区服名,字符串,可选字段。
    ChannelID: 频道ID,字符串,可选字段。
    OrderBy: 排序字段,1是按礼物积分排序,2是按礼物个数排序,不携带时默认按照礼物积分排序,整数,可选字段。
    Limit: 返回排行榜记录的最大条数,默认值50,最大200,整数,可选字段。
    NeedFavoriteAnchor: 是否需要返回排行榜中每个用户对应的送礼物最多的主播信息,1是需要返回,其它值不需要,整数,可选字段。

  • 响应
    {
    "RankCount": 2,
    "RankList": [
        {
            "UserID": "user2",
            "NickName": "nick2",
            "SvrArea":  "area2",
            "Location": "loca2",
            "GiftScore": 1060,
            "GiftCount": 20,
            "FavoriteAnchor": [
                {
                    "AnchorID": "anchor03",
                    "GiftCount": 10,
                    "GiftScore": 932
                }
            ]
        },
        {
            "UserID": "user1",
            "NickName": "nick1",
            "SvrArea":  "area1",
            "Location": "loca1",
            "GiftScore": 1050,
            "GiftCount": 20,
            "FavoriteAnchor": [
                {
                    "AnchorID": "anchor02",
                    "GiftCount": 15,
                    "GiftScore": 980
                }
            ]
        }
    ]
    }

    RankCount:排行榜列表个数。
    NickName:用户昵称。
    Location:用户阵营。
    FavoriteAnchor:该用户送礼物最多的主播信息。
    AnchorID:接收礼物的主播ID,GiftScore:主播收到的礼物积分,GiftCount:主播收到的礼物个数)。
    若用户送礼物最多的有好几个主播,则一并返回(最多返回10个)。

查询主播监控信息

查询指定频道的主播用户在其排班内的上麦时长、接收礼物积分以及相关的进出频道、开关麦克风等信息。

  • 请求URL
    https://api.youme.im/v1/im/query_anchor_monitor?appkey=123456789&identifier=admin&curtime=123456789&checksum=123456789abcdefg
  • header

    Content-Type: application/json
  • body

    {
    "Date": "20170605",
    "ChannelID": "1234",
    "AnchorID": "gameid",
    "NeedActionDetail": 1
    }

    body为json格式,各个字段解释如下:
    Date:查询日期,格式为YYYYMMDD,字符串。
    ChannelID:主播频道ID,字符串。
    AnchorID:主播用户ID,字符串。
    NeedActionDetail:是否需要返回操作详情信息(指主播进出频道和开关麦克风的时间信息),1是需要返回,其他值不返回,整数。

  • 响应
    {
    "Date": "20170605",
    "ChannelID": "1234",
    "AnchorID": "gameid",
    "NickName": "nickname",
    "MicDuration": 60,
    "GiftScore": 1000,
    "ActionDetail": [
        {
            "ActionTime": "14:00:01",
            "ActionType": 1
        },
        {
            "ActionTime": "14:30:00",
            "ActionType": 2
        },
        {
            "ActionTime": "14:00:05",
            "ActionType": 3
        },
        {
            "ActionTime": "14:20:00",
            "ActionType": 4
        },
        {
            "ActionTime": "14:22:00",
            "ActionType": 3
        }
        {
            "ActionTime": "14:29:00",
            "ActionType": 4
        }
    ]
    }

    NickName:主播用户昵称。
    MicDuration:上麦时长。
    GiftScore:礼物积分。
    ActionTime:操作时间。
    ActionType:操作类型,取值有1(进入频道)、2(退出频道)、3(开启麦克风)、4(关闭麦克风)。

查询主播的礼物积分排行榜

本接口只针对主播用户,查询所有主播用户所收到的礼物积分排行榜。

  • 请求URL
    https://api.youme.im/v1/im/query_anchor_score_rank?appkey=123456789&identifier=admin&curtime=123456789&checksum=123456789abcdefg
  • header

    Content-Type: application/json
  • body

    {
       "StartDate": "20170702"
    }

    body为json格式,各个字段解释如下:
    StartDate: 查询起始日期,字符串,格式为YYYYMMDD,起始日期若给定,则与当前自然日期相比不可以往前超过35天,必选字段。
    EndDate: 查询结束日期,字符串,格式为YYYYMMDD,可选字段。
    SvrArea: 频道所在区服名,字符串,可选字段。
    ChannelID: 频道ID,字符串,可选字段。
    OrderBy: 排序字段,1是按礼物积分排序,2是按礼物个数排序,不携带时默认按照礼物积分排序,整数,可选字段。
    Limit: 返回排行榜记录的最大条数,默认值50,最大200,整数,可选字段。

  • 响应
    {
    "RankList":[
        {
            "AnchorID": "taozi",
            "GameID": "u#52235",
            "NickName": "陶子",
            "GiftScore": 106,
            "GiftCount": 25
        },
        {
            "AnchorID": "juzi",
            "GameID": "u#45331",
            "NickName": "橘子",
            "GiftScore": 97,
            "GiftCount": 15
        }
    ]
    }

获取主播频道

根据游戏应用ID查询主播频道。

  • 请求URL
    https://api.youme.im/v1/im/query_anchor_channel?appkey=123456789&identifier=admin&curtime=123456789&checksum=123456789abcdefg
  • header

    Content-Type: application/json
  • body

    {
    "AppID" : 111
    }

    body为json格式,各个字段解释如下:
    AppID: 游戏应用ID,int。

  • 响应
    {
    "ActionStatus" : "OK",
    "ErrorCode" : 0,
    "ErrorInfo" : "",
    "Channel" : [
      {
        "CID" : "test",           //频道ID
        "CName" : "user1"  //频道名称
        "Areaid" : "01,02,03",           //区服   ID
        "Imid" : "123"  //关联IM频道ID
      }
    ]
    }

查询指定组合条件的礼物积分详情

根据主播用户ID、开始时间、结束时间查询满足条件的礼物积分详情。

  • 请求URL
    https://api.youme.im/v1/im/query_im_gift_score_detail?appkey=123456789&identifier=admin&curtime=123456789&checksum=123456789abcdefg
  • header

    Content-Type: application/json
  • body

    {
    "StartDate": "20210326",
    "EndDate": "20210326",
    "AnchorID": "anchor1"
    }

    body为json格式,各个字段解释如下:
    StartDate: 查询起始日期,字符串,格式为YYYYMMDD,起始日期若给定,则与当前自然日期相比不可以往前超过35天,必选字段。
    EndDate: 查询结束日期,字符串,格式为YYYYMMDD,必选字段。
    注:若StartDate和EndDate同时不给定,则查询历史累积至当前自然日期的。
    AnchorID: 收到礼物的主播用户ID,字符串,必选字段。

  • 响应
    {
    "Count": 1,
    "GiftScoreList" : [
      {
        "AnchorID": "anchor1"        //主播ID
        "GiftID" : "123",           //礼物ID
        "GiftName" : "小礼包"  //礼物名字
        "GiftScore" : 1,           //单个礼物的积分
        "GiftCount" : 10,        //礼物总数
        "GiftTotalScore" : 10,  //礼物总积分
        "GiftDate" : "2020-05-31"     //礼物日期
      }
    }

    Count:返回礼物详情的个数。
    GiftID:礼物id。
    GiftName:礼物名字。
    GiftScore:单个礼物积分。
    GiftCount:礼物是总数。
    GiftTotalScore:礼物的总积分。
    GiftDate:礼物统计时间。

FAQ

  1. IM SDK的sendTextMessage接口如何传参数,可以在“主播工具-首页-游密主播消息助手-礼物与消息”中显示“消息”的昵称、等级、服务器等信息?

    打开主播工具-点击右上角“自定义消息”,在自定义消息中设置json格式的解析,然后在客户端IM SDK中调用sendTextMessage接口时,将msgContent参数设置为该json格式的文本内容。 附1:自定义消息中设置json格式的解析

    function (jdata){
    var obj = JSON.parse(jdata);
    var result = {
    "uid" :false,
    "uname" :obj.uname,
    "vip" : obj.vip,
    "text" :obj.text,               //消息
    "server":obj.server,        //服务器
    "level" :obj.level,     
    "local":obj.local           //大区
    };
    return result;
    }

    附2:IM SDK中调用sendTextMessage代码示例:

    String mMessageContent="{\"uname\":\"kitty\",\"text\":\"hello\"}";
    YIMClient.getInstance().sendTextMessage(recver,YIMConstInfo.ChatType.RoomChat mMessageContent,attachParam:"",new YIMEventCallback.ResultCallback<SendMessage>(){..})
  2. IM SDK的sendGift接口如何传参数,可以在“主播工具-首页-游密主播消息助手-礼物与消息”中显示“礼物”的昵称、礼物、服务器等信息?

    在sendGift接口的第五个参数yimExtraGifparam处传值,主播工具会解析。

    YIMExtraGifParam yimExtraGifParam = new yimExtraGifParam(nickName:"hello",serverArea:"ch",location:"",(long)1,level:1,vipLevel:1,extparam:"等级:1");
    YIMClient.getInstance().sendGift(anchorid:"cwwu123",channel:"123456",giftid:1,giftCount:5,yimExtraGifParam,new YIMEventCallback.ResultCallback<SendMessage>(){...})
  3. 调用发送礼物接口sendGift时报错,errorcode为无效参数。

    检查sendGift接口的第五个参数yimExtraGiftParam,需对其进行初始化并赋值,可参考上面第2个问题的答案中的代码。

  4. 两部手机放一起时有很大的啸叫声有没有什么办法消除或者降低呢?

    通常是因为两台手机靠得太近,麦克风相互循环增益导致的,建议测试时把两台设备放远一些,或者调低音量。

  5. 使用主播工具点击播放战歌,但是自己听不到bgm。

    需要开启监听,点击主播工具右上角的“本地战歌使用”,会出现监听。

  6. 使用主播工具,是否还需要处理主播端的接口,比如播放战歌等?

    不需要,主播工具中已集成“播放战歌”接口。

实时语音通话

场景概览

游密Talk SDK可以实现一对一、一对多、多对多的实时通话功能;在相同频道内的用户可自由发言和收听;适用于语音通话、多人语音群聊等场景。

功能列表

主要功能 功能描述
自由语音互动 用户可以自由加入/退出进行语音互动
语音检测 可检测当前用户是否在说话
变声 用户可以自由变音
混响效果 可增加混响音效,提高用户体验感

快速开始

开发环境要求

  • Android Studio 3.0及以上
  • 两台真机,用于模拟两个用户进行语音通话
  • 到官网注册账号、并添加应用产品以获得相关到AppKey、AppSecret参数

Android Studio 开发环境集成

  1. 将SDK内到lib文件夹所有文件移至Android工程到libs文件夹下(可视实际项目情况自行放置,但需要确保能正确导入到工程内)

  2. SDK文件包含如下:
SDK文件 jar包 / so库
libs youme_voice_engine.jar
libs android-support-v4.jar
arm64-v8a libyoume_voice_engine.so
armeabi libyoume_voice_engine.so
armeabi-v7a libyoume_voice_engine.so
x86 libyoume_voice_engine.so
x86_64 libyoume_voice_engine.so
  1. AndroidManifest.xml配置
    添加需要的录音和网络相关权限:

    uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
  2. 反混淆配置 YOUMESDK不需要混淆,如果你的工程有混淆 请在proguard-rules.pro文件中添加如下代码:

    -keep class com.youme.**{*;}
    -keepattributes Signature
  3. 设置加载so库以及启动相关服务,在入口Activity类先导入package:

    import com.youme.voiceengine.mgr.YouMeManager;
    
    /// 需要在onCreate 方法里添加如下代码:必须加在onCreate前面,以免部分机型加载so库有问题
    
    YouMeManager.Init(this);
    
    super.onCreate(savedInstanceState);

示例代码

import com.youme.voiceengine.*;
import com.youme.voiceengine.mgr.YouMeManager;

api.SetCallback(YouMeCallBackInterface callBack);           //设置回调
api.init (strAPPKey, strAPPSecret, serverRegionId, strExtServerRegionName);  //初始化SDK
api.joinChannelSingleMode (strUserID, strRoomID, userRole, bCheckRoomExist); //加入语音频道
api.setMicrophoneMute (false));                            //用户打开麦克风
api.setSpeakerMute (false);                                 //用户打开扬声器
api.leaveChannelAll ();                                   //退出语音频道
public void onEvent (int event, int error, String channel, Object param) {
    if (event == YouMeConst.YouMeEvent.YOUME_EVENT_INIT_OK) {
        Log.i(CommonDefines.LOG_TAG, "初始化成功,请加入频道," + "param:" + param);
    }
}

语音通话场景实现流程

调用流程时序图

时序图

核心调用API

初始化流程
接口 含义
api.SetCallback(YouMeCallBackInterface callBack) 注册回调(event、memberchange等)
api.init 引擎初始化,区域参数使用app发版地区对应的区域参数,若需要全球互通,可联系游密相关人员配置开通
  • 调用示例:
    api.SetCallback(this);     //设置回调监听对象,需要implement YouMeCallBackInterface
    api.init("Appkey", "strAPPSecret", YOUME_RTC_SERVER_REGION.RTC_CN_SERVER, "");      //只有appkey,appsecret,serverRegionId 都一样时,才可以进行语音互通,改任意一个视为另外一个区服;
加入/退出房间流程
接口 含义
api.joinChannelSingleMode 加入房间,建议 role建议设置为1,autoRecv设为fasle
api.leaveChannelAll 退出所有房间
本地设备控制接口

收到加入房间成功JOIN_OK事件后可设置:

接口 含义
api.setMicrophoneMute 设置麦克风状态
api.setSpeakerMute 设置扬声器状态
api.setAutoSendStatus 设置是否通知别人麦克风和扬声器的开关,设置后用户开关麦克风或者扬声器都会通知到同频道到其他用户
api.setUseMobileNetworkEnabled 设置是否允许使用移动网络
api.setReleaseMicWhenMute 设置当麦克风静音时,是否释放麦克风设备,(需要在初始化成功后,加入房间之前调用)
通话管理
  • 在用户切到后台或者要收听电话时,可调用暂停通话;以便释放麦克风等设备资源的占用,当切换会前台时,可以调用恢复通话接口用于继续通话
接口 含义
api.pauseChannel 暂停通话
api.resumeChannel 恢复通话

设置回调监听

引擎底层对于耗时操作都采用异步回调的方式,函数调用会立即返回,操作结果java层会同步回调。因此,用户必须实现相关接口并在初始化前通过 api.SetCallback(this) 注册接收回调通知的对象。

使用类需要implements接口YouMeCallBackInterface,并实现该接口下的所有回调函数。回调都在子线程中执行,不能用于更新UI等耗时操作。

  • 首先要导入相关的包:
  import com.youme.voiceengine.MemberChange;
  import com.youme.voiceengine.YouMeCallBackInterface;
  • 然后implements接口YouMeCallBackInterface,具体实现回调方法:
  @Override
  public void onEvent(int eventType, int iErrorCode, String roomid, Object param){}
  @Override
  public void onMemberChange(String channelID, MemberChange[] arrChanges, boolean isUpdate){}

进阶功能

接口 含义
api.setVadCallbackEnabled 设置是否开启语音检测回调。开启后频道内有人正在讲话与结束讲话都会发起相应回调通知
api.kickOtherFromChannel 把人踢出频道
api.setSoundtouchPitchSemiTones 设置变声音调,(增值服务,需要后台配置开启)

游戏实时开黑/小队语音通话

场景概览

游密Talk SDK能够让你轻松实现在MMORPG、FPS、TPS、MOBA等游戏中进行组队语音开黑,便于游戏中沟通战术打法。

功能列表

主要功能 功能描述
自由语音互动 用户可以自由加入/退出进行语音开黑互动
相关的设备控制 可控制麦克风、扬声器等设备开关操作
语音检测 可检测当前用户是否在说话
变声 用户可以自由变音
混响效果 可增加混响音效,提高用户体验感

快速开始

开发环境要求

  • Android Studio 3.0及以上
  • 两台真机,用于模拟两个用户进行语音通话
  • 到官网注册账号、并添加应用产品以获得相关到AppKey、AppSecret参数

Android Studio 开发环境集成

  1. 将SDK内到lib文件夹所有文件移至Android工程到libs文件夹下(可视实际项目情况自行放置,但需要确保能正确导入到工程内)

  2. SDK文件包含如下:
SDK文件 jar包 / so库
libs youme_voice_engine.jar
libs android-support-v4.jar
arm64-v8a libyoume_voice_engine.so
armeabi libyoume_voice_engine.so
armeabi-v7a libyoume_voice_engine.so
x86 libyoume_voice_engine.so
x86_64 libyoume_voice_engine.so
  1. AndroidManifest.xml配置
    添加需要的录音和网络相关权限:

    uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
  2. 反混淆配置 YOUMESDK不需要混淆,如果你的工程有混淆 请在proguard-rules.pro文件中添加如下代码:

    -keep class com.youme.**{*;}
    -keepattributes Signature
  3. 设置加载so库以及启动相关服务,在入口Activity类先导入package:

    import com.youme.voiceengine.mgr.YouMeManager;
    
    /// 需要在onCreate 方法里添加如下代码:必须加在onCreate前面,以免部分机型加载so库有问题
    
    YouMeManager.Init(this);
    
    super.onCreate(savedInstanceState);

示例代码

import com.youme.voiceengine.*;
import com.youme.voiceengine.mgr.YouMeManager;

api.SetCallback(YouMeCallBackInterface callBack);           //设置回调
api.init (strAPPKey, strAPPSecret, serverRegionId, strExtServerRegionName);  //初始化SDK
api.joinChannelSingleMode (strUserID, strRoomID, userRole, bCheckRoomExist); //加入语音频道
api.setMicrophoneMute (false));                            //用户打开麦克风
api.setSpeakerMute (false);                                 //用户打开扬声器
api.leaveChannelAll ();                                   //退出语音频道
public void onEvent (int event, int error, String channel, Object param) {
    if (event == YouMeConst.YouMeEvent.YOUME_EVENT_INIT_OK) {
        Log.i(CommonDefines.LOG_TAG, "初始化成功,请加入频道," + "param:" + param);
    }
}

组队开黑场景实现流程

调用流程时序图

时序图

核心调用API

初始化流程
接口 含义
api.SetCallback(YouMeCallBackInterface callBack) 注册回调(event、memberchange等)
api.init 引擎初始化,区域参数使用app发版地区对应的区域参数,若需要全球互通,可联系游密相关人员配置开通

调用示例:

api.SetCallback(this);     //设置回调监听对象,需要implement YouMeCallBackInterface
api.init("Appkey", "strAPPSecret", YOUME_RTC_SERVER_REGION.RTC_CN_SERVER, "");      //只有appkey,appsecret,serverRegionId 都一样时,才可以进行语音互通,改任意一个视为另外一个区服;
加入/退出房间流程
接口 含义
api.joinChannelSingleMode 加入房间,建议 role建议设置为1,autoRecv设为fasle
api.leaveChannelAll 退出所有房间
本地设备控制接口

收到加入房间成功JOIN_OK事件后可设置:

接口 含义
api.setMicrophoneMute 设置麦克风状态
api.setSpeakerMute 设置扬声器状态
api.setAutoSendStatus 设置是否通知别人麦克风和扬声器的开关,设置后用户开关麦克风或者扬声器都会通知到同频道到其他用户
api.setUseMobileNetworkEnabled 设置是否允许使用移动网络
api.setReleaseMicWhenMute 设置当麦克风静音时,是否释放麦克风设备,(需要在初始化成功后,加入房间之前调用)
通话管理
  • 在用户切到后台或者要收听电话时,可调用暂停通话;以便释放麦克风等设备资源的占用,当切换会前台时,可以调用恢复通话接口用于继续通话
接口 含义
api.pauseChannel 暂停通话
api.resumeChannel 恢复通话

设置回调监听

引擎底层对于耗时操作都采用异步回调的方式,函数调用会立即返回,操作结果java层会同步回调。因此,用户必须实现相关接口并在初始化前通过 api.SetCallback(this) 注册接收回调通知的对象。

使用类需要implements接口YouMeCallBackInterface,并实现该接口下的所有回调函数。回调都在子线程中执行,不能用于更新UI等耗时操作。

  • 首先要导入相关的包:
  import com.youme.voiceengine.MemberChange;
  import com.youme.voiceengine.YouMeCallBackInterface;
  • 然后implements接口YouMeCallBackInterface,具体实现回调方法:
  @Override
  public void onEvent(int eventType, int iErrorCode, String roomid, Object param){}
  @Override
  public void onMemberChange(String channelID, MemberChange[] arrChanges, boolean isUpdate){}

进阶功能

接口 含义
api.setVadCallbackEnabled 设置是否开启语音检测回调。开启后频道内有人正在讲话与结束讲话都会发起相应回调通知
api.kickOtherFromChannel 把人踢出频道
api.setSoundtouchPitchSemiTones 设置变声音调,(增值服务,需要后台配置开启)

社交场景

场景概览

游密Talk SDK可支持社交场景中,同时在一个语音频道内的一对一、一对多聊天语音,支持播放战歌、踢出频道、语音反垃圾检测等功能。

API调用基本流程说明

API的调用可使用“api.”来直接操作,接口使用的基本流程为设置回调->初始化->收到初始化成功回调通知->加入语音频道->收到加入频道成功回调通知->打开麦克风->打开扬声器->使用其它接口->离开语音频道->反初始化,要确保严格按照上述的顺序使用接口。同一个Appkey下不同用户加入相同的一个语音频道后就能开始进行语音通话。

相关接口

初始化流程

接口 含义
SetCallback(YouMeCallBackInterface callBack) 注册回调(onEvent、onMemberchange等)
init SDK引擎初始化,做APP验证和资源初始化,需要传值Appkey、AppSecret、serverRegionId,指定初始化区域参数
onEvent 监听OnEvent事件,用于监听回调事件

加入房间流程

接口 含义
joinChannelSingleMode 加入房间,建议房主加入频道时role设置为1(自由说话者),普通用户加入时设置为3(听众,只听不讲)
getUseMobileNetworkEnabled 设置允许使用移动网络,建议传值 true
getChannelUserList 查询频道用户列表,可以设置获取频道用户进出通知,如果有用户加入进出,则会回调通知给到频道内的其他用户,在onMemberChange回调里返回回调数据
setUserRole 切换用户身份,可用于听众用户切换成自由讲话者用于上麦说话,或者在麦位的用户下麦成为听众(详情可看YouMeUserRole类型定义)

设备状态管理

建议设备状态的设置和获取的相关接口调用时间是在加入房间收到YOUME_EVENT_JOIN_OK成功回调后,再去调用,以保证设置和获取是有效的。

接口 含义
setSpeakerMute 设置扬声器状态:true—关闭扬声器,false—开启扬声器
setMicrophoneMute 设置麦克风状态:true——关闭麦克风,false——开启麦克风
setAutoSendStatus 设置是否通知别人麦克风和扬声器的开关,设置后用户开关麦克风和扬声器都会发起相应回调通知
setVolume 设置音量,建议设置为70
setVadCallbackEnabled 设置语音检测,开启后频道内有人正在讲话与结束讲话都会发起相应回调通知
setOtherMicMute 控制他人麦克风状态,建议一般由房主或者管理者才能调用,可以控制频道内其他用户的麦克风开关
setOtherSpeakerMute 控制他人扬声器状态,建议一般由房主或者管理者才能调用,可以控制频道内其他用户的扬声器开关
``

战歌管理

战歌播放是由业务端传值一个本地的音频文件绝对路径给到接口,用于播放;播放的音乐将会通过扬声器输出,并和语音混合后发送给接收方。这个功能必须进入频道传入身份为主播/指挥才能使用。

接口 含义
playBackgroundMusic 播放战歌(传值的是音频文件本地绝对路径)
stopBackgroundMusic 停止播放战歌
pauseBackgroundMusic 暂停播放战歌
resumeBackgroundMusic 回复播放战歌
setBackgroundMusicVolume 设置战歌播放音量
getBgmDuration 获取战歌总时长
setHeadsetMonitorOn 设置监听,用于监听自己的说话的声音或者监听战歌声音,建议micEnabled:设置为false、bgmEnabled:可设置为true

把人踢出房间流程

接口 含义
kickOtherFromChannel 把某用户踢出房间,一般建议只有房主或者管理者才能调用,并且调用者需要在房间里

离开房间流程

接口 含义
leaveChannelAll 退出所有的语音频道

语音内容检测(服务端接口)

语音内容检测即语音鉴黄、反垃圾检测。该功能属于拓展功能,需联系游密方开通配置后调用接口才生效。主要调用方为业务后台服务端,业务方需要设置接收鉴黄\反垃圾检测结果的回调地址,当游密服务端检测到用户的语音流有违规情况时,把检测结果回调给到业务方的服务器。

接口 含义
set_room_audio_mix_with_green 设置用户/房间语音反垃圾检测,用户加入频道开麦克风后可调用设置
del_room_audio_green 关闭用户/房间语音反垃圾检测,建议用户离开频道时调用
Callback 语音反垃圾回调,会把检测结果回调给到业务端服务器

设置用户/房间语音反垃圾检测

  • 请求URL
    https://api.youme.im/v2/im/set_room_audio_mix_with_green?appkey=123456789&identifier=admin&curtime=123456789&checksum=123456789abcdefg
  • header

    Content-Type: application/json
  • body
    格式如下  
    body为json格式,各个字段解释如下:  
    "RoomID":       字符串,游戏频道ID,必选字段。  
    "UserId":       字符串,用户ID,必填字段。  
    "CallBack":     回调地址,把检测结果回调给到业务端服务器,必填。  
    " Forward ":        bool 类型,回调透传。必填设置为 true ,直接回调到客户。  
    " clientInfo ": json对象;可以参照下列说明,属于客户自行选择是否传响应的字段。  
    "clientInfo": {
        "imei": "",              //硬件设备码
        "userNick": "",       //用户昵称
        "deviceId": "",        //设备ID
        "imsi": "",              //运营商设备码
        "mac": "xxxx",        //mac 地址
        "userId": "biant",    //用户 ID唯一标识,建议传入 UID,便于回查。
        "roomId": "leef",    //房间 ID
        "uip": "111.111.111.111",    //用户 IP
        "umid": ""              //设备指纹
    },
  • body实例

    {
    "UserId": "biant",
    "clientInfo": {
        "imei": "",
        "userNick": "",
        "deviceId": "",
        "imsi": "",
        "mac": "xxxx",
        "userId": "biant",
        "roomId": "leef",
        "uip": "111.111.111.111",
        "umid": ""
    },
    "Forward": true,
    "RoomID": "leef",
    "CallBack":"http://94.191.22.224/youme_audio_green"
    }
  • 响应
    {
    "ActionStatus" : "OK",
    "ErrorCode" : 0,
    "ErrorInfo" : ""
    }

关闭用户/房间语音反垃圾检测

  • 请求URL
    https://api.youme.im/v2/im/del_room_audio_green?appkey=123456789&identifier=admin&curtime=123456789&checksum=123456789abcdefg
  • header

    Content-Type: application/json
  • body
    格式如下  
    body为json格式,各个字段解释如下:  
    "RoomID":       游戏频道ID,字符串,必选字段。  
    "UserId":       用户ID,字符串,选填字段。  
  • body实例

    {
    "RoomID":"123456",
    "UserId": "youme_01"
    }
  • 响应
    {
    "ActionStatus" : "OK",
    "ErrorCode" : 0,
    "ErrorInfo" : ""
    }