Silverlight 4 の新しい Web カメラ機能は、非常にクールです。ブラシとして公開することで、Flash が持つものをはるかに超えたシナリオが可能になります。
同時に、ウェブカメラにローカルでアクセスすることは、話の半分に過ぎないように思えます。自分の写真を撮って面白い顔を作るために Web カメラを購入する人はいません。彼らは、結果のビデオ ストリームを他の人に見てもらいたい、つまり、そのビデオをインターネット、一般の Skype、または他の数十のビデオ チャット サイト/アプリケーションのいずれかにストリーミングしたいので、Web カメラを購入します。そして、これまでのところ、私はそれを行う方法を理解していません
hereに示されているように、生の (Format32bppArgb 形式の) バイトストリームを取得するのは非常に簡単であることがわかります。
しかし、生のバイトストリームをサーバーに送信したくない場合 (帯域幅を大量に消費する可能性があります)、何らかの方法でエンコードする必要があります。そして、それはより複雑です。MS は Silverlight にいくつかのコーデックを実装していますが、私が知る限り、それらはすべてビデオ ストリームのデコードに重点を置いており、そもそもエンコードはしていません。それと、そもそも H.264 コーデックなどに直接アクセスする方法がわからないという事実は別として。
オープンソースのコーデックは山ほどありますが (たとえば、ここの ffmpeg プロジェクトでは)、それらはすべて C で記述されており、C# への移植は容易ではないようです。このように見える10000行以上のコードを翻訳するのがあなたの楽しみのアイデアでない限り:-)
const int b_xy= h->mb2b_xy[left_xy[i]] + 3;
const int b8_xy= h->mb2b8_xy[left_xy[i]] + 1;
*(uint32_t*)h->mv_cache[list][cache_idx ]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[0+i*2]];
*(uint32_t*)h->mv_cache[list][cache_idx+8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[1+i*2]];
h->ref_cache[list][cache_idx ]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[0+i*2]>>1)];
h->ref_cache[list][cache_idx+8]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[1+i*2]>>1)];
Mono プロジェクト内の mooncodecs フォルダー (こちら) には、C# の複数のオーディオ コーデック (ADPCM および Ogg Vorbis) と 1 つのビデオ コーデック (Dirac) がありますが、Java と同様に、それぞれの形式のデコード部分のみを実装しているようです。それらが移植された実装。
Ogg Theora 用の C# コーデック (csTheora、http://www.wreckedgames.com/forum/index.php?topic=1053.0 ) を見つけましたが、ベースとなっている jheora コーデックと同様に、デコードのみです。
もちろん、C や C++ からコーデックを移植するよりも Java からコーデックを移植する方がおそらく簡単ですが、私が見つけた唯一の Java ビデオ コーデックはデコード専用 ( jheoraや jirac など) でした。
だから私はちょっと振り出しに戻っています。Silverlight を介して Web カメラ (またはマイク) をインターネットに接続するためのオプションは次のとおりです。
(1) Microsoft がこれに関するガイダンスを提供するのを待ちます。
(2) C または C++ コーデックの 1 つを Silverlight 互換の C# に移植することに脳のサイクルを費やします。
(3) 圧縮されていない未加工のバイトストリームをサーバーに送信し (または zlib などでわずかに圧縮)、サーバー側でエンコードします。また
(4) 私より賢い誰かがこれを理解し、解決策を提供するのを待ちます.
他の誰かがより良いガイダンスを持っていますか? 他の人には明らかな何かを見落としていませんか? (たとえば、Silverlight 4 には、これを処理する、私が見逃したクラスがいくつかありますか?)