2

C#コードに30FPSのビデオのフレームがあり、他のすべてのアプリケーションが使用できるようにローカルホストでブロードキャストしたいと思います。ただし、これはビデオであり、パケットが失われたり、クライアントから接続/受け入れたりする必要がないため、UDPを選択することをお勧めします。

しかし、ここには多くの問題があります。

  • UDPユニキャストを使用する場合は約25FPSの速度で十分です(CPU使用率は25%で、4コアCPUの1つのスレッドで100%を意味しますが、これは理想的ではありません。ただし、少なくとも十分なデータセットを送信します)。ただし、ユニキャストはすべてのクライアントにデータを配信できません。
  • 私が放送を使用する場合、速度は非常に遅いです。同じCPU使用率で約10FPS。

私に何ができる?!データは同じコンピュータにあるので、LANなどからリモートアクセスする必要はありません。同じマシンの異なるアプリケーション間で毎秒約30Mバイトのデータを転送する方法が必要です。(640x480は画像の固定サイズx 30fps xピクセルあたり3バイトは約27000Kバイト/秒です)

  1. UDPマルチキャストの方がパフォーマンスが優れていますか?!
  2. 各クライアントを受け入れて個別に送信した場合でも、TCPを使用するとパフォーマンスが向上しますか?!
  3. ソケットより良い方法はありますか?!メモリーシェアリングか何か?!
  4. なぜUDPブロードキャストはそれほど遅いのですか?!毎秒約10Mバイト?!
  5. 高性能でフレームを圧縮する(1秒間に30 fpsをエンコードし、他の部分でデコードする)高速な方法はありますか?クライアントアプリはC++であるため、これはクロスプラットフォームの方法である必要があります。

ここで他の開発者の経験やアイデアを知りたいので、あなたの考えを書いてください。

編集:

データに関する詳細情報:データはビットマップRGB24形式であり、デバイスから30FPSを使用してアプリケーションにストリーミングされます。このデータを他のアプリケーションにブロードキャストしたいのですが、他のアプリケーションはこの画像をRGB24形式にする必要があります。ヘッダーなどはなく、固定サイズのビットマップデータのみです。すべての操作はその場で実行する必要があります。非可逆圧縮アルゴリズムなどを使用する必要はありません。

4

2 に答える 2

2

私は産業環境でマルチキャストを実験しています。これは、飽和していない信頼できるネットワークよりも良い選択です。

ローカルホストでは、共有メモリが適切な選択となる可能性があります。これは、フレームの循環キューを作成し、ポインタの割り当てを保護するために単一のミューテックスのみで次のキューに切り替えることができるためです(書き込み側)。1人のライター、複数のリーダーで、問題は発生しません。

C ++およびC#を使用するWindowsでは、共有メモリはファイルマッピングと呼ばれますが、システムページングファイル(RAMおよび/またはディスク)を使用できます。

詳細については、これらのリンクを参照してください

共有メモリスペースは保護もプライベートもされていませんが、名前が付けられています。

通常、ライタープロセスがそれを作成し、リーダーがその名前で開きます。ウイルス対策ソフトウェアは、他のすべてのソフトウェアと同じ方法でこの種のI / Oを調べますが、通信をブロックしません。

ファイルマッピングを開始するためのサンプルを次に示します。

char shmName[MAX_PATH+1];
sprintf( shmName, "shmVideo_%s", name );
shmName[MAX_PATH] = '\0';
_hMap =
   CreateFileMapping(
      INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, size, shmName );
if( _hMap == 0 ) {
   throw OSException( __FILE__, __LINE__ );
}
_owner = ( GetLastError() != ERROR_ALREADY_EXISTS );
_mutex = Mutex::getMutex( name );
Synchronize sync( *_mutex );
_data = (char *)MapViewOfFile( _hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0 );
if( _data == 0 ) {
   throw OSException( __FILE__, __LINE__ );
}
于 2013-02-20T20:42:54.767 に答える
0

live555 http://www.live555.com/を使用して、お気に入りのコンプレッサーであるffmpegと組み合わせてストリーミングします。

于 2013-02-19T16:41:13.947 に答える