2

複数の Axis IP カメラがあり、それらの H264 出力を RTP 経由でアプリケーションにストリーミングしたいと考えています。これまでのところ、ほとんどの場合、通常は 1 台のカメラですべてが機能しています。複数のカムを接続するとすぐに、使用しているすべての jrtplib インスタンスで多くの欠落パケットが発生し、結果としてビデオの品質が低下します (アーティファクト、画像の破損など)。

そこで、サンプルから多かれ少なかれ直接取得したコードを使用して、カメラを 1 つだけ接続し、jrtplib インスタンスを 1 つだけ使用する小さなテスト セットアップを作成しました。

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.SetRTPReceiveBuffer1048576 バイトなどのかなり高い値を追加すると、少なくともこのサンプルではパケットの欠落がなくなります。

私の実際のコードでは、受信バッファを増やしても役に立ちません。session.Poll()また、別のスレッドに移動しようとしました。

Wireshark を使用して UDP パケットをキャプチャしても、ドロップされたパケットは表示されません。誰かがこれを経験したことがありますか、それとも別のライブラリを使用するための提案さえありますか? 私はこの時点でかなり立ち往生しています...

ヒントをありがとう、多分それはほんの小さな問題で、私はそれを見ません

よろしく

4

0 に答える 0