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包。

你可能感兴趣的:(c++,c++高级技巧,gb28181,jrtplib,jthread)