去年公司搞了一个智慧乡村的项目,其中涉及到视频监控的问题。电信提供的解决方案,我们的平台只需要跟电信对接HLS流就可以了。这就有一个问题,原来公司安装的监控无法接入到自己的平台,好尴尬啊。。。。。。。于是在网上搜索一番大概意思可以通过GB28181协议,将摄像机接入一个媒体服务器,然后媒体服务器进行转码生成HLS流,那么问题就解决了。
那就搞GB28181呗,再找一圈PJLIB专门干这事的,于是。。。。。
//设置日志级别
pj_log_set_level(loglevel);
//初始化PJLIB库
pj_status_t status = pj_init();
pj_assert(status == PJ_SUCCESS);
if (status != PJ_SUCCESS) return m_isInit;
//初始化PJLIB_UTIL库
status = pjlib_util_init();
pj_assert(status == PJ_SUCCESS);
if (status != PJ_SUCCESS) return m_isInit;
//初始化缓冲池,注意这里max_capacity被设置为0应该是自动增长,在PJLIB官方DEMO中是指定了一个值的CACHING_POOL_SIZE
pj_caching_pool_init(&pjcontent.cp, &pj_pool_factory_default_policy,0);
//创建一个缓冲池,并且指定了4000的大小,每次增长大小为4000
pjcontent.pool = pj_pool_create(&pjcontent.cp.factory, "QLApp", 4000, 4000, NULL);
//创建一个终端,名称为本地服务器机器名
status = pjsip_endpt_create(&pjcontent.cp.factory, pj_gethostname()->ptr,&pjcontent.sip_endpt);
pj_assert(status == PJ_SUCCESS);
if (status != PJ_SUCCESS) return m_isInit;
//为终端创建事务模块
status = pjsip_tsx_layer_init_module(pjcontent.sip_endpt);
pj_assert(status == PJ_SUCCESS);
if (status != PJ_SUCCESS) return m_isInit;
//为终端创建用户代理模块
status = pjsip_ua_init_module(pjcontent.sip_endpt, nullptr);
pj_assert(status == PJ_SUCCESS);
if (status != PJ_SUCCESS) return m_isInit;
//为终端创建临时响应模块
status = pjsip_100rel_init_module(pjcontent.sip_endpt);
pj_assert(status == PJ_SUCCESS);
if (status != PJ_SUCCESS) return m_isInit;
//从上下文中解析出服务器地址,并且初始化UDP传输模块
pj_str_t pjStr = strToPjstr(getAddr());
pj_sockaddr_in pjAddr;
pjAddr.sin_family = pj_AF_INET();
pj_inet_aton(&pjStr, &pjAddr.sin_addr);
auto port = getPort();
pjAddr.sin_port = pj_htons(static_cast<pj_uint16_t>(getPort()));
status = pjsip_udp_transport_start(pjcontent.sip_endpt, &pjAddr, nullptr, 1, nullptr);
pj_assert(status == PJ_SUCCESS);
if (status != PJ_SUCCESS) return m_isInit;
然后我是想这封装一个服务器模式,一个客户端模式,于是。。。。
//初始化身份校验服务模块,回调函数lookup应该是具体执行身份校验过程。
pj_status_t status = pjsip_auth_srv_init(pjcontent.pool, &pjcontent.auth_svr, &realm, &CPJContent::lookup, 0);
pj_assert(status == PJ_SUCCESS);
if (status != PJ_SUCCESS) return false;
//初始化主模块
if (!m_mainModule.init()) return false;
//这里的主模块中主要是完成一些需要处理的事件回调函数的挂在,然后把模块注册到终端,这个模块会处理所有的通讯数据
//初始化SIP协议控制模块
if (!m_controlModule.init()) return false;
//这里协议控制模块还是注册一个模块到终端,但是这个模块会负责具体的通讯协议处理
//创建主线程
status = pj_thread_create(pjcontent.pool, "mainThread", CPJContent::mainThreadProc, NULL, 0, 0, &workthread);
pj_assert(status == PJ_SUCCESS);
if (status != PJ_SUCCESS) return false;
到这里服务器模式基本就绪了,接下去就要处理通讯过程,等我写好了后面的代码再来吧啦吧啦