DOBON.NET DOBON.NETプログラミング掲示板過去ログ

AudioVideoPlayback::Video終了後のエラー

  • 題名: AudioVideoPlayback::Video終了後のエラー
  • 著者: masa
  • 日時: 2011/01/10 10:43:18
  • ID: 27983
  • この記事の返信元:
    • (なし)
  • この記事への返信:
    • (なし)
  • ツリーを表示
環境/言語:[Windows XP SP3 / Visual Studio 2005 / Visual C++ CLR マネージアプリケーション]
分類:[.NET]

2011/01/10(Mon) 10:47:20 編集(投稿者)

お久しぶりです。masaです。
現在、スクリプトを読み込んで動作する、ゲームエンジンもどきを作成しています。

途中でビデオの再生が必要になったので、以下のコードで実装しました。

//
// ビデオの再生
//
public: System::Void PlayVideo(String^ Path) {
// ビデオを開く
Microsoft::DirectX::AudioVideoPlayback::Video^ Video = gcnew Microsoft::DirectX::AudioVideoPlayback::Video("MOV\\" + Path);
// ビデオが終了したなら、イベント発生
Video->Ending += gcnew System::EventHandler(this,&Form1::StopVideo);
// 自分のフォームに描画
Video->Owner = this;
// なぜか、ウィンドウのサイズが変わってしまうので、修正
this->ClientSize = this->Size;
Video->Size = this->ClientSize;
// 再生
Video->Play();
// 終わるまで待機
while (Video->State.ToString() == "Running" && this->Created) {
Application::DoEvents();
}
// ストップ
Video->Stop();
// フォームに残骸が残るので、新しいフォームをオーナーにする
Form^ frm = gcnew Form();
Video->Owner = frm;
// フォームを閉じる
frm->Close();
C++では、Disposeができないので、nullにする
Video = nullptr;
}

//
// ビデオをストップ
//
public: System::Void StopVideo(System::Object^ sender, System::EventArgs^ e) {
// senderからAudioVideoPlayback::Videoにする
Microsoft::DirectX::AudioVideoPlayback::Video^ Video = (Microsoft::DirectX::AudioVideoPlayback::Video^)sender;
// ビデオを止める
Video->Stop();
}

このソースで、とりあえず動くのですが、謎がいくつかあります。

・ウィンドウのサイズが勝手に変わる。
これは、AudioVideoPlaybackがビデオに合わせてサイズを変えてくれるそうですが、
ウィンドウが小さくなります...
・ビデオが終了しても、最後のコマのままになる。
これは、新しいフォームをオーナーにすることで回避しましたが、これが下のエラーの原因?


それで、このコードを使用し、ビデオを再生、終了した後に
ウィンドウを最小化すると、AudioVideoPlaybackの例外エラーが発生します。
以下、エラー内容です。

アプリケーションでエラーが発生しました。
-2147024809 (E_INVALIDARG)
場所 Microsoft.DirectX.AudioVideoPlayback.Video.set_Size(Size value)
場所 Microsoft.DirectX.AudioVideoPlayback.Video.OnOwnerResize(Object sender, EventArgs e)
場所 System.Windows.Forms.Control.OnResize(EventArgs e)
場所 System.Windows.Forms.Form.OnResize(EventArgs e)
場所 System.Windows.Forms.Control.OnSizeChanged(EventArgs e)
場所 System.Windows.Forms.Control.UpdateBounds(Int32 x, Int32 y, Int32 width, Int32 height, Int32 clientWidth, Int32 clientHeight)
場所 System.Windows.Forms.Control.UpdateBounds()
場所 System.Windows.Forms.Control.WndProc(Message& m)
場所 System.Windows.Forms.ScrollableControl.WndProc(Message& m)
場所 System.Windows.Forms.ContainerControl.WndProc(Message& m)
場所 System.Windows.Forms.Form.WndProc(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
場所 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


長くなってしまって、申し訳ありませんが、謎と、エラーの原因、できれば解決方法も教えていただけると幸いです。
どなたか、回答をお願いします。

DOBON.NET | プログラミング道 | プログラミング掲示板