2012年

4月

04日

XNAで動画再生してみただけ

小ネタ回です。

 

XNAで動画再生が出来ると聞いて早速実装してみました。

といっても、XNAでは特に難しいことをすることは無く簡単に実装することが出来ます。

 

●読み込み方

①XNAゲームプロジェクトのコンテンツに動画ファイルを追加

②Content.Loadで動画名を指定→Microsoft.Xna.Framework.Media.Videoクラス作成

 

これで終わりです。とても簡単ですね。

Videoクラスの構造はこのようになっています。

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
namespace Microsoft.Xna.Framework.Media
{
    public sealed class Video
    {
        /// <summary>
        /// 動画の再生時間
        /// </summary>
        public TimeSpan Duration { get; }

        /// <summary>
        /// 動画のFPS(フレーム レート)
        /// </summary>
        public float FramesPerSecond { get; }

        /// <summary>
        /// 動画の横幅
        /// </summary>
        public int Width { get; }

        /// <summary>
        /// 動画の縦幅
        /// </summary>
        public int Height { get; }

        /// <summary>
        /// 動画の音声トラックの種類
        /// Music = 0, Dialog = 1, MusicAndDialog = 2
        /// </summary>
        public VideoSoundtrackType VideoSoundtrackType { get; }
    }
}

次は再生方法。こちらも非常に簡単です。

 

●再生方法

①Microsoft.Xna.Framework.Media.VideoPlayerクラスを作成

②VideoPlayer.Playメソッドで再生開始 引数に再生したいVideoクラスを渡す

 

これで動画が再生されます。

一度再生すればフレームの更新は自動的に行われ、処理速度にかかわらずリアルタイムの時間で更新されます。

 

ただ、これだと動画音声は再生されますが映像は表示されません。動画から現フレームの画像を取得→バックバッファに画像を描画をすることで初めて映像が出力されます。なので描画周りだけ自前でやる必要があります。

 

幸い、VideoPlayerクラスには簡単に映像を取得できるメソッドが用意されています。

1
2
3
4
//
// 概要:
//     再生中のビデオの現在のフレームを含む Texture2D を取得します。
public Texture2D GetTexture();

このメソッドを描画時に呼び出すことでリアルタイムの映像をテクスチャとして受け取ることが出来ます。受け取ったTexture2Dクラスをスプライト描画するなり、メッシュにテクスチャとして貼り付けるなりで画面に表示されるわけです。とても簡単ですね。

 

VideoPlayerクラスの構造はこのようになっています。GetTextureメソッド以外を表記しておきます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
public sealed class VideoPlayer : IDisposable
{
    /// <summary>
    /// コンストラクタ
    /// </summary>
    public VideoPlayer();

    /// <summary>
    /// オブジェクトが破棄されているかどうかを示す値を取得します。
    /// </summary>
    public bool IsDisposed { get; }

    /// <summary>
    /// 動画がループ再生しているかどうかを示す値を取得します。
    /// </summary>
    public bool IsLooped { get; set; }

    /// <summary>
    /// 動画の音声を消音にするかどうかを示す値を取得または設定します。
    /// </summary>
    public bool IsMuted { get; set; }

    /// <summary>
    /// 現在再生中の動画の再生位置を取得します。
    /// </summary>   
    public TimeSpan PlayPosition { get; }
    
    /// <summary>
    ///  現在再生中の動画の再生状態を取得します。
    ///  Stopped = 0, Playing = 1, Paused = 2,
    /// </summary>
    public MediaState State { get; }
    
    /// <summary>
    /// 現在再生している動画を取得します。これはPlayメソッドで指定しを受け取ることが出来ます。
    /// </summary>
    public Video Video { get; }

    /// <summary>
    /// 動画音声の音量を取得または設定します。
    /// </summary>
    public float Volume { get; set; }

    /// <summary>
    /// このオブジェクトで使用されているアンマネージ リソースを直ちに解放します。
    /// </summary>
    public void Dispose();

    /// <summary>
    /// 現在再生している動画を一時停止します。
    /// </summary>
    public void Pause();

    /// <summary>
    /// 動画の再生を開始します。
    /// 
    /// 引数:
    ///     video:
    ///         再生をするVideoクラス。
    public void Play(Video video);
    
    /// <summary>
    /// Pauseメソッド一時停止した動画をを再開します。
    /// </summary>
    public void Resume();

    /// <summary>
    /// 動画を停止します。
    /// </summary>  
    public void Stop();
}

前回のベンチマークに動画再生を追加してみました。

MMDのデフォルトステージのモニターにテクスチャとして貼り付けています。

 

モーションと映像は「FREELY TOMORROW」を使用させていただきました。

動画キャプチャをしていたのでフレームレートが若干落ちていますが、私のPCだと通常ではエフェクト+動画再生+モデル10体表示で60fpsを維持できました。

 

やはり動画再生すると若干遅くなりますが、そこまでの負担にはならないようです。気にならないレベルでした。

見栄えをよくする為に「液晶ディスプレイシェーダー」を組んでみました。

参考:Maverick Project

 

モニターを見る角度によって色調が変わります。

正面から見ると差異はないですが、斜めから見るとわかりやすいです。

角度が真横に近づくにつれ画面が白くなっていきます。

●動画再生の条件ひにけにXNA様から引用)

  1. 再生できる動画フォーマットはWMV(Windows Media Video)のみ
  2. DRM(デジタル著作権管理)が施された動画は再生できない
  3. WMV-9 “Main”プロファイル、VC-1エンコードされたもの
  4. CBR(固定ビットレート)
  5. 音声が無い動画は使用できない
  6. 音声トラックはWMAエンコード、1パスCBR 
  7. XNA GSがサポートする最大ビットレートは以下の通り
レベル 最大ビットレート 解像度とフレームレート
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)

エンコードした動画の音声が劣化する場合があるので、そのときはXACT3プロジェクトに音声waveを追加して映像と音声を別々に再生したほうが良いです。きれいな音を再生することが出来ます。

 

それと動画ファイルは.xnb変換されずにそのまま使用されるので、ゲーム・アプリケーションを配布する場合はなるべく大きな動画を使用するのは控えたほうが良いでしょうね。

お借りしたモーション・ムービー