それでは、前回触れた「私の格闘記」を始めてみようと思います。
ご存じの通り、このブログは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 を直接操作することでのみ表示できます。MediaPlayer は XAML では使用できません。」
おおっ、あるじゃん!
と思い、サンプルも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#コードで書かれており、
おっ、簡単じゃん!
等と考えてしまいました。
なんて、愚かだったんでしょう?
(続く)