2017-06-09 4 views
-1

ウェブカメラの小さな画像(〜0.5MB)をクライアントに毎秒25フレームで送信するシンプルなWebサーバーを作成しました。しかし、実行時にはかなり長い遅延(LAN上で2秒と見積もられています)があり、タスクマネージャーを使用して帯域幅の使用状況を確認すると100mbpsの帯域幅の100%を利用します。私はC#/ .NETにはまだまだ慣れていません。これはメインのサーバーループです。C#MemoryStream TCP/IP帯域幅を超過する

image = grabBitmapBlocking(); 
// Console.WriteLine("FPS: " + Aruco.FpsCounter.CalculateFrameRate()); 
//image.RotateFlip(RotateFlipType.RotateNoneFlipX); 

// save it to jpeg using quality options 
m.Position = 10; 
image.Save(m, myImageCodecInfo, myEncoderParameters); 

// Send the length as a fixed length string 
m.Position = 0; 
m.Write(Encoding.ASCII.GetBytes((m.Length - 10).ToString("d8") + "\r\n"), 0, 10); 
Console.WriteLine("sent " + m.Length + " bytes or " + m.Length/1e6 + " megabytes"); 
// send the jpeg image 
serv.SendToAll(m); 

// Empty the stream 
m.SetLength(0); 

// remove the image from memory 
image.Dispose(); 
image = null; 

誰でも私に可能性のある問題がありますか?

ありがとうございます。

+2

将来は投稿の書式設定にもっと力を入れてください。あなたは投稿をたくさん作成しました。投稿を見やすくするために他人に頼るのではなく、投稿をする前にプレビューを見て、エディタの使い方を理解するのに十分簡単です。 –

+1

'serv.SendToAll(m);は何ですか?この行を削除するとパフォーマンスの問題がなくなります(機能の損失は無視されます) –

+0

実際、基本的にはスニペットではなく[mcve]が必要です。ストリームの大きさなどについて何も教えていないのですが... https://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/ –

答えて

0

まず、基本的な学校の数学を確認してください。

小画像25x0.5メガバイト= 12.5メガバイトである第二

当たり25のフレームでクライアントへウェブカムの(〜0.5メガバイト)。これには約125メガビットの帯域幅が必要です。

私は100 mbpsの帯域幅の100%を利用します。

私の基本的な学校の数学が示しているように、さらに必要があります。論理。ビデオストリームがエンコードされ、ビットマップの組み合わせとして送信されない理由があります。

私はC#/ .NETにはかなり新しく、なぜ/どのように起こっているのですか?

基本的なロジックではかなり新しいものではないようにしてください。これはあなたが行うことです。 ビデオストリームは、ビデオコーデックを使用してエンコードされています。動きの少ない画像はSMALLと表示されます。あなたはこれを処理するのに最も非効率的な方法を使い、その後あなたの数値を実行するのに失敗します。

+0

ああ、ああ...これは今、恥ずかしがり屋です。ええ、もちろん。バイト対ビットええと...ありがとう.... – Aeefire

+0

私はあなたの前にあなた自身のロジックをチェックして、他の人を怒らせる。 12.5メガバイト= 100メガビットではなく、125. – ChrisBint

+0

@ChrisBintはタイプミスだと思っています...無礼にする必要はありません;) – Aeefire

関連する問題