さて、今回WPFを学習する主動機であるこれのうち、動画の再生を取り上げてみます。
さて、この段階では
「こんなものを見つけました。
『このページWindows メディア プレーヤーSDKに関連付けられている機能は、レガシ機能です。 MediaPlayerに置き換わりました。MediaPlayerは、Windows 10とWindows 11用に最適化されています。新しいコードでは、可能な場合は SDK ではなく MediaPlayerWindowsメディア プレーヤー使用することを強くお勧めします。Microsoftは、従来のAPIを使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。』」
を引用しましたが、今よく見るとこれはまだまだレガシーなんですね。(Microsoft Learningの範疇が「アプリ/Win32/デスクトップ テクノロジ/音声とビデオ/Windows メディア プレーヤー SDK」になっています。)これは.NETでも.NET Frameworkでもないです。事実、自分でも気が付いて、
「『じゃあ、MediaPlayerクラスのC#コードの記述』を調べようとしていると、またこんなものを見つけました。
(注)
注:はっきりと"Windows Presentation Foundation"とか"WPF"とか書かれていますが、私はその段階ではまだその本当の意味が分かっていませんでした。」
と書いています。これは(今は断言できますが)正解ですね。そして、このWPFのサイトで動画再生について、
「『メディア API
....(後述)
MediaElementおよびMediaPlayerクラスは、オーディオまたはビデオのコンテンツを表示するために使用されます。これらのクラスは、対話式またはクロックで制御できます。これらのクラスは、Microsoft Windows Media Player 10 コントロールでメディアの再生に使用できます。どちらのクラスを使用するかは、シナリオによって決まります。
MediaElementは、レイアウトでサポートされている UIElement であり、多くのコントロールのコンテンツとして利用できます。また、Extensible Application Markup Language (XAML) とコードでも使用できます。それに対し、MediaPlayer は Drawing オブジェクト向けに設計されていて、レイアウトではサポートされていません。MediaPlayerを使用して読み込まれたメディアは、VideoDrawing を使用するか、DrawingContext を直接操作することでのみ表示できます。MediaPlayer は XAML では使用できません。』」
この文章の意味を当時は正確に理解していませんでしたが、今は分かります。要すれば、
「動画再生は(Win32のコントロールのようにオブジェクト化できる)UIElementとしての("形のあるものとしてXAMLでレイアウトできる")MediaElementと、(XAMLでレイアウトする為の形を伴わない)"描画機能"としてのMediaPlayer」
の二通りのソリューションがある、ということですね。
「じゃぁ、どっちを使えばいいの?」という当然の疑問が生じますが、それに対して前出のMicrosoft Learningでは,
「『メディア API
MediaElement および MediaPlayer クラスは、オーディオまたはビデオのコンテンツを表示するために使用されます。 これらのクラスは、対話式またはクロックで制御できます。 これらのクラスは、Microsoft Windows Media Player 10 コントロールでメディアの再生に使用できます。 どちらのクラスを使用するかは、シナリオによって決まります。」
としか書いていません。
じゃ、どーするの?
ということで、
両方ともやっちゃいましょう!
というソリューションを採ることにしました!(まぁ、簡単な解法ですよね?)
ps. 順序はWin32でもわかりやすいUIElement(Win32なら「コントロール」と言い換えてもよいかと)のMediaElement
から行きましょう。実際、MediaPlayerは
Win32の感覚では「うへぇ、大変だねぇ」というような、WPFらしいものだったからです。(って、見た目は全く変わりありませんが...)