複数の 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.SetRTPReceiveBuffer
1048576 バイトなどのかなり高い値を追加すると、少なくともこのサンプルではパケットの欠落がなくなります。
私の実際のコードでは、受信バッファを増やしても役に立ちません。session.Poll()
また、別のスレッドに移動しようとしました。
Wireshark を使用して UDP パケットをキャプチャしても、ドロップされたパケットは表示されません。誰かがこれを経験したことがありますか、それとも別のライブラリを使用するための提案さえありますか? 私はこの時点でかなり立ち往生しています...
ヒントをありがとう、多分それはほんの小さな問題で、私はそれを見ません
よろしく