Delphi FMXのMediaPlayerでmp4を再生

Delphi Advent Calender 2014 の11日を担当します。p_katoです。
初めての投稿になります。よろしくお願いいたします。

Delphi XE7を使ってFireMonkeyのMediaPlayerでmp4を再生します。
もちろんWindows Vista以降で32/64bitの両方での動作をめざします。

FireMonkey(FMX)のMediaPlayerはVCLと違い非ビジュアルコンポーネントになっています。
サンプルが共有ドキュメントの中にありますのでまずそれを見てみましょう。
\Samples\Object Pascal\FireMonkey Desktop\MediaPlayerHD

**以下の作業で動画が再生できます。**
1)動画を表示するビジュアルコンポーネントMediaPlayerControlと動画を管理する非ビジュアルコンポーネントのMediaPlayerをフォームに配置する。
2)MediaPlayerControlのMediaPlayerプロパティにMediaPlayerを指定する。
3)ボタンを配置し

```Delphi:
procedure TForm1.Button1Click(Sender: TObject);
begin
  MediaPlayer.Filename:=’メディアのファイル名’;
  MediaPlayer.Play;
end;
```

と記述する。
4)実行してボタンをクリックすると，動画が読み込まれMediaPlayerControlの領域に動画が再生されます。

MediaPlayerの以下のプロパティが利用できます。

```
・CurrentTime 現在の再生位置
・Duration メディアファイルの合計再生時間 100ns 単位で測定されます。
　秒単位で取得するには、Duration を MediaTimeScale で割ります。 
・State メディアが再生されているかどうか 
　Unavailable 使用不可
　Playing 再生中
　Stopped 停止中
・Volume 現在メディアのオーディオの音量 0:最小 1:最大
```

さらに基本的なメディアプレイヤーの作り方がDockWikiに出ています。
基本的なメディア プレーヤーの作成
http://docwiki.embarcadero.com/RADStudio/XE7/ja/%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2_%E3%83%97%E3%83%AC%E3%83%BC%E3%83%A4%E3%83%BC%E3%81%AE%E4%BD%9C%E6%88%90

これで，mp4ファイルを指定すればmp4ファイルが再生されるはずです。
が，"メディア ファイル ○○○○○ がサポートされていません"
と言うダイアログが出てしまいます。困りました。

DockWikiに戻ってみましょう。
FireMonkey でのオーディオ/ビデオ
http://docwiki.embarcadero.com/RADStudio/XE7/ja/FireMonkey_%E3%81%A7%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%AA/%E3%83%93%E3%83%87%E3%82%AA
「FireMonkey のオーディオ/ビデオ再生機能では、ネイティブ プラットフォームのメディア ファイル形式をサポートしています。」と書かれているのですがmp4はWindows7ならメディアプレイヤーで再生できます。

さらに，FMX.Media.TMediaCodecManagerのDockWikiを見ると
http://docwiki.embarcadero.com/Libraries/XE7/ja/FMX.Media.TMediaCodecManager

Windowsの場合 ビデオの形式： .avi、.wmv と書かれていました。万事休すです。
そこで，DockWikiの「FireMonkey でのオーディオ/ビデオ」を読み直しました。
「TMediaCodecManager を使用すると、カスタム メディア コーデックを登録してオーディオ/ビデオ機能のサポートを拡張することが可能です。」と書かれていたので，どのように登録するのかソースコードをたどっていくと，aviやwmvとともにmp4が登録されているではありませんか！！

mp4が登録されているにもかかわらずドキュメントにはサポートの記述がありません。実際に実行するとエラーになります。どうも腑に落ちません。

「Windows の実装では DirectShow を使用しており、オーディオ/ビデオ機能はあらゆる Windows バージョンで動作します。」とあります。DirectShowで動画を再生するのはDirectX9ですから，DirectX9でmp4が再生できないためにMediaPlayerで再生できないのではないかと考えました。そこで，32/64bitの両方に対応したmp4のコーデックをインストールすることにしました。
インストールが簡単なK-Lite 10.8.6のBasicを入れて試すことにしました。K-Liteはバージョン10より64bitと32bitが統合されています。
コーデックは http://www.codecguide.com/ よりダウンロードできます。

すると，ソースコードに全く手を加えることなくWindows環境でmp4ファイルを再生することができました。当たり前ですが，再コンパイルも必要ありませんでした。

このコーデックはWindows8でも利用できるそうです。FMXのMediaPlayerはそのしくみからWindows8でもmp4を再生できませんから，コーデックをインストールする必要があると思います。

OSXではFMXのMediaPlayerでmp4を再生することができますから，これでどちらのOSでもmp4を再生することができるようになったわけです。

もしも事前にコーデックをインストールしていたらこのことに気づかずに利用される方にご迷惑をおかけするところでした。

今回はコーデックのインストールで回避しましたが，Media Foundationを使ってTMediaCodecClassを書けば，MediaCodecManagerを使って登録し，コーデックなしでmp4が再生できるようになるかもしれません。 

#まとめ：
Delphi XE7のMediaPlayerはDirectX9で実装されており，OSのメディアプレイヤーでmp4が再生できても，そのままではmp4を再生できない，しかしmp4は既に登録されているので，DirectX9のmp4コーデックをインストールすれば再コンパイルしなくてもmp4が再生できる。お客様の環境でmp4が再生できないケースが想定されるので注意すること。

#追記:
2020/06/15現在の最新版 10.4 Sedneyではmp4がサポートされており，コーデックのインストールは必要なくなっております。
http://docwiki.embarcadero.com/Libraries/Sydney/ja/FMX.Media.TMediaCodecManager
Berlin 10.2.3 からDirectX 12をサポートしているようです。
http://docwiki.embarcadero.com/RADStudio/Sydney/ja/Berlin_%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BD
10.4の基本的なメディア プレーヤーの作成
http://docwiki.embarcadero.com/RADStudio/Sydney/ja/%e5%9f%ba%e6%9c%ac%e7%9a%84%e3%81%aa%e3%83%a1%e3%83%87%e3%82%a3%e3%82%a2_%e3%83%97%e3%83%ac%e3%83%bc%e3%83%a4%e3%83%bc%e3%81%ae%e4%bd%9c%e6%88%90