1.简介
在国标语音对讲对接中,会发现不同的厂商或不同型号的设备,对讲流程都不一样,本文主要介绍流媒体与设备之间的交互情况。
SMS流媒体服务代码库地址:https://gitee.com/inyeme/simple-media-server
2.流媒体与设备交互的可能情况
对讲流程中,流媒体与设备的交互场景大致可以分为几种:
- 作为服务端,被动等待设备来建链,并发送数据
- 作为服务端,被动等待设备来建链,等待设备发数据
- 作为服务端,被动等待设备来建链,既发送也接收数据
- 作为客户端,主动向设备建链,并发送数据
- 作为客户端,主动向设备建链,等待设备发数据
- 作为客户端,主动向设备建链,既发送也接收数据
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:bothstring 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:bothstring 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号见项目地址。