UDP を介して一連のビデオ フレームをできるだけ高速かつリアルタイムで送信する必要があり、基本的な作業を行う一方で、あらゆる種類の問題に直面しています。私の目標のいくつか:
通常、データはダイヤルアップ (TCP ではなく UDP) 経由で送信されますが、高速イーサネットもサポートする必要があります。
ときどきフレームをドロップしても問題ありません (したがって、TCP ではなく UDP)。
低遅延が必要です。リモートが受信するフレームは、最近送信されたものである必要があります (バッファ内で待機している数フレーム以下)。
フレームレートを維持するためにフレームを多かれ少なかれ圧縮できるように、有効な帯域幅を検出できる必要があります。
私はほとんどの部分を実装することができました:
フレーム データを約 500 バイトの 1 つまたは複数のデータグラムに分割し、それぞれにシーケンス番号とその他の情報を含めます。レシーバーはフレーム全体を再構築し、欠落しているデータグラムがないかどうかを検出します。
受信者が特定の割合を超えるフレームのドロップを検出した場合 (たとえば、最後の 10 フレームで 50%)、送信者に TCP メッセージを送信して速度を 50% 低下させます。送信者は、後続のフレームごとにゆっくりと速度を 5% 上げます。
System.Net.Sockets.UdpClient を使用してデータを送受信します。
送信者への制御メッセージに使用される別の TCP チャネルがあります。
現在の私の主な問題は、有効な帯域幅を検出し、特にダイヤルアップ (最大 ~4,000 バイト/秒) での遅延に対処することです。たとえば、TcpClient.Send() を使用して 100,000 バイト/秒を送信しようとすると、すべてが到着するように見えますが (データグラムのドロップはありません)、最後のデータグラムが到着するまでに大きな遅延が発生します。TcpClient.Send() 関数は、バッファが送信できるようになるまでブロックしていると思います。これにより、現在のアルゴリズムが台無しになります。
誰でも次の方法についての情報源を教えてもらえますか?
UDP 経由で実際の帯域幅を検出します。
使用可能なパイプに合わせて帯域幅を動的に調整するためのより優れたアルゴリズム。
必要な帯域幅でスムーズにデータを送信します。
遅延を検出して最小限に抑える方法。
私は先週、車輪を回転させてきました.1つの問題を解決するたびに、別の問題が頭に浮かぶようです.