ページ

2009年3月30日月曜日

[Silverlight] MediaStreamSource を使って動的にビデオ・サウンドを作る

赤坂玲音Blog: 「Silverlight 3 ベータ
さすが赤坂さんだ。
Perspective 3D と Pixel Shader Effects のサンプル動画がすばらしい。
一目見て、慈...もとい、慈愛に満ちた作風に定評のある大型新人 JeffP の作品とわかりますねw

なんてことが書きたかったわけではなくw ↓についてです。

MIX09 のセッションによると、低水準なサウンドやメディア API も追加され、動的にメディアを生成できるようになるようなので今から楽しみです。

以前 「[Silverlight] Silverlight 3 で Commodore 64 エミュレータ?」 で紹介した Pete Brown 氏が MediaStreamSource を使って動的にビデオを生成する方法について記事を書かれてました。
Silverlight 3 ? Creating Video from Raw Bits using a MediaStreamSource

まず、MediaStreamSource は Silverlight 2 からあったけれども、サポートされているフォーマットに変換する必要があったそうです。(そのため使いにくかった、もしくは、現実的には使い物にならなかった、という意味かな?)
しかし、Silverlight 3 でははるかに簡単にビデオを生成することができるようになったそうです。

コード例が掲載されていますが、ざっと見ると、

  • MediaStreamSource クラスを継承して、
  • 初期化時に幅×高さ×BytesPerPixel の byte 配列を確保。これがいわゆる VRAM。
  • OpenMediaAsync をオーバーライドして、MediaSourceAttributesKeys.Duration、MediaSourceAttributesKeys.CanSeek、MediaStreamAttributeKeys.VideoFourCC、MediaStreamAttributeKeys.Height、MediaStreamAttributeKeys.Width を設定。
  • GetSampleAsync をオーバーライドして、VRAM の内容を Stream 経由で MediaStreamSource に渡す。

本質的にはこれだけですね。
自分でもちょこっと試してみましたが、ほんとにこれだけでちゃんと表示されました。
(DDA (ブレセンハムのアルゴリズム) のコードを拝借してきて線分を描画してみたくらいですが)

コード例では byte 配列を 2つ確保して flip で切り替えてます。
VRAM に書きこんでいる最中に GetSampleAsync が呼ばれるとちらついたりするからじゃないかと思います。
(それ以前に、あるスレッドが書きこんでる最中に別のスレッドが読み込むことがあるってのはあまりよろしくないと思うのでちゃんと lock なりした方がいいように思いますが)

確かにほんとに簡単にビデオが動的に生成できますね。
こりゃ、おもしろい。

さらに、
Creating Sound using MediaStreamSource in Silverlight 3 Beta
にてサウンドを動的に生成する方法も紹介してくださっています。
基本的には動画の場合と同じで、単に画像では無く WaveFormatEx を動的に作る点が異なるだけみたいです。
これを使って
http://www.irritatedvowel.com/Silverlight/sl3/Synth/Default.html
 (注意 不安定でバギーだと書かれています。また、当然 Silverlight 3 beta が入っていないと動きません)
こんなのまで作ったそうです。
すげぇ


0 件のコメント:

コメントを投稿