それでは、前回触れた「私の格闘記」を始めてみようと思います。

 

ご存じの通り、このブログは2002年にVectorにリリースした、当時のフリーのC++コンパイラーの一つ、BCC(Borkand C++ Compiler 5.5)の開発環境としてリソースエディター、BCCSkeltonライブラリー、スケルトン作成ウィザードと各種ツールのパッケージであるBCCForm and BCCSkelton(含サンプルプログラム)を、20年後に定年退職した爺いがボケ防止のためにアップデート(含Unicode版のECCSkelton)して、その使い方解説の為にサンプルプログラムを紹介するものです。

 

元々はEmbarcadero C++ Builderの無償版(と言っても1年だけ)をダウンロードして使おうとしたのですが、メモリーエラー等トラブルがあった為、使い慣れた20年前の遺物である自分のBCCForm and BCCSkeltonを掘り返(ダウンロード)して使い始め、アップデートされたEmbarcadero C++ Compiler(bcc32c.exe)に対応させ、20年前は(Microsoft Visual C++とMFCにはできて)BCCではできなかった、

(1)テキストを音声で発音するTextToSpeech(既に音声認識と合体してSAPIになっていたが)、

(2)動画をコントロールで再生するDirectShowや、

(3)ExplorerのようにTreeViewやListViewでPCのファイルを表示するShell等

のCOMをBCCForm and BCCSkeltonで利用できる自作ラッパーを作り、サンプルも増やして解説したりもしていました。(注)

注:いずれも今の64bit PC時代の水準では「低レベル」と言われそうですが、「失われた20年」をPC、Windows、C++、bcc32.exe(現在はbcc32c.exe)、Win32API等の復習と新しい技術の学習をする機会になりました。

 

しかし、既にWindows 10もサービス終了が見えてきて、PCが64bitでないと動かなくなりそうになって、私も徐々に学習成果から「BCCForm and BCCSkeltonを断捨離」する覚悟を固め始め、代わりに(注)C#を学習したりしました。

注:BCCSkeltonでWindowsに付属するcsc.exe(C# 5)を使うMSCompAssを作ったことが契機でしたが...

 

その結果、(必要に迫られて作成した)ResWriter、ResReaderや、一般ツールとしてのReplacer、CardboardBox、アミューズメントサンプルのMazeやChinchirorinを作り、ブログネタにしましたが、段々とネタ切れに陥り、「矢張り新しいコントロールの利用などもやろう」とMSChart等のサンプルを作ってはネタにしていました。

 

そんな時に、

BCCSkeltonでもやったTextToSpeech、DirectShowなどはどんな形でC#で使われているのだろう?

と思い立ち、調べ始めたのが発端です。

 

最初はC#で利用できるCOMを調べました。基本的にはWin32APIベースのCOMをInterOperabilityという手法でラッパーを作ることにより使えるようになるということはわかりましたが、断捨離するBCCForm and BCCSkeltonで既にラッパーをつくっているものいまさらなんかなー」とテンションが下がりました。「正直もう何年もたっているんだからC#用の洗練されたコントロールはないの?」とおもい、".NET"とか".NETFramework"とかで利用できる動画再生コントロールをつらつらとGoogleで探していました。

そうしたら、

こんなものを見つけました。

「このページWindows メディア プレーヤーSDKに関連付けられている機能は、レガシ機能です。 MediaPlayerに置き換わりました。MediaPlayerは、Windows 10とWindows 11用に最適化されています。新しいコードでは、可能な場合は SDK ではなく MediaPlayerWindowsメディア プレーヤー使用することを強くお勧めします。Microsoftは、従来のAPIを使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。」

あるじゃん!

 

でも、この記事はVisual Studioベースのものだったので、「じゃあ、MediaPlayerクラスのC#コードの記述」を調べようとしていると、またこんなものを見つけました。

(注)

注:はっきりと"Windows Presentation Foundation"とか"WPF"とか書かれていますが、私はその段階ではまだその本当の意味が分かっていませんでした。

 

メディア API
MediaElementおよびMediaPlayerクラスは、オーディオまたはビデオのコンテンツを表示するために使用されます。これらのクラスは、対話式またはクロックで制御できます。これらのクラスは、Microsoft Windows Media Player 10 コントロールでメディアの再生に使用できます。どちらのクラスを使用するかは、シナリオによって決まります。
MediaElementは、レイアウトでサポートされている UIElement であり、多くのコントロールのコンテンツとして利用できます。また、Extensible Application Markup Language (XAML) とコードでも使用できます。それに対し、MediaPlayer は Drawing オブジェクト向けに設計されていて、レイアウトではサポートされていません。MediaPlayerを使用して読み込まれたメディアは、VideoDrawing を使用するか、DrawingContext を直接操作することでのみ表示できます。MediaPlayerXAML では使用できません。

おおっ、あるじゃん!

と思い、サンプルもMediaElementは(私の嫌いな)Xaml

"<!-- This page shows a simple usage of MediaElement -->

 <Page x:Class="MediaElementExample.SimpleUsage"

      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 

      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="SimpleUsage"

     >

     <StackPanel Margin="20">

         <MediaElement Source="media/numbers-aud.wmv" />

     </StackPanel>

 </Page>"

等と書かれていますが、MediaPlayerは、

"//

 // Create a VideoDrawing.

 //

 MediaPlayer player = new MediaPlayer();

 player.Open(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));

 VideoDrawing aVideoDrawing = new VideoDrawing();

 aVideoDrawing.Rect = new Rect(0, 0, 100, 100);

 aVideoDrawing.Player = player;

 // Play the video once.

 player.Play();"

とC#コードで書かれており、

おっ、簡単じゃん!

等と考えてしまいました。

なんて、愚かだったんでしょう?

(続く)