WindowsMediaPlayer ActiveXを使ってDVDを再生するには?

解決


Delphi大好き  2011-03-24 01:11:34  No: 40285

久々に質問します。
色々ググっても得られなかったので、
お知恵をお貸しいただけると助かります。

環境は、Delphi7、XP、Vista(実行先環境)です。

TMSWebDVDではVistaでは動かないので、
WindowsMediaPlayer  ActiveXを使って、DVDを再生させたいと考えています。

しかし、自力では不可能、ググってみましたが、
WindowsMediaPlayer  ActiveXで再生出来るらしい、
とまでは判ったのですが、その方法やソースを見つけられずにいます。

どなたか、WindowsMediaPlayer  ActiveXでDVDを作った、又はそのページ、参考書を知っている、
という方がいましたら、お教えいただけると助かります。


KHE00221  2011-03-24 08:36:27  No: 40286

WMP って 標準じゃ DVD 再生できないだろ?


Delphi大好き  2011-03-24 09:57:07  No: 40287

以下のMSDNのページで、htmlでDVD再生が出来るというページまでは見つけたのですが、
対応バージョンがかなり古いらしく、XPですら再生出来ませんが、
これを見てwindowsmediaでDVDを再生出来ると思ったわけです。

http://msdn.microsoft.com/ja-jp/library/cc429855.aspx

やはりXP以降では無理なのでしょうか?


KHE00221  2011-03-24 18:08:42  No: 40288

DVD再生プラグイン

http://windows.microsoft.com/ja-JP/windows/downloads/windows-media-player/plug-ins

通常の WMP で DVD が再生されるのであれば

DVDのファイルを指定すれば普通に再生されるけど?

  WindowsMediaPlayer1.URL := 'Q:\VIDEO_TS\VIDEO_TS.IFO';
  WindowsMediaPlayer1.controls.play;


Delphi大好き  2011-03-25 07:16:48  No: 40289

ありがとうございます、普通に再生出来ました!

そこで、上記のHTMLのDVDプレイヤーを参考にしてみたのですが、
色々試してみたものの、DVDのトップメニューを表示する事が出来ませんでした。

WindowsMediaPlayer1.DVD.Topmenu;
だと、エラーになってしまいます。

何か方法は無いのでしょうか?

よろしくお願いしますm(__)m。


D  2011-03-25 08:08:25  No: 40290

Del6、XPのSP3でしか確認してませんが参考になれば。
http://cult-drang.com/program/tips/wmp/dvdplay.html

タイトルメニューやトップメニューへ移動するにはdvdオブジェクトが必要になります。
ただ標準のTWindowsMediaPlayerにはdvdオブジェクトがないので、ControlInterfaceインターフェースをIWMPPlayer4DispかIWMPPlayer4でキャストして使います。 

var
  {$WARN SYMBOL_PLATFORM OFF}
  l_Dvd: IWMPPlayer4Disp
  {$WARN SYMBOL_PLATFORM ON}
begin
  {$WARN SYMBOL_PLATFORM OFF}
  l_Dvd := IWMPPlayer4Disp(WindowsMediaPlayer1.ControlInterface).dvd;
  {$WARN SYMBOL_PLATFORM ON}

  if (l_Dvd.isAvailable['titleMenu']) then begin
    l_Dvd.titleMenu
  end;

「シンボル 'IWMPPlayer4Disp' はプラットフォームに依存すると宣言されています」という警告メッセージを回避するため{$WARN SYMBOL_PLATFORM OFF}を使用しています。


KHE00221  2011-03-25 08:34:53  No: 40291

WindowsMediaPlayer1.DVD.Topmenu;
で表示されるけどな?

BDS2006 + XP

WMP
 version 9.00.00.4510
デコーダー
 InterVideo MP3 + DVD XPack
WMP ActiveX
 WindowsMediaPlayer version 1.00 Win32\Wmp.dll


Delphi大好き  2011-03-25 11:23:48  No: 40292

>KHE00221さん
ご指摘ありがとうございます。

こちらでのコードです。

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not opendialog1.Execute then
    exit;
  WindowsMediaPlayer1.URL := opendialog1.FileName;
  WindowsMediaPlayer1.controls.play;
end;
を実行した後に、

procedure TForm1.Button4Click(Sender: TObject);
begin
  WindowsMediaPlayer1.DVD.topMenu;
end;
を実行すると、

プロジェクト  Profect1.exe が  EAccessViolation クラスの例外を生成しました。
アドレス 0F10718B でアドレス  0F10718B  に対する読み込み違反が起きました。

となります。

開発環境が悪いのかと思い、Vistaマシンで走らせて同様の操作をして試したところ、
フリーズして強制終了になりました。

開発環境
パナソニック  レッツノートCF-W8
WindowsXP Profssional Version 2002 ServicePack3
(Vistaからのダウングレード)
WindowsMediaPlayer11 Ver.11.05721.5280
現状での状態:PCの仕様上、WindowsMediaPlayerからのDVD再生だと、何故か音声が出ない。
(Vista使用時の時は音声再生可でした。)

実行先環境
富士通FMV  LOOX  U/B50
WindowsVista HomePremium
2007 SevicePack1
WindowsMediaPlayer11
2006 ver 11.0.6001.7000
(こちらの環境では問題なく音声は出ました。)

再生するDVDを代えてみたところ、
WindowsMediaPlayer1.DVD.topMenu;
を実行しなくても、再生すると自動的にトップメニューが出ました。
しかし、WindowsMediaPlayer1.DVD.topMenu;を実行すると、
上記のエラーメッセージが出ます。実行先環境だとフリーズして強制終了になります。

>Dさん

コードの紹介ありがとうございます。
早速試してみたのですが、
こちらでは何故かコンパイル出来ませんでした。

そこで、Dさんのホームページから、test.zipをダウンロードしてみました。
実行ファイルでは問題なく動き、
プロジェクトはコンパイルまではうまくいくのですが、
ファイルメニューをクリックしたところで、

アドレス  0F10718B  で  アドレス  0F10718B  に対する読み込み違反がおきました。

となります。

どうやら、開発環境とDelphiの組み合わせが悪いのかも知れません・・・。
パナソニックレッツノート、何かとマルチメディア関連の機能が問題ありありです・・・。
ビジネス用PCなのだから、しょうがないのかも知れませんが・・・。

また忙しくなってきたので、少し報告が遅れるかも知れません・・・。
進展があったらまた報告しますm(__)m。


Delphi大好き  2011-03-26 11:09:00  No: 40293

報告です。
少し苦労しましたが、思いの外早く出来ました。
チャプター移動だけですが、
プリインストールMPEG2デコーダでも、ローテクで何とかなりました。
まだバグがあるかも知れませんが、取りあえず動きました。

取りあえず、これで解決とさせていただきます。
皆さんありがとうございましたm(__)m。

以下が、簡単な出来上がったサンプルです。

//DVD読み込み
procedure TForm1.Button1Click(Sender: TObject);
var
  c:char;
  s:string;
begin
  if not opendialog1.Execute then
    exit;
  s := opendialog1.FileName;
  c := s[1];
  DirectoryListBox1.Drive := c;
  DirectoryListBox1.Directory := ExtractFileDir(opendialog1.FileName);

  WindowsMediaPlayer1.URL := opendialog1.FileName;
  WindowsMediaPlayer1.controls.play;
  caption := WindowsMediaPlayer1.currentMedia.sourceURL;

  WindowsMediaPlayer1.controls.currentItem :=
  WindowsMediaPlayer1.currentPlaylist.Item[0];
  timer1.Enabled := true;
end;

//チャプター検索タイマー
procedure TForm1.Timer1Timer(Sender: TObject);
var
  s:string;
begin
  s := WindowsMediaPlayer1.currentMedia.sourceURL;
  if s[14] <> 'n'  then begin
    Button6Click(sender);
    timer1.Enabled := false;
  end;  
end;

//チャプター表示
procedure TForm1.Button6Click(Sender: TObject);
var
  i: Integer;
begin
  for i := 1 to WindowsMediaPlayer1.currentPlaylist.count do begin
    combobox1.Items.Add(
    Format('%3d %s', [i, WindowsMediaPlayer1.currentPlaylist.Item[i-1].name]));
  end;
end;

//チャプター移動
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  WindowsMediaPlayer1.controls.currentItem :=
  WindowsMediaPlayer1.currentPlaylist.Item[combobox1.Itemindex];
end;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加