動画再生
かんたん動画再生機能
XNA GS 3.1で動画を再生するには以下のステップを踏みます。
- 再生したい動画をコンテントとして追加する
- Video情報をContent.Load<Video>で読み込む
- VideoPlayerクラスを使って再生
- VideoPlayer.GetTexture()メソッドを使って現在のフレームのテクスチャを取得し描画する
変数宣言
動画再生するには、Videoクラスと、VideoPlayerクラスを使います。Videoクラスには再生する動画ファイル情報、動画のサイズやフレームレートなどの情報を含んでいます。VidoPlayerクラスは実際に動画再生するためのクラスで、このクラスを介して動画の再生、停止、一時停止、ループ再生の設定、現フレームをテクスチャとして取得することができます。
// 再生する動画
Video video;
// 動画再生用のプレイヤーインスタンス
VideoPlayer videoPlayer = new VideoPlayer();
動画情報の読み込みと再生
動画情報の読み込みは他のアセットと同様、コンテントマネージャーを介して行います。読み込んだ動画情報をビデオプレーヤーに渡すことで動画再生をすることができます。
Xbox 360の上で、デコーディングなどの動画再生処理は別スレッドで行われているのでゲームのメインスレッドへの影響は最小限になっています。
// 動画情報の読み込み
video = Content.Load<Video>("bear");
// ループ再生の設定
videoPlayer.IsLooped = true;
// 指定のビデオを再生する
videoPlayer.Play(video);
再生フレームの取得
動画の音声部分は自動的に再生されますが、画像部分を表示するにはビデオプレイヤーから現在のフレームをテクスチャとして取得し、SpriteBatch等を使って描画します。GetTextureを呼ぶタイミングは動画のfpsに関係なくいつでも取得することができます。
XNA GS 3.1の動画再生では常に実時間に合わせて動画再生を行うように実装されています。例えば高解像度の動画を性能の低いPC上で再生した場合は動画のフレームレートは落ちるけど、時間的には正しい動画再生をするようになっています。
取得するテクスチャは別スレッドでデコードされた時間的に最も近い動画フレームです。ですから、30fpsの動画を60fpsで動作しているゲーム内で取得した場合は、2フレームが同じ動画フレームを取得することになり、逆に60fpsの動画があった場合、30fpsで動作しているゲーム内で動画フレームを取得した場合は動画データのフレームがスキップすることになります。
// 現在の再生フレームをテクスチャとして取得
Texture2D texture = videoPlayer.GetTexture();
// 取得したテクスチャを使って描画
spriteBatch.Begin();
spriteBatch.Draw( texture, pos, Color.White);
spriteBatch.End();
以下は、Windowsについてくるbear動画をXNA GS 3.1上で再生したものです。10行以下のコードで簡単に動画を再生できるようになっています。
また、再生フレームはテクスチャとして使えるので、取得したテクスチャを3Dモデルに適応することもできます。下の図を見て複数の動画が再生していると気づいた人もいると思いますが、VideoPlayerのインスタンスは複数作ることができ、それぞれに別々の動画を再生することもできます。ただし、それぞれの動画をデコード処理するのに時間が掛かるので、複数のHD動画再生するにはかなりのCPUパワーを必要とすることに注意してください。
再生フォーマット
XNA GS 3.1で再生できる動画の条件として以下があります。
- DRM(デジタル著作権管理)が施された動画は再生できない
- WMV-9 “Main”プロファイル、VC-1エンコードされたもの
- CBR(固定ビットレート)
- 音声トラックがあること
- 音声トラックはWMAエンコード、1パスCBR
- XNA GSがサポートする最大ビットレートは以下の通り
プロファイル | レベル | 最大ビットレート | 解像度とフレームレート |
Main | Low | 2 Mbps | 320 x 240 @ 24Hz (QVGA) |
Medium | 10 Mbps | 720 x 480 @ 30Hz (480p) 720 x 576 @ 25Hz (576p) | |
High | 20 Mbps | 1280 x 720 @ 30Hz (720p) |
Comments
- Anonymous
June 12, 2009
PingBack from http://www.xna-today.jpn.org/archives/829