- PR -

PictureBoxで動画の再生と文字の表示をする方法

1
投稿者投稿内容
みかん
常連さん
会議室デビュー日: 2006/08/08
投稿数: 31
投稿日時: 2006-08-08 14:31
PictureBoxで動画を再生し、そこに表示する文字はペイントイベントで切り替える処理を行いたいのですが、動画を背景として設定する方法、あるいは動画の再生終了後
イメージファイルを取り込み再描画する方法について教えて頂けないでしょうか?

動画の種類 avi
環境    Microsoft Visual Studio 2005
      VB.net windowsアプリケーション
      Microsoft.Net Framework 2.0
      Windows XP SP2

私なりに調べてみましたが、動画を背景のように設定する方法については
全く手がかりがありませんでした。

動画の再生終了後、イメージファイルを取り込み再描画する方法は
  DirectX9を使用して再生する
  ↓
  Video_Endingイベントで再生したVIDEOをSTOPする
まではできたのですが、動画のクリアができずにイメージファイルが表示
されません。
  動画のクリアにDisposeを使用すると下記のエラーが発生してしまいます。

  エラーメッセージ:
  オブジェクト参照がオブジェクト インスタンスに設定されていません。

  ソースコードは下記の通りです。

Private Const FILENAME As String = "sample.avi"
Private Const ImageFileName As String = "sample.JPG"
Private mMedia As Microsoft.DirectX.AudioVideoPlayback.Video

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'動画を再生する
mMedia = New Microsoft.DirectX.AudioVideoPlayback.Video(FileName, False)
mMedia.Owner = PictureBox1
mMedia.Play()

AddHandler mMedia.Ending, AddressOf Me.Video_Ending

End Sub

Private Sub Video_Ending(ByVal sender As Object, ByVal e As EventArgs)

      mMedia.Stop()
      mMedia.Dispose() ←ここでエラーが発生する

      '画像ファイルを読み込みPictureBoxに表示
With PictureBox1
       .SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage
       .Image = System.Drawing.Image.FromFile(ImageFileName)
       End With
      
End Sub

mciSendStringを使った動画の再生もできたのですが、
再生終了イベントの取得や動画のクリア処理がわかりませんでした。

アドバイス等ありましたら、ご教授よろしくお願い致します。

[ メッセージ編集済み 編集者: みかん 編集日時 2006-08-08 14:34 ]

[ メッセージ編集済み 編集者: みかん 編集日時 2006-08-08 14:36 ]
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-08-08 15:01
引用:

PictureBoxで動画を再生し、そこに表示する文字はペイントイベントで切り替える処理を行いたいのですが、動画を背景として設定する方法、あるいは動画の再生終了後
イメージファイルを取り込み再描画する方法について教えて頂けないでしょうか?



段取りや構成を見直した上で、相当作りこまないと完全に希望通りのものは出来ないと思うのですが、それが「可能である」と判断した根拠は何でしょう?

あなたのみつけた情報源で「可能である」とされているなら、同じ情報源で実現方法についても触れられてはいなかったのでしょうか?
みかん
常連さん
会議室デビュー日: 2006/08/08
投稿数: 31
投稿日時: 2006-08-08 15:19
ひどりさん、返信ありがとうございます。

根拠になるものとしては・・・

Form1_Load内で
mMedia.Dispose() を行えば、エラーが発生せずにイメージファイルを表示できる
こと、Paintイベントが発生することを確認しました。

Video_Endingは自分のイベント内なのでDisposeできないのでしょうか?
Play終了後にmMedia.Dispose() を実行できるアイデアがあれば
教えてください。よろしくお願いいたします。

[ メッセージ編集済み 編集者: みかん 編集日時 2006-08-08 15:37 ]
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-08-08 17:37
どう応対していいものか困ってしまいますが。。。

引用:

根拠になるものとしては・・・

Form1_Load内で
mMedia.Dispose() を行えば、エラーが発生せずにイメージファイルを表示できる
こと、Paintイベントが発生することを確認しました。



表示ができるだけですよね?
その手順で、「動画再生」と呼べるレベルで連続的に背景を再描画できそうですか?

引用:

Video_Endingは自分のイベント内なのでDisposeできないのでしょうか?



と思います。

引用:

Play終了後にmMedia.Dispose() を実行できるアイデアがあれば
教えてください。よろしくお願いいたします。



単純にそれだけの話なら、イベントハンドラの中で適当なフォームメソッドを BeginInvoke で呼び出せば、フォームメソッドの呼び出しをイベントハンドラから抜けた後に遅延することが出来ます。

本当にそれで、希望通りの動作が実現できるのかどうかは分かりませんが。
みかん
常連さん
会議室デビュー日: 2006/08/08
投稿数: 31
投稿日時: 2006-08-08 19:10


引用: -----------------------------------------------------------------

  「動画再生」と呼べるレベルで連続的に背景を再描画できそうですか?

   -----------------------------------------------------------------

動画は最初の2秒程度のみ画面が動いて、あとは静止画のように表示するイメージ
です。再描画(Play)はボタンクリックなどのイベント発生時に行えば良いので
連続的とは言えないかもしれません。
説明が足らず申し訳ありませんでした。

”動画を背景のように設定する”は難しそうですが、
”動画の再生終了後、イメージファイルを取り込み再描画する”
は、Sleepで再生終了まで待ってからDisposeすることで
実装できました。
BeginInvokeで実現する方はこれから調査してみます。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)