2

I have several Axis IP-Cameras and I want to stream their H264 output over RTP to my application. So far everything is working most of the time, usually with one camera. As soon as I attach more than one cam, I get lots of missing packets on every jrtplib instance I am using, resulting in bad video (artifacts, broken images, etc.).

So, I created a small test setup connecting just one camera and using just one jrtplib instance, with code more or less directly taken from the samples.

using namespace jrtplib;

RTPUDPv4TransmissionParams transparams;
RTPSessionParams sessparams;
RTPSession sess;

sessparams.SetOwnTimestampUnit(1.0 / 90000.0);

sessparams.SetAcceptOwnPackets(true);

transparams.SetPortbase(rtp_port);


auto status = sess.Create(sessparams, &transparams);
checkerror(status);

uint16_t last_sn = 0;

while (1)
{
    sess.BeginDataAccess();

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

            while ((pack = sess.GetNextPacket()) != NULL)
            {
                // You can examine the data here
                auto sn = pack->GetSequenceNumber();
                if (0!=last_sn && sn - last_sn != 1)
                {
                    std::cout << "\tmissing packets: " << (sn - last_sn) << std::endl;
                }

                std::cout << sn << std::endl;

                last_sn = sn;

                // we don't longer need the packet, so
                // we'll delete it
                sess.DeletePacket(pack);
            }
        } while (sess.GotoNextSourceWithData());
    }

    sess.EndDataAccess();

    status = sess.Poll();
    checkerror(status);

    Sleep(1);
}

sess.BYEDestroy(RTPTime(10, 0), 0, 0);

Even with this simple test, I get missing packets (missing sequence numbers), I also checked wether the missing sequence number are just delayed, but no.

But when I add transparams.SetRTPReceiveBuffer to a rather high value, like 1048576 bytes, it stops missing packets, at least for this sample.

In my real world code, increasing the receive buffer does not help. I also tried moving the session.Poll() to a separate thread.

Capturing UDP packets using Wireshark shows no dropped packets, so it´s something with libjrtp? Does anyone have experience with this, or maybe even a suggestion for a another library to use? I am quite stuck at this point...

Thanks for any hints, maybe it is just a small issue and I just don´t see it

Regards

pettersson
  • 317
  • 2
  • 10
  • 1
    After investigating this problem even further, it came down to problems with our network. Packets are lost, even without using libjrtp. – pettersson Oct 17 '16 at 05:46

0 Answers0