AVIファイルを再生させたいのですが、圧縮し音有りなので、
アニメーションコントロールでは再生不可です。
そこで、APIでMCIを使って再生させたのですが、停止中は再描画されず
消えてしまうのでこまっています。
MCIで表示ウインドウでピクチャーボックスのハンドルを渡し再生させています。
無論連続再生していれば問題ないのですが、そうもいかないので;
MediaPlayerコントロールというのもあるのですが、こちらでは問題なく再描画されるのですが、インストール先のクライアントにMediaPlayerが入っている必要があるのでしょうか?それともOCXの配布だけで使用可能なのでしょうか?(MSDN見たんですが、いまいち分かりませんでした。)
> アニメーションコントロールでは再生不可です。
マルチメディアコントロールでは如何でしょうか。
MCIとマルチメディアコントロールは同じだと思っていたのですが。
Private Sub Form_Load()
MMControl1.Notify = False
MMControl1.Wait = True
MMControl1.Shareable = False
MMControl1.DeviceType = "AVIVideo"
MMControl1.FileName = "(再生するAVIファイル)"
MMControl1.Command = "Open"
MMControl1.hWndDisplay = Picture1.hWnd
End Sub
上記ソースでも再生終了後は再描画されません。
再生終了後は、最後のフレームの絵を表示し続けてほしいのですが。
ピクチャーボックスのAutoRedrawの値はどうなっていますか?
> ピクチャーボックスのAutoRedrawの値はどうなっていますか?
TrueでもFalseでも同じで再描画されません。
>MCIとマルチメディアコントロールは同じだと思っていたのですが。
おそらく魔界の仮面弁士さんが言われてるのは
APIではなくて、マルチメディアコントロールOCXを使ってはどうか。
ということではないでしょうか。
失礼しました
>MCIとマルチメディアコントロールは同じだと思っていたのですが。
とは、APIとOCXの違いだけで中身は同じだと思ってたという意味だったのですね。
ところで、いろいろとためしてみたんですが、
マルチメディアコントロールって処理が変わってますね。
PictureBoxのPaintメッセージが呼ばれないみたいで、
AutoRedrawプロパティをTrueにすると、データが残らないようです。
で、いろいろ実験してて、一番まともに動いたのは
(それでもかなり不満がのこる)
*条件
Form1にMMControl1とPicture1とPicture2を設置。
Picture1とPicture2のサイズは同じにする。
Form1、Picture1、Picture2のScaleModeを3(ピクセル)にする
*コード
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Sub Form_Load()
MMControl1.Notify = False
MMControl1.Wait = True
MMControl1.Shareable = False
MMControl1.DeviceType = "AVIVideo"
MMControl1.filename = "(ファイル名)"
MMControl1.Command = "Open"
MMControl1.hWndDisplay = Picture1.hWnd
MMControl1.UpdateInterval = 0
Picture1.AutoRedraw = False
Picture2.AutoRedraw = True
Picture2.Visible = False
End Sub
Private Sub MMControl1_PauseClick(Cancel As Integer)
MMControl1.UpdateInterval = 0
End Sub
Private Sub MMControl1_PlayClick(Cancel As Integer)
MMControl1.UpdateInterval = 300 '適宜変更
End Sub
Private Sub MMControl1_StopClick(Cancel As Integer)
MMControl1.UpdateInterval = 0
End Sub
Private Sub MMControl1_StatusUpdate()
Call BitBlt(Picture2.hDC, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, Picture1.hDC, 0, 0, vbSrcCopy)
Picture1.Refresh
End Sub
Private Sub Picture1_Paint()
Call BitBlt(Picture1.hDC, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, Picture2.hDC, 0, 0, vbSrcCopy)
End Sub
とすれば、一応停止中も再描画されると思います。
・・・が、描画中に画面外にあったりするとちゃんと描画されなかったり
(これはそもそもPicture1に全部描画されていない)
すこしちらつきもあるような気がします。
参考程度にためしてみてください。
MediaPlayerControlですが、
私もMSDNみてみましたけど、わかりにくいですね。
7.x以降のライセンスとかはけっこうのってましたけど、
6.4以前についてはそこいら辺の詳しい説明を発見できませんでした。
ただ、MediaPlayerControlを使っている某フリーソフトでのReadMeでは
以下のように説明がされていました
「WindowsMediaPlayer5.0以降
Windows95/98はWindowsMediaPlayer(今だと7)をインストールする事で利用可能です。
Windows98SE/Me/2000/XPはそのまま利用可能です。」
win95や98はOSのインストールオプションで
MediaPlayerをインストールしないこともできたと思うので、
MediaPlayerのインストールは必須だと思います。
バージョン的に見て(うちの環境ではmediaplayercontrolは6.4.55だった)、
7.x以降の"wmplayer.exe"ではなく、
"mplayer2.exe"になると思います。
起動時にこれの存在をチェックするのもいいかもしれません。
MediaPlayerについてもうすこしわかればまた発言させていただきます
VBではなくPowerPointの話ですが(ActiveXの話だから関係ないですけど)
http://support.microsoft.com/default.aspx?scid=kb;ja;240923
に、
「Windows Media Player 6.0 以降がインストールされている場合は、Microsoft Windows Media Player コントロールでクリップを再生することができます。Microsoft Windows Media Player コントロールは、多くの場合、PowerPoint が処理できないクリップを処理できます。 」
と、あります。
ということは、
「Windows Media Player 6.0以降がインストールされていない場合は、
Microsoft Windows Media Player コントロールでクリップを
再生することができません(または、できない場合があります)。」
ってことですね。
ふたつ上のコードで
Picture1.Refreshはない方がいいですね(^^;
そうすればたぶんちらつかなくなると思います。
出張で返信遅れましてすみませんでした。
皆様有難うございます。
>Loreley殿
色々調べていただき有難うございます。
サンプルの方法、私も考えてはいたのですが、
もっといい方法ありそうでなさそうで。。。
実はちょっとしたパッケージ品の開発なので、
環境が限定されるのがイヤだったので、WindowsMediaPlayerは
厳しそうです。MCIで対応するようにします。
有難うございました。
ツイート | ![]() |