流式传输h264时libjrtp丢失数据包

时间:2016-10-13 12:01:40

标签: streaming rtp packet-loss

我有几台Axis IP-Cameras,我想通过RTP将他们的H264输出流式传输到我的应用程序。 到目前为止,一切都在大部分时间都在工作,通常只有一台相机。一旦我连接了多个凸轮,我就会在我使用的每个jrtplib实例上获得大量丢失的数据包,导致视频效果不佳(伪影,图像损坏等)。

所以,我创建了一个小型测试设置,只连接一个摄像头,只使用一个jrtplib实例,代码或多或少直接取自样本。

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);

即使进行了这个简单的测试,我也会丢失数据包(缺少序列号),我还检查了丢失的序列号是否只是延迟了,但没有。

但是当我将transparams.SetRTPReceiveBuffer添加到一个相当高的值(如1048576字节)时,它会停止丢失数据包,至少对于此样本而言。

在我的真实世界代码中,增加接收缓冲区并没有帮助。我也尝试将session.Poll()移动到一个单独的线程。

使用Wireshark捕获UDP数据包显示没有丢弃的数据包,所以它是libjrtp的东西? 有没有人有这方面的经验,或者甚至可能建议另一个图书馆使用?我现在很困惑......

感谢您提供任何提示,也许这只是一个小问题,我只是没有看到它

此致

0 个答案:

没有答案