whatsapp 语音通话 音频编码(五)

这篇具有很好参考价值的文章主要介绍了whatsapp 语音通话 音频编码(五)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Whatsapp VoiceCall

客户端通过websocket连接到服务器,客户端发起语音通话请求,并且完成必要的协商之后,就可以直接将语音数据发送给服务器,服务器接收到对方的语音数据之后也会通过websocket将语音数据转发给客户端

获取协商秘钥

XMPP 在发起语音通话请求的时候,需要带上一个秘钥,这个秘钥长32字节,通过特殊算法生成。这个算法需要三个参数:

  1. 自身jid
  2. 对方jid
  3. 时间戳(服务端自动获取,不需要生成)
        //发送获取秘钥请求
        JSONObject result = new JSONObject();
        result.put("command", "GetSecret");
        result.put("selfjid", "自己的@whatsapp.com");
        result.put("otherjid", "对方@whatsapp.com");
        SendCommand(result);
    
        //接收到服务器返回的消息, secret 字段是经过base64 编码,需要解码,解码之后是32字节
        {
            "secret": "Xh+LtW/gRxC92B4UK/gLAzqERAqL9U2ArNetO3Zy0h0=",
            "command": "ResponseSecret"
        }
    
    

发起XMPP 语音请求

  1. 发起语音请求。这个请求需要通过xmpp 通道发送出去,发出去之后,WA服务器会回一个ack包,这个ack包需要通过websocket发给中转服务器
 <call to='接收方@s.whatsapp.net' id='随机生成32字节'>
        <offer call-creator='发送方.0:0@s.whatsapp.net' call-id='随机生成32字节' device_class='2015'>
            <privacy>联系人的token,  同步联系人的时候 privacy_token节点下 trusted_contact 数据 </privacy>
            <audio rate='16000' enc='opus'/>
            <net medium='3'/>
            <capability ver='1'>AQT3CcT6</capability>
            <enc v='2' type='msg'>从服务器获取的32字节秘钥序列化成pb之后加密</enc>
            <encopt keygen='2'/>
        </offer>
    </call>
 //下面是消息pb 结构的一部分,需要将返回的32字节秘钥 设置到 Call->callKey 中,序列化之后加密
    message Message {
        optional string conversation = 1;
        optional SenderKeyDistributionMessage senderKeyDistributionMessage = 2;
        optional ImageMessage imageMessage = 3;
        optional ContactMessage contactMessage = 4;
        optional LocationMessage locationMessage = 5;
        optional ExtendedTextMessage extendedTextMessage = 6;
        optional DocumentMessage documentMessage = 7;
        optional AudioMessage audioMessage = 8;
        optional VideoMessage videoMessage = 9;
        optional Call call = 10;
        ... ...
        ... ...
    }

    message Call {
        optional bytes callKey = 1;
        optional string conversionSource = 2;
        optional bytes conversionData = 3;
        optional uint32 conversionDelaySeconds = 4;
    }
  1. 处理ack 回包。
    发送完第一个包之后,服务器会返回一个ack包, 需要将这个ack包转成xml格式,然后通过websocket 发送给服务器
      //xmpp 转xml 需要注意, 节点部分的值需要base64 之后再发过来
    <ack from='对方@s.whatsapp.net' class='call' type='offer' id='xxxx'>
        <relay attribute_padding='1' peer_pid='0' self_pid='1' uuid='xxx' call-creator='xxx@s.whatsapp.net' call-id='xxx' joinable='1'>
            <participant pid='0' jid='xxx@s.whatsapp.net'/>
            <token id='0'>base64的内容</token>
            <token id='1'>xxx</token>
            <token id='2'>xxx</token>
            <token id='3'>xxx</token>
            <token id='4'>xxxx</token>
            <key>xxxx</key>
            <te2 protocol='1' relay_id='0' token_id='0'>base64的内容</te2>
            <te2 protocol='1' relay_id='0' token_id='0'>base64的内容</te2>
            <te2 relay_id='0' token_id='0'>xxx</te2>
            <te2 relay_id='0' token_id='0'>xxx</te2>
            <te2 protocol='1' relay_id='1' token_id='1'>xxx</te2>
            <te2 protocol='1' relay_id='1' token_id='1'>xx</te2>
            <te2 relay_id='1' token_id='1'>xxx</te2>
            <te2 relay_id='1' token_id='1'>xxx</te2>
            <te2 protocol='1' relay_id='2' token_id='3'>xxx</te2>
            <te2 protocol='1' relay_id='2' token_id='3'>xxx</te2>
            <te2 relay_id='2' token_id='3'>xxx</te2>
            <te2 relay_id='2' token_id='3'>xxx</te2>
            <te2 protocol='1' relay_id='3' token_id='2'>xxx</te2>
            <te2 protocol='1' relay_id='3' token_id='2'>xxx</te2>
            <te2 relay_id='3' token_id='2'>xxx</te2>
            <te2 relay_id='3' token_id='2'>xxx</te2>
            <te2 protocol='1' relay_id='4' token_id='4'>xxx</te2>
            <te2 protocol='1' relay_id='4' token_id='4'>xxx</te2>
            <te2 relay_id='4' token_id='4'>xxx</te2>
            <te2 relay_id='4' token_id='4'>xxx</te2>
            <hbh_key>xxx</hbh_key>
        </relay>
        <user jid='xxx@s.whatsapp.net'>
            <device jid='xxx@s.whatsapp.net'/>
        </user>
        <rte>xxx</rte>
        <uploadfieldstat/>
        <userrate/>
        <voip_settings uncompressed='1'>xxxx</voip_settings>
    </ack>
 //将服务器回的ack 包发给中转服务器
    JSONObject result = new JSONObject();
    result.put("command", "VoiceAck");
    // 用于测试的音频文件ID,固定,正式部署的时候需要换成上传的文件
    result.put("file_uuid", "aee4d52d-6ba7-4a65-80d4-b7341b1115f0");
    result.put("ack", "服务器回的ack包打包成xml格式");
    SendCommand(result);
  1. 接收到的服务器的包必须回复ack,否则会被踢下线,下面几个常用的ack
		//接收的包
        <receipt from='xxx@s.whatsapp.net' id='xxx' t='xxx'>
            <offer call-id='xxx' call-creator='xxx@s.whatsapp.net'/>
        </receipt>

        //需要回复ack
         <ack id='xxx' to='xxx@s.whatsapp.net' class='receipt'/>
  //接收的包
        <call from='xxx@s.whatsapp.net' id='xxx' t='xxx'><preaccept call-id='xxx' call-creator='xxx@s.whatsapp.net'><audio rate='16000' enc='opus'/><encopt keygen='2'/><capability ver='1'>xxx</capability></preaccept></call>

        //需要回复ack
        <ack id='xxx' to='xxx.0:0@s.whatsapp.net' class='call' type='preaccept'/>
 //接收的包
    <call from='xxx@s.whatsapp.net' id='xxx' t='xxx'>
        <relaylatency call-id='xxx' call-creator='xxx@s.whatsapp.net'>
            <te latency='xxx'>xxx</te>
        </relaylatency>
    </call>
    //需要回复ack
    <ack id='xxx' to='xxx.0:0@s.whatsapp.net' class='call' type='relaylatency'/>
  1. 中转服务器会将一些需要发给WA服务器的包发过来,这些包需要转成xmpp 格式的数据发给WA 服务器
 <call to="xxx@s.whatsapp.net" id="xxx">
        <relaylatency call-creator="xxx.0:0@s.whatsapp.net" call-id="xxx">
            <te latency="xxx">xxx</te>
        </relaylatency>
    </call>

总结一下步骤:

1. 和中转服务器建立websocket 连接

2. 从中转服务器获取 加密秘钥

3. XMPP 发送call 请求,并且接收服务器返回的ack, 特别需要注意期间会收到很多包,都需要回ack,上面也列出了一些需要回ack的包

4. 将WA 服务器的ack包转成xml 格式发给中转服务器, 特别需要注意xml格式节点值需要base64 编码

5. 中转服务器会主动发送一些xml数据, 客户端需要将这些xml数据转成xmpp包发给服务器。

whatsapp 语音通话 音频编码(五),python,whatsapp 语音通话文章来源地址https://www.toymoban.com/news/detail-854217.html

到了这里,关于whatsapp 语音通话 音频编码(五)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Python进行语音识别:将音频转为文字

    语音识别是一项将语音信号转换为可理解的文本的技术。在Python中,我们可以使用一些库和工具来实现语音识别,并将音频转换为文本。本文将介绍如何使用Python进行语音识别的过程,并提供相应的源代码。 步骤1:安装所需的库 首先,我们需要安装一些Python库来支持语音识

    2024年02月03日
    浏览(59)
  • Speech | 语音处理,分割一段音频(python)

    本文主要是关于语音数据在处理过程中的一些脚本文件以及实例,所有代码只需要更改所需处理的文件路径,输出路径等,全部可运行。 目录 所需环境 方法1:将一整段音频按时间批量切成一个一个音频 方法2:将一整段音频按语句停顿批量切成一个一个音频 方法3:将一个

    2024年02月08日
    浏览(35)
  • uniapp Vue 使用 sip.js进行语音通话视频通话

    下载或者安装 sip.js 到 uniapp 项目,APP 端在 menifest.json 中配置麦克风权限 menifest.json 中 app 权限配置选中: android.permission.RECORD_AUDIO android.permission.MODIFY_AUDIO_SETTINGS sip.js 低版本 如 V0.13.0 版本的写法 sip.js 高版本如 V0.21.2 用法 (参数同上,只列出 methods 里的部分) APP模式下检测麦

    2024年02月13日
    浏览(151)
  • HarmonyOS 音频通话开发指导

    常用的音频通话模式包括 VOIP 通话和蜂窝通话。 ● VOIP 通话:VOIP(Voice over Internet Protocol)通话是指基于互联网协议(IP)进行通讯的一种语音通话技术。VOIP 通话会将通话信息打包成数据包,通过网络进行传输,因此 VOIP 通话对网络要求较高,通话质量与网络连接速度紧

    2024年02月08日
    浏览(48)
  • WebSocket+Vue+SpringBoot实现语音通话

    参考文章 整体思路 前端点击开始对话按钮后,将监听麦克风,获取到当前的音频,将其装化为二进制数据,通过websocket发送到webscoket服务端,服务端在接收后,将消息写入给指定客户端,客户端拿到发送过来的二进制音频后再转化播放 注意事项 由于音频转化后的二进制数据

    2024年02月06日
    浏览(46)
  • Python | 语音处理 | 用 librosa / AudioSegment / soundfile 读取音频文件的对比

    本文对比用 Python 读取音频文件 (.wav, .mp3) 的三种方式: soundfile.read librosa.load pydub.AudioSegment.from_file 使用总结如下: soundfile.read : 只能读 .wav ,不能读 .mp3; 默认 dtype = \\\'float64\\\' ,输出为 (-1, 1) 之间的数据 (做了 32768 归一化);修改为 dtype = \\\'int16\\\' ,输出为 (-2**15, 2**15-1) 之间;

    2024年02月14日
    浏览(52)
  • SIP/VoIP之常见的语音通话问题

      语音通话是SIP或VoIP应用中最重要的功能,一旦语音方面出现问题,将极大的降低产品的口碑,很容易被市场和用户淘汰。   主叫方听不到被叫方声音,被叫方也听不到主叫方声音,即双方互相听不见   其中一方能听见另一方声音   听见对方的声音语调不对,声音

    2023年04月18日
    浏览(39)
  • unity 使用声网(Agora)实现语音通话

    第一步、先申请一个声网账号 [Agora官网链接](https://console.shengwang.cn/) 第二步在官网创建项目 ,选择无证书模式,证书模式需要tokenh和Appld才能通话 第三步 官网下载SDK 然后导入到unity,也可以直接在unity商店里下载,Agora官网下载链接 第四步 运行官方Demo 1、导入后会有这些

    2024年04月25日
    浏览(42)
  • webRCT实时语音视频通话 结合 vue使用

    前言:最近项目遇到了一个推送视频对话的需求,本身项目就用到了websocket推送,所以直接使用webRCT就行 封装了一个socket.js mounted的中调用connection 就可以了

    2024年02月13日
    浏览(36)
  • 【FreeSwitch开发实践】media bug获取通话语音流

    🏠 博客主页:小小马车夫的主页 🍅 所属专栏:FreeSwitch开发实践 🥝 专栏介绍:主要介绍博主在实际项目中使用FreeSwitch开发外呼类项目的一些经验心得,主要涉及FreeSwitch的基本安装编译、基本配置、ESL、WSS、录音、自定义模块、media bug、语音播放、MRCP及对接AI机器人等内

    2024年02月04日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包