You need to enable JavaScript to run this app.
导航

GB28181 语音对讲接入指南

最近更新时间2023.02.02 18:42:57

首次发布时间2022.11.01 17:47:38

IPC 端配置

设备需具备音频输入和外放的能力。本接入指南以海康 IPC 为例,介绍慢直播语音对讲功能的接入步骤。

说明

海康 IPC 只有部分型号支持公网语音对讲。

首先需要使能 IPC 的 GB28181 国标接入功能,并配置 语音输出通道编码ID。参考以下示例:

语音输出通道编码ID 的规则为20位数字,其中类型编码(11-13位)需为137,例如:34020000001370000001

服务端 OpenAPI 接口

开始语音对讲

调用慢直播服务端 “开始语音对讲” 接口(StartVoiceTalk),返回示例如下:

POST Action=StartVoiceTalk?SpaceID=<空间ID>&DeviceNSID=<设备国标ID>

response 示例:
{
    "AudioSendUrl": "wss://aiotvideo.volces.com/voice_talk/nss/talk/34020081991180402721?vhost=12345678"
}
  • 接口返回 WebSocket 音频推流地址

  • 客户端音频录音采集参数为 8KHz@Mono 16bit PCM 格式

  • 需编码为 PCMA,并 base64 编码之后再通过 WebSocket 发送至服务端,message 类型为 ArrayBuffer

前端调用流程:

PCM录音->PCMA编码->FLV封装->WebSocket发送音频帧至AudioSendUrl

结束语音对讲

调用慢直播服务端 “结束语音对讲” 接口(StopVoiceTalk),返回示例如下:

POST Action=StopVoiceTalk?SpaceID=<空间ID>&DeviceNSID=<设备国标ID>

response
200

控制台操作

  1. 登录慢直播控制台后,打开 设备管理 > 设备详情 > 实时预览 页面。

  1. 按住 长按对讲 按钮,发送语音至 IPC,此时应该能听到 IPC 发出声音。

  2. 松开 长按对讲 按钮,结束语音发送。

前端语音采集传输demo

<script src="https://unpkg.byted-static.com/byted/web-pusher/0.1.1/dist/index.min.js"></script>
<script>
    // 重置 WebPusher
    const resetPusher = () => {
        if (window.webPusher) {
          window.webPusher.destroy();
          window.webPusher = null;
        }
    };
    
    // 初始化 WebPusher
    const initPusher = async (url: string) => {
        const options: any = {
          url,
          samplesPreFrame: 160,
        };
        const webPusher: any = new WebPusher(options);
        await webPusher.startCapture();
        webPusher.publish();
        
        webPusher.on('ready', () => {
          console.log('ready!');
        });
        
        webPusher.on('error', (e: any) => {
          Message.error(`对讲失败: ${e}`);
          stopVoice();
        });
        
        window.webPusher = webPusher;
    };
    
    // 开始对讲
    const startVoice = async () => {
        try {
          const res = await StartVoiceTalk({
              SpaceID,
              DeviceNSID
          });
          await initPusher(res?.AudioSendUrl || '');
        } catch (error) {
          stopVoice();
        } 
    };
    
    // 结束对讲
    const stopVoice = async () => {
        try {
          await StopVoiceTalk({
              SpaceID,
              DeviceNSID
          });
        } catch (error) {
        } finally {
          resetPusher();
        }
    };
</script>