5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Delphi / AppmethodAdvent Calendar 2014

Day 11

Delphi FMXのMediaPlayerでmp4を再生

Last updated at Posted at 2014-12-10

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)ボタンを配置し

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

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?