流媒体服务器SMS-语音对讲(一)

1.简介

        在国标语音对讲对接中,会发现不同的厂商或不同型号的设备,对讲流程都不一样,本文主要介绍流媒体与设备之间的交互情况。

        SMS流媒体服务代码库地址:https://gitee.com/inyeme/simple-media-server

2.流媒体与设备交互的可能情况

        对讲流程中,流媒体与设备的交互场景大致可以分为几种:

  1. 作为服务端,被动等待设备来建链,并发送数据
  2. 作为服务端,被动等待设备来建链,等待设备发数据
  3. 作为服务端,被动等待设备来建链,既发送也接收数据
  4. 作为客户端,主动向设备建链,并发送数据
  5. 作为客户端,主动向设备建链,等待设备发数据
  6. 作为客户端,主动向设备建链,既发送也接收数据

3.几种常见对讲流程

3.1.单向通道

情况1:

情况2:

3.2.双向通道

情况1:

情况2:

4.SMS对讲接口

        目前SMS支持单向对讲的几种场景,对应的对讲接口如下:

void GB28181Api::initApi()
{
    g_mapApi.emplace("/api/v1/gb28181/recv/create", GB28181Api::createGB28181Receiver);
    g_mapApi.emplace("/api/v1/gb28181/send/create", GB28181Api::createGB28181Sender);
    g_mapApi.emplace("/api/v1/gb28181/recv/stop", GB28181Api::stopGB28181Receiver);
    g_mapApi.emplace("/api/v1/gb28181/send/stop", GB28181Api::stopGB28181Sender);
}

        从接口上,可以创建发送者或者接受者

void GB28181Api::createGB28181Sender(const HttpParser& parser, const UrlParser& urlParser, 
                        const function<void(HttpResponse& rsp)>& rspFunc)
{
    HttpResponse rsp;
    rsp._status = 200;
    json value;

    checkArgs(parser._body, {"active", "ssrc", "port", "socketType", "streamName", "appName", "ip"});

    int active = toInt(parser._body["active"]);
    // logInfo << "json active: " << parser._body["active"];
    // logInfo << "active: " << active;
    if (active) {
        int ssrc = toInt(parser._body["ssrc"]);
        int port = toInt(parser._body["port"]);
        int socketType = toInt(parser._body["socketType"]); //1:tcp,2:udp,3:both
        string streamName = parser._body["streamName"];
        string appName = parser._body["appName"];
        string ip = parser._body["ip"];

        auto push = make_shared<GB28181ClientPush>(ip, port, appName, streamName, ssrc, socketType);
        push->create();
        push->start();

        string key = ip + "_" + to_string(port) + "_" + to_string(ssrc);
        GB28181Client::addClient(key, push);

        value["port"] = push->getLocalPort();
        value["ip"] = push->getLocalIp();
        value["ssrc"] = ssrc;
    } else {
        int ssrc = toInt(parser._body["ssrc"]);
        int port = toInt(parser._body["port"]);
        int socketType = toInt(parser._body["socketType"]); //1:tcp,2:udp,3:both
        string streamName = parser._body["streamName"];
        string appName = parser._body["appName"];

        GB28181Server::instance()->startSend("0.0.0.0", port, socketType, appName, streamName, ssrc);

        value["port"] = port;
        value["ip"] = Config::instance()->get("LocalIp");
        value["ssrc"] = ssrc;
    }

    value["code"] = "200";
    value["msg"] = "success";
    rsp.setContent(value.dump());
    rspFunc(rsp);
}

        在创建发送者或接收者的时候,又可以指定是主动建链还是被动等待建链。基本满足了单向通道的对讲流程。

5.结束语

        目前SMS还在开发中,欢迎有兴趣的朋友一起开发,qq号见项目地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值