TMediaPlayerコンポーネントでDV形式のAVIファイルを再生するには?


いおり  2001-10-23 20:44:20  No: 227  IP: [192.*.*.*]

TMediaPlayerコンポーネントでデジタルビデオで録画したAVIファイルを再生しようとしたのですが、vids:dvsdが無いので再生できませんでした。
codecがないのかとも思ったのですが、Windowsに標準で入っているメディアプレイヤーでは再生できます。
TMediaPlayerでなんとか再生したいので、よろしくお願いします。

編集 削除
にしの  2001-10-24 10:01:33  No: 228  IP: [192.*.*.*]

Delphi標準のコンポーネントTMediaPlayerを使わずに、MSのメディアプレイヤーを使えば再生できます。
ActiveXの取り込みで、「Windows Media Player(Version 1.0)」を取り込んでください。
その際、クラス名を、TMediaPlayer以外のものに変更してください。
# 例えばTMSMediaPlayerなど

出来上がったコンポーネントを、パッケージに追加してそのパッケージをインストールします。
そのパッケージを、再生アプリのプロジェクトに追加して、フォームに貼り付ければ、メディアプレイヤーそのものが張り付きます。

編集 削除
いおり  2001-10-24 10:33:53  No: 229  IP: [192.*.*.*]

にしのさん、どうもありがとうございました。うまく再生できました。
TMediaPlayerコンポーネントとプロパティやメソッドの扱いが違うように思いますが、例えば総フレーム数を得たりするのはどうしたらよろしいんでしょうか?

編集 削除
にしの  2001-10-24 13:10:09  No: 230  IP: [192.*.*.*]

たぶんですが、
DisplayModeプロパティ
  mpTime のときに、時間を返すようになる。
  mpFramsのときに、フレームを返すようになる。

Durationプロパティ
  総(秒/フレーム)数

CurrentPositionプロパティ
  現在位置の(秒/フレーム)。

をあらわすようです。

編集 削除
いおり  2001-10-24 13:30:37  No: 231  IP: [192.*.*.*]

にしのさんのおっしゃるようにやりましたが、Durationプロパティ自体がありませんでした。(見落としたかな?)

ところで、ActiveXを使ったMediaPlayerコンポーネントで描画できるようになって、今は一時停止した際の画像をキャプチャーしようとしています。
しかしうまくいかず、読み込む前の画像はキャプチャーできるのですが、一旦ファイルを開いてしまうと、キャプチャーしても真っ黒な画面になります。

今のところBitBltでやっています。

//mediaplayerのスクリーンをコピーする
procedure TForm1.Button3Click(Sender: TObject);
var
  media_screen_DC: HDC;
begin
  media_screen_DC:= GetDC(MSMediaPlayer1.Handle);

  BitBlt(Image2.Canvas.Handle,
         0,
         0,
         Image2.Width,
         Image2.Height,
         media_screen_DC,
         0,
         0,
         SRCCOPY);
  Image2.Refresh;
  ReleaseDC(MSMediaPlayer1.Handle, media_screen_DC);
end;

別の質問になりますが、どうかよろしくお願いします。

編集 削除
にしの  2001-10-24 16:01:19  No: 232  IP: [192.*.*.*]

こんな感じになります。
多分、クラス名は同じだと思いますが、一応チェックしてみてください。

  hWnd := FindWindowEx(Handle, 0, 'ATL:1D37EC20', nil);//MSMediaPlayer1.Handle
  if hWnd <> 0 then
  begin
    media_screen_DC:= GetDC(hWnd);
    BitBlt(Image1.Canvas.Handle,
      0,
      0,
      Image1.Width,
      Image1.Height,
      media_screen_DC,
      0,
      0,
      SRCCOPY);
    Image1.Refresh;
    ReleaseDC(hWnd, media_screen_DC);
  end;

編集 削除
いおり  2001-10-24 17:02:17  No: 233  IP: [192.*.*.*]

さきほどチェックしましたが、やはり真っ黒の画面しかキャプチャできませんでした。MediaPlayerで再生したときに、黒色の背景に画面が乗っかっているような感じです。それで実際の画面はキャプチャできず、背景のみがコピーされているようです。

DirectDrawが悪さをしているようで、ますますわかりません・・・

編集 削除
にしの  2001-10-24 21:05:55  No: 234  IP: [192.*.*.*]

しまった、前に僕もはまりました。
そのときはとても苦労してキャプチャを取った気がします。
ただ、そのときはメディアプレイヤー自身から取ったため、メディアプレイヤーをFindWindowExで探し、そこからVideoRendererまで探し出して取ってました。

今回のものは、どうもVideoRendererでは無かったらしいです。
上のFindWindowExを、
hWnd := FindWindowEx(GetDesktopWindow, 0, 'FilterGraphWindow', nil);
にしてみてください。
なぜかわかりませんが、WinSightを使って見てみると、デスクトップの子ウィンドウとしてFilterGraphWindowがいました。
こちらの環境(Win2000+Delphi5 Professional+Windows Media Player Control Version 6.4.09.1119)では、これでとれました。

編集 削除
いおり  2001-10-25 13:15:56  No: 235  IP: [192.*.*.*]

さっそく試してみたところ、デスクトップの画面ごとキャプチャしました。MediaPlayerの画面はキャプチャできず、やはり黒い画面のままでした。私の環境は、Windows2000+Delphi5Proですが、環境はにしのさんと同じです。
ところでWinSightってなんなんですか?

編集 削除
にしの  2001-10-25 14:03:49  No: 236  IP: [192.*.*.*]

スタートメニューの、Borland Delphi 5の中に、WinSight32というものがあると思います。
これは、ウィンドウ(窓でなく)を階層表示するツールです。
これを使うと、ウィンドウのクラス名(VCLのクラス名ではないです)や、WindowText、サイズや表示/非表示、ウィンドウハンドルなどを見ることが出来ます。
VisualC++についているツールのほうが使い勝手がよいのですが^^;

キャプチャの件ですが、よくみたらVideoRendererがいました。
これでどうでしょうか。
やっていることは、フォームに子ウィンドウ'ATL:1D37EC20'を探し、さらにそれの子ウィンドウ'VideoRenderer'を探し出しています。

procedure TForm1.Button2Click(Sender: TObject);
var
  hWnd: THandle;
  media_screen_DC: HDC;
  Rect: TRect;
begin
  hWnd := FindWindowEx(Handle, 0, 'ATL:1D37EC20', nil);
  hWnd := FindWindowEx(hWnd, 0, 'VideoRenderer', nil);
  if hWnd <> 0 then
  begin
    GetWindowRect(hWnd, Rect);
    media_screen_DC:= GetDC(hWnd);
    BitBlt(Image1.Canvas.Handle,
      0,
      0,
      Rect.Right - Rect.Left,
      Rect.Bottom - Rect.Top,
      media_screen_DC,
      0,
      0,
      SRCCOPY);
    Image1.Refresh;
    ReleaseDC(hWnd, media_screen_DC);
  end;
end;

編集 削除
いおり  2001-10-25 17:28:11  No: 237  IP: [192.*.*.*]

すばやいご回答ありがとうございます。感謝しております。
MediaPlayerの描画画面のキャプチャはできているようですが、真っ黒になります。にしのさんはうまくできているんですよねぇ?なぜ私の場合できないんでしょうか?
そこで、さきほどいろいろ調べていましたら、アクセサリのシステムツールにDirectX診断ツールがありまして、その中のディスプレイタブでDirectDrawアクセラレータを無効にすればキャプチャできました。
しかし、他のパソコンでソフトを動かそうとすると、いちいちアクセサリの設定を変更しないといけませんので、なんとかならないものかと考えております。

WinSight、これから使ってみます。
ありがとうございます。

編集 削除
にしの  2001-10-25 17:48:40  No: 238  IP: [192.*.*.*]

http://www.torry.net/
ここの、
VCL > Components > Effects and Multimedia > Video 
に、使えそうなコンポーネントがありました。シェアウェアです。
TActiveMovie ($47)
http://www.delphicity.com/
プロシージャに、CaptureToBitmapなどが用意されてました。
中をのぞくと、どうもフックしているような・・・・。
# 中といっても、単純にテキストエディタで開いただけですが

フックできれば、キャプチャもできそうです。

編集 削除