AVIファイル再生

解決


シスコムーン  2003-03-27 18:38:38  No: 77462

AVIファイルを再生させたいのですが、圧縮し音有りなので、
アニメーションコントロールでは再生不可です。
そこで、APIでMCIを使って再生させたのですが、停止中は再描画されず
消えてしまうのでこまっています。
MCIで表示ウインドウでピクチャーボックスのハンドルを渡し再生させています。
無論連続再生していれば問題ないのですが、そうもいかないので;

MediaPlayerコントロールというのもあるのですが、こちらでは問題なく再描画されるのですが、インストール先のクライアントにMediaPlayerが入っている必要があるのでしょうか?それともOCXの配布だけで使用可能なのでしょうか?(MSDN見たんですが、いまいち分かりませんでした。)


魔界の仮面弁士  2003-03-27 21:40:37  No: 77463

> アニメーションコントロールでは再生不可です。

マルチメディアコントロールでは如何でしょうか。


シスコムーン  2003-03-28 02:11:11  No: 77464

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

上記ソースでも再生終了後は再描画されません。
再生終了後は、最後のフレームの絵を表示し続けてほしいのですが。


たかみちえ  URL  2003-03-28 02:18:13  No: 77465

ピクチャーボックスのAutoRedrawの値はどうなっていますか?


シスコムーン  2003-03-28 02:34:45  No: 77466

> ピクチャーボックスのAutoRedrawの値はどうなっていますか?
TrueでもFalseでも同じで再描画されません。


Loreley  2003-03-28 17:41:46  No: 77467

>MCIとマルチメディアコントロールは同じだと思っていたのですが。

おそらく魔界の仮面弁士さんが言われてるのは
APIではなくて、マルチメディアコントロールOCXを使ってはどうか。
ということではないでしょうか。


Loreley  2003-03-28 18:56:35  No: 77468

失礼しました
>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についてもうすこしわかればまた発言させていただきます


Loreley  2003-03-28 19:11:52  No: 77469

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 コントロールでクリップを
再生することができません(または、できない場合があります)。」
ってことですね。


Loreley  2003-03-28 19:21:18  No: 77470

ふたつ上のコードで
Picture1.Refreshはない方がいいですね(^^;
そうすればたぶんちらつかなくなると思います。


シスコムーン  2003-04-01 18:42:26  No: 77471

出張で返信遅れましてすみませんでした。
皆様有難うございます。

>Loreley殿
色々調べていただき有難うございます。
サンプルの方法、私も考えてはいたのですが、
もっといい方法ありそうでなさそうで。。。
実はちょっとしたパッケージ品の開発なので、
環境が限定されるのがイヤだったので、WindowsMediaPlayerは
厳しそうです。MCIで対応するようにします。
有難うございました。


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

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






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