- ベストアンサー
mciSendStringによるmpegファイルの再生
現在mciSendStringを使って簡単な動画再生プログラムを作成しています。 .aviの再生まではできたものの、ファイルの拡張子が.mpegとか.mpgとかである MPEGファイルの再生を使用とすると途端に実行時エラーでロードに失敗してしまいます。 ソースコードと実行時のファイルと使用した動画はこちらです。 http://fatalita.sakura.ne.jp/OKWave/mpegMCI.zip もし宜しければどこが悪かったのか教えていただけると幸いです。 後、作業環境は以下の通りです。 環境:Visual Studio 2005, WinXP
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
うちの環境では、EXE実行時、画面が真っ白の状態ですが、 Windowを動かすなどすると、どちらでも動画が表示されました。 (少なくとも実行時エラーは起こらない。) どうも環境依存の問題のようですね。
その他の回答 (1)
- hidebun
- ベストアンサー率50% (92/181)
http://msdn.microsoft.com/ja-jp/library/cc410496.aspx === 関数が成功すると、0 が返ります。関数が失敗すると、0 以外の値が返ります。この戻り値は DWORD 型であり、下位ワード(low-order word)はエラーコードです。エラーコードがデバイス固有のものであった場合、戻り値の上位ワード(high-order word)はドライバの識別子です。それ以外の場合、上位ワードは 0 です。戻り値のリストについては、MSDN ライブラリの「MCIERR Return Values」を参照してください。 エラーコードに対応する、エラーの内容を説明する文字列を取得するには、この関数の戻り値を mciGetErrorString 関数に渡します。 === エラー内容はなんでしたか?
お礼
あ、すみません。 ブレークポイントを作成してVisual Studioの変数の出力をみたら-125という 値が得られていました。 これを教えていただいたmciGetErrorStringで見てみると 『デバイス ドライバに問題があります。ドライバは閉じました。アクセスエラーです。』 と表示されてしまいました。環境によってはmciでmpegは再生できないということなのでしょうか? 2007年に購入した比較的あたらしめのPCなのですが・・・。
補足
case WM_CREATE: // ウィンドウが作成されたとき // MPEGファイルをオープン _stprintf( buf, _T("open test.mpeg alias test parent %u style child"), (DWORD_PTR)hWnd ); { TCHAR mciBuf[ 100 ] ={0}; MCIERROR dwMCIError = mciSendString( buf, NULL, 0, NULL ); _stprintf( mciBuf, _T("%d"), dwMCIError ); MessageBox( NULL, mciBuf, NULL, NULL ); } WM_CREATEの最初の方を上の様に変更して エラー内容を受け取ろうと、dwMCIErrorで戻り値を取得したもののそれを 参照しようとしたら 『test.exe の 0x5fb053ce でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xfeeefeee を読み込み中にアクセス違反が発生しました。』 とのエラーが表示され、エラー内容を表示することができませんでした。 どうもmciSendString( buf, NULL, 0, NULL );の部分で既にエラーが発生していたようです。 しかし原因が良く分かりません。aviでは同じコードで読み込めてmpegでは 読み込めないのです。mpegには他に記述が必要なのでしょうか?
お礼
あ、すみません。画面の更新の為にInvalidateRectなどを入れるべきでした。 mciSendCommandを使ったプログラムも試し、私以外の人が作ったものも試してみましたが、 結果は同じでした。 やはりmpegだと環境依存してしまうようです。 しかしwmv形式は読み込めるということが分かったのでmpegはあきらめることにしました。 ありがとうございます。