MediaElement によるメディアの情報取得について

WPF に用意される MediaElement / MediaPlayer コントロールは、 動画、Gifアニメーション、音声ファイルなどを再生させることができます。 また読み込んだメディアから、例えば動画の幅の情報などを取得することができますが、 正確な情報を取得するためには、読み込みを待機する必要があるようです。

読み込みを待機する

私は旧サイト「MediaElementの挙動について」で、 動画の幅などのプロパティを読み込むためには 「コンポーネントとして追加されているかどうかが基準である」 と記録していましたが、これは厳密には正しくありませんでした。 各種プロパティが参照できる程度に、動画が読み込まれるまで待機する必要があります。

例えば、概ね次のようなコードで動画の幅と高さを取得することができます。 Grid コントロールに MediaElement を追加して読み込みを待機し、 MediaElement が読み込まれた段階で再生して、動画の幅が取得できるまで待機します。 一定時間待機して取得できなければ処理を抜けます。

MediaElement media = new MediaElement();
grid.Children.Add(media);

media.Loaded += (sender, e) =>
{
    // Need to Pre-load to get Width / Height.
    media.Play();
    int count = 0;

    while (media.NaturalVideoWidth == 0)
    {
        if (count == 50)
        {
            media.Stop();
            return;
        }

        Thread.Sleep(100);
        count++;
    }

    int width = media.NaturalVideoWidth;
    int height = media.NaturalVideoHeight;
};

重要なのは media.play() によって再生が開始されていることです。 再生が開始されていない時は、いくら読み込んでも幅などの情報は取得することができません。 もしも再生するよりも前に情報を取得しておきたければ、取得できた段階で再生を止めるなどの処理を追加すれば良いと思います。