PJLib开发杂谈

去年公司搞了一个智慧乡村的项目,其中涉及到视频监控的问题。电信提供的解决方案,我们的平台只需要跟电信对接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;

到这里服务器模式基本就绪了,接下去就要处理通讯过程,等我写好了后面的代码再来吧啦吧啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值