久々に質問します。
色々ググっても得られなかったので、
お知恵をお貸しいただけると助かります。
環境は、Delphi7、XP、Vista(実行先環境)です。
TMSWebDVDではVistaでは動かないので、
WindowsMediaPlayer ActiveXを使って、DVDを再生させたいと考えています。
しかし、自力では不可能、ググってみましたが、
WindowsMediaPlayer ActiveXで再生出来るらしい、
とまでは判ったのですが、その方法やソースを見つけられずにいます。
どなたか、WindowsMediaPlayer ActiveXでDVDを作った、又はそのページ、参考書を知っている、
という方がいましたら、お教えいただけると助かります。
WMP って 標準じゃ DVD 再生できないだろ?
以下のMSDNのページで、htmlでDVD再生が出来るというページまでは見つけたのですが、
対応バージョンがかなり古いらしく、XPですら再生出来ませんが、
これを見てwindowsmediaでDVDを再生出来ると思ったわけです。
http://msdn.microsoft.com/ja-jp/library/cc429855.aspx
やはりXP以降では無理なのでしょうか?
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;
ありがとうございます、普通に再生出来ました!
そこで、上記のHTMLのDVDプレイヤーを参考にしてみたのですが、
色々試してみたものの、DVDのトップメニューを表示する事が出来ませんでした。
WindowsMediaPlayer1.DVD.Topmenu;
だと、エラーになってしまいます。
何か方法は無いのでしょうか?
よろしくお願いしますm(__)m。
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}を使用しています。
WindowsMediaPlayer1.DVD.Topmenu;
で表示されるけどな?
BDS2006 + XP
WMP
version 9.00.00.4510
デコーダー
InterVideo MP3 + DVD XPack
WMP ActiveX
WindowsMediaPlayer version 1.00 Win32\Wmp.dll
>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。
報告です。
少し苦労しましたが、思いの外早く出来ました。
チャプター移動だけですが、
プリインストール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;
ツイート | ![]() |