GB28181 收包方式jrtplib使用方式的差异

Posted qianbo_insist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GB28181 收包方式jrtplib使用方式的差异相关的知识,希望对你有一定的参考价值。

非thread模式

1 使用非thread和 thread模式对比
在使用正常的情况下,使用jthread 和 比使用 非jthread 模式要节省较多的cpu
以下代码使用自己产生一个线程模式

void RtpServer::run()

    Running = true;
    RTPSession sess;
    uint16_t portbase;
    int status;
    RTPUDPv4TransmissionParams transparams;
    RTPSessionParams sessparams;
    sessparams.SetOwnTimestampUnit(1.0 / 9000.0);
    sessparams.SetUsePollThread(true);

    int rtpPort = MEDIASERVER_RTP_PORT;
    portbase = rtpPort;

    transparams.SetRTPReceiveBuffer(1024 * 1024 *100); //100M

    sessparams.SetAcceptOwnPackets(true);
    transparams.SetPortbase(portbase);
    status = sess.Create(sessparams, &transparams);

    if (status < 0)
    
        std::cout << "ERROR: " << RTPGetErrorString(status) << std::endl;
        return;
    

    while(!mIsStop)
    
        sess.BeginDataAccess();

        // check incoming packets
        if (sess.GotoFirstSourceWithData())
        
            do
            
                RTPPacket *pack;

                while ((pack = sess.GetNextPacket()) != NULL)
                
                    RTPSourceData *mRTPSourceData = sess.GetCurrentSourceInfo();
                    uint32_t ssrc = mRTPSourceData->GetSSRC();
                    //ssrc是cameraId gb28181 server invite 的ssrc
                    int cameraId = ssrc; 

                    VideoChannel* channel =gGB28181Server->VideoChannel(cameraId);

                    if (channel != nullptr)
                    
                        //插入数据
                        channel->push(.........);
                    

                    sess.DeletePacket(pack);
                

             while (sess.GotoNextSourceWithData());
        
        sess.EndDataAccess();
    
    sess.BYEDestroy(RTPTime(10, 0), 0, 0);
    Running = false;


使用thread模式

使用RTPserv从RTPSession上继承,如下:

class RtpReciever:public RTPSession

重写OnPollThreadStep函数

void RtpServer::OnPollThreadStep()

    BeginDataAccess();
    if (GotoFirstSourceWithData())
    

        do
        
            RTPPacket *pack;
            while ((pack = GetNextPacket()) != NULL)
            
                RTPSourceData *mRTPSourceData = GetCurrentSourceInfo();
                uint32_t ssrc = mRTPSourceData->GetSSRC();
                int cameraId = ssrc-100000000; //这里的ssrc就是cameraId 在invite的时候传给相机的

                VideoChannel* channel = AppConfig::gGB28181Server->getVideoChannel(cameraId);

                if (channel != nullptr)
                
                //插入数据
                    channel->push(.......);
                

 
                DeletePacket(pack);
            
         while (GotoNextSourceWithData());
    

    EndDataAccess();

使用自己的线程,光收包直接cpu飚成10%
使用jthread 线程poll模式,收包+ 1路渲染,cpu降下来不到1%

差距比较大,更好的建议使用异步模式收rtp包。

以上是关于GB28181 收包方式jrtplib使用方式的差异的主要内容,如果未能解决你的问题,请参考以下文章

一种RTP接收和解包的程序

GB28181控制传输流程和协议接口之注册|注销和技术实现

GB28181设备接入端如何实现校时?

使用p2p发送GB28181流的设计

GB28181 密解播放器

中维世纪gb28181如何设置