私はストリーミングアプリケーションで作業していますが、フレームを取得し、h264にエンコードし、クライアントにtcp経由で送信し、クライアントはエンコードされたフレームを受信し、それを表示します。私が見つけたのは、小さい時間間隔でwriteメソッドを何度か呼び出すと、転送速度にかなりの影響があるということです。QTcpSocket高頻度書き込みで転送速度が遅くなります
インターバル時間は、フレームを取得してエンコードするのにかかる時間である12ms〜17msです。クライアントでは、1つのフレームと別のフレームを読み込むのにかかる時間を数えています。 12/17 msを使用すると、クライアントに到達するまでの時間は〜400 msです。しかし、書き込みでスリープ状態を追加すると、12/17ms〜150msと言うことができます。クライアントの時間は〜150msに短縮されます。
私は1つのフレームを送信しようとしました。クライアントがそれを受信すると、確認応答を送信し、サーバは次のフレームを取得します。この方法を使用すると、レイテンシは同じ〜150ミリ秒でした。
データを特定のサイズのチャンク(現時点で512バイトを使用)に分割しています。クライアントはチャンクを受信し、sha256を使用してそれらを組み立てます。情報が正しく到着したことを確認し、 )を1200バイトから65kbに設定します。だから私の結論は、転送レートが影響を受ける書き込みの多くをソケットにストレスを与える場合、これは正しいですか、私は何か間違っている可能性がありますか?
さらに、150msは6fpsと似ていますが、VNCやその他のストリーミングアプリケーションはどのように機能しますか?彼らはいくつかのフレームをバッファリングし、それらを再生する?したがって、レイテンシはありますが、「経験」はより高いフレームレートになりますか?
おかげ
通常、バッファリングを無効にしない限り、バッファリングはすべて使用され、30秒以上の遅延が発生します。大きなチャンクをあまり頻繁に送信しないのはなぜですか? 150 msはビデオにはかなり良いです。 – dtech
バッファリングは、遅延の変動を「平滑化」するのに役立ちます。明らかに、それは魔法のように帯域幅を増やすわけではありませんが、レイテンシーを犠牲にしてよりスムーズな再生を提供します。より大きなバッファはまた、CPU負荷を低減する傾向があります。例えば、リアルタイムのオーディオ処理では、小さなバッファではドロップアウトが発生する可能性があります。 – dtech
ストリーミングクライアントのネットワーク転送では「バッファリングを無効にする」という意味ではありませんでした。例えば、デフォルトでは、VLCは再生が始まる前に1秒間に1フレーム分のフレームをバッファリングまたはキャッシュしますが、明らかにストリームのレイテンシの上にレイテンシが2倍になります。 BTWのビデオストリーミングでは通常UDPを使用しているため、より良い待ち時間が得られます。 – dtech