トップページ > 過去ログ > 記事閲覧
動画が読み込めない
名前:Dixq 日時: 2008/08/08 17:49

動画を読み込む際、どうしても int video; video = LoadGraph( "dat/mv.mpg" ) ; の結果が-1になってしまうのですが、 何か原因はわからないでしょうか・・。 ※補足 ・aviでもエラーになります。 ・色んなエンコーダを試して変換したり何度もトライしてみました。 ・その動画はプレイヤーで再生すると正常に再生されます。 ・試しに.pngファイルを.mpgにして読み込むとちゃんとグラフィックハンドルが入ります。

Page: 1 |

Re: 動画の使い方について ( No.1 )
名前:夢夢 日時:2008/08/06 13:08

>video = LoadGraph( "dat/mv.mpg" ) ; datフォルダはプロジェクトのどこに置いてありますか? F5でデバックを開始した場合はプロジェクトの直下に置いたフォルダを見ます。 ReleaseフォルダやDebugフォルダから起動した場合は、そのフォルダの中にdatフォルダを入れないと認識しません。
Re: 動画の使い方について ( No.2 )
名前:Dixq 日時:2008/08/06 16:00

ご回答ありがとうございます。 プロジェクトはdatフォルダがある階層にあります。 また、普段いつもこれで読み込めていること、同じ階層にpngを mpgにしたものなら読み込めることから階層間違いではないと 考えています。また、ファイル名の間違いなどはありません。 また、環境は VisualStudio2005Pro , XP です。
Re: 動画の使い方について ( No.3 )
名前: 日時:2008/08/06 16:39

いま、リファレンスのページが表示できない環境 なのでLoadGraphのリファレンス読んでないのですが、そもそも、LoadGraphで動画ファイル読み込めるの?ってところです。 画像、と動画は別物です、 >pngをmpgにしたものなら とありますが、拡張子だけ書き換えた ということでしょうか? それはファイル構造的にはpngなのでmpgになった わけではなく単純にpngとして読み込まれてるだけ だと思いますが。。。?
Re: 動画の使い方について ( No.4 )
名前:Dixq 日時:2008/08/06 16:52

ご回答ありがとうございます。 サンプルを見る限りLoadGraphでmpgファイルを読み込んでいるので、 読み込めるはずだと思っています。 >それはファイル構造的にはpngなのでmpgになった >わけではなく単純にpngとして読み込まれてるだけだと思いますが。。。? そうですよね。 単に階層間違い・スペルミスとかではないことを確認しただけですのであまり記載する意味が 無かったかもしれません。 う〜ん、やはりわかりません・・。 エラーになるときってどういう条件が考えられるのでしょう? 今のところ、パスの間違い、ファイル名の間違いは考えられないのです。 動画もプレイヤーで正常に再生出来ます・・。
Re: 動画の使い方について ( No.5 )
名前: 日時:2008/08/06 18:52

>エラーになるときってどういう条件が >考えられるのでしょう? リファレンスが見れないので、コードをちょっと のぞいてみました。 ・ファイルが無い場合 ・ムービーが最大数まで読み込まれている場合 ・読み込みようのメモリ確保に失敗した場合 ・Windowsの各種COMオブジェクトコンポーネントの 作成・取得に失敗した場合、 ・画面サイズが0x0の時 ・サーフェスの作成に失敗したとき などなど。
Re: 動画の使い方について ( No.6 )
名前:Dixq 日時:2008/08/06 20:29

動画を読み込む同じコードをサンプル実行用フォルダのプロジェクトで実行してみると 正常に読み込めました・・。 また、その時に h ttp://l.huu.cc/img/ffd.PNG こんなウィンドウが出たのですが、これは何なのでしょうか?
Re: 動画の使い方について ( No.7 )
名前:Dixq 日時:2008/08/06 20:38

マルチスレッドじゃない関数でロードしたら正常に読み込めました・・。 マルチスレッドで読み込めないのは承知の上なのですが、 DXライブラリの関数以外のロードもあるので、 一緒にしていました。
Re: 動画の使い方について ( No.8 )
名前: 日時:2008/08/07 03:03

上の画像ですが、お使いの統合コーデックが アプリケーションによってロードされようとしたが、 このアプリケーションがコーデックを 恒久的に使用するかどうするか決めろという ダイアログに見えます。 #解釈は違うかも知れないので参考程度に。。。 ・今回は使わない ・以後使わない ・今回のみ使用する ・以後使用する を聞かれているようです。 DXライブラリのコードでは、 関数毎の呼び出しに排他がかかっているので、 無駄なだけで、マルチスレッドで読み込めないわけ では無いと思うのですが。。。 可能性として、COMオブジェクトの初期化が DxInit側で行われていて、COMの属性が、 マルチスレッドアパートメントになっていない 可能性はありますが。。。
Re: 動画の使い方について ( No.9 )
名前:かたぱると 日時:2008/08/07 10:54

上の画像はFFDShowというフリーのコーデックです。 こいつをインストールするとムービーを読み込む処理に反応して 上記画像のダイアログが出ます。 (Webページ等でムービーを読み込むページ等でも反応する) フリーなので結構入れてしまっている人も多いかと。 ちなみに「プログラムの削除」でアンインストールできます。
Re: 動画の使い方について ( No.10 )
名前: 日時:2008/08/07 15:13

やはり、COM初期化の問題のようです COM初期化の部分を調べてみました。 内部関数、ST_DxLib_Init関数内で InitializeCom関数が呼ばれています。 しかし、その先でのCOM初期化の呼び出しが、 >>CoInitialize( NULL ) となっています。 COMオブジェクトのクラスは各スレッドの アパートメントに所属する為、初期化も スレッド毎に行わなければなりません。 それ以外の方法では、プロセスの実行時一度だけ CoInitializeEx( NULL, COINIT_MULTITHREADED ); と呼び出す必要があります。 このため、No5で述べた失敗の原因のうち、 >Windowsの各種COMオブジェクトコンポーネントの >作成・取得に失敗した場合 に該当する物と思われます。 #もともとマルチスレッドでは殆ど使わないという、 #前提があるので仕方ないといえば仕方ないかと。 まとめ。 ・DxInitを行ったメインスレッドでは  COM初期化が行われた状態の為、  COMオブジェクトの作成は成功し動画を読み込める ・現状のDXライブラリでの動画の読み込みは、  DxInit関数を呼び出したスレッド以外では、  失敗する OEL版の説明ですが、 スレッドモデルについては 以下のMSDN KBを参照。 ttp://support.microsoft.com/default.aspx?scid=%2Fisapi%2Fgomscom.asp%3Ftarget%3D%2Fjapan%2Fsupport%2Fkb%2Farticles%2Fjp150%2F7%2F77.asp&LN=JA コードのみ確認して書いているので、 該当箇所ではないかもしれませんが、 とりあえずやってみる価値はあるかと。 以下の方法で無理やり確認できるかも? 1.WinMainの開始直後にCoInitializeEx( NULL, COINIT_MULTITHREADED );を呼び出す 2.別スレッドで動画を読み込む 3.WinMain終了時にCoUninitialize()を呼び出す。 #無理やりなので確認だけにして置いてください。 #もちろんDxライブラリが内部的にCoInitialize(NULL)を #呼び出しているので動かない可能性も十分ありますので。。。
Re: 動画の使い方について ( No.11 )
名前:Dixq 日時:2008/08/08 17:48

>かたぱるとさん ありがとうございます。 アンインストールしました。 しかし、これをインストールしているユーザーが全画面で起動すると 操作が出来なくなってしまうのですが、 何かいい対策は無いでしょうか? >通さん ありがとうございます。 なるほど、そういうことでしたか。 マルチスレッドにする利点はほとんどないようなので、 特にマルチスレッドは使わない方向でいこうとおもいます。 詳しいご説明ありがとうございます。 ※このスレッドについて※ このスレは動画が読み込めないことについての スレッドとして落ち着かせた方が良いと考えました。 そこで投稿記事を編集し、エフェクトの件は別件で 立てさせていただきます。 ご回答ありがとうございました。

Page: 1 |