TMediaPlayerコンポーネントでデジタルビデオで録画したAVIファイルを再生しようとしたのですが、vids:dvsdが無いので再生できませんでした。
codecがないのかとも思ったのですが、Windowsに標準で入っているメディアプレイヤーでは再生できます。
TMediaPlayerでなんとか再生したいので、よろしくお願いします。
Delphi標準のコンポーネントTMediaPlayerを使わずに、MSのメディアプレイヤーを使えば再生できます。
ActiveXの取り込みで、「Windows Media Player(Version 1.0)」を取り込んでください。
その際、クラス名を、TMediaPlayer以外のものに変更してください。
# 例えばTMSMediaPlayerなど
出来上がったコンポーネントを、パッケージに追加してそのパッケージをインストールします。
そのパッケージを、再生アプリのプロジェクトに追加して、フォームに貼り付ければ、メディアプレイヤーそのものが張り付きます。
にしのさん、どうもありがとうございました。うまく再生できました。
TMediaPlayerコンポーネントとプロパティやメソッドの扱いが違うように思いますが、例えば総フレーム数を得たりするのはどうしたらよろしいんでしょうか?
たぶんですが、
DisplayModeプロパティ
mpTime のときに、時間を返すようになる。
mpFramsのときに、フレームを返すようになる。
Durationプロパティ
総(秒/フレーム)数
CurrentPositionプロパティ
現在位置の(秒/フレーム)。
をあらわすようです。
にしのさんのおっしゃるようにやりましたが、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;
別の質問になりますが、どうかよろしくお願いします。
こんな感じになります。
多分、クラス名は同じだと思いますが、一応チェックしてみてください。
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;
さきほどチェックしましたが、やはり真っ黒の画面しかキャプチャできませんでした。MediaPlayerで再生したときに、黒色の背景に画面が乗っかっているような感じです。それで実際の画面はキャプチャできず、背景のみがコピーされているようです。
DirectDrawが悪さをしているようで、ますますわかりません・・・
しまった、前に僕もはまりました。
そのときはとても苦労してキャプチャを取った気がします。
ただ、そのときはメディアプレイヤー自身から取ったため、メディアプレイヤーをFindWindowExで探し、そこからVideoRendererまで探し出して取ってました。
今回のものは、どうもVideoRendererでは無かったらしいです。
上のFindWindowExを、
hWnd := FindWindowEx(GetDesktopWindow, 0, 'FilterGraphWindow', nil);
にしてみてください。
なぜかわかりませんが、WinSightを使って見てみると、デスクトップの子ウィンドウとしてFilterGraphWindowがいました。
こちらの環境(Win2000+Delphi5 Professional+Windows Media Player Control Version 6.4.09.1119)では、これでとれました。
さっそく試してみたところ、デスクトップの画面ごとキャプチャしました。MediaPlayerの画面はキャプチャできず、やはり黒い画面のままでした。私の環境は、Windows2000+Delphi5Proですが、環境はにしのさんと同じです。
ところでWinSightってなんなんですか?
スタートメニューの、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;
すばやいご回答ありがとうございます。感謝しております。
MediaPlayerの描画画面のキャプチャはできているようですが、真っ黒になります。にしのさんはうまくできているんですよねぇ?なぜ私の場合できないんでしょうか?
そこで、さきほどいろいろ調べていましたら、アクセサリのシステムツールにDirectX診断ツールがありまして、その中のディスプレイタブでDirectDrawアクセラレータを無効にすればキャプチャできました。
しかし、他のパソコンでソフトを動かそうとすると、いちいちアクセサリの設定を変更しないといけませんので、なんとかならないものかと考えております。
WinSight、これから使ってみます。
ありがとうございます。
http://www.torry.net/
ここの、
VCL > Components > Effects and Multimedia > Video
に、使えそうなコンポーネントがありました。シェアウェアです。
TActiveMovie ($47)
http://www.delphicity.com/
プロシージャに、CaptureToBitmapなどが用意されてました。
中をのぞくと、どうもフックしているような・・・・。
# 中といっても、単純にテキストエディタで開いただけですが
フックできれば、キャプチャもできそうです。
ツイート | ![]() |