トップページ > 記事閲覧
ogv再生につきまして
名前:computermania 日時: 2013/05/25 11:46

いつもライブラリの更新、お疲れ様です。 一件、問題を発見いたしまたのでご報告に上がりました。 ogvを再生しながら、ウィンドウを右端を持ってグリグリしますと、フリーズする様です。 たぶん、ogvを再生したまま画面更新がある程度行われない状況になりますと、問題が発生するのだと思います(リングバッファの問題でしょうか?) ご確認いただけますと幸いです。
メンテ

Page: 1 |

Re: ogv再生につきまして ( No.1 )
名前:管理人 日時:2013/05/26 14:45

ご報告ありがとうございます ただ、手元の環境では現象が再現しませんでした ウインドウの右端を持って、とありますが、これは SetWindowSizeChangeEnableFlag を使用して ウインドウのサイズを変更可能にしているということでしょうか? 一応こちらで試したことは、SetWindowSizeChangeEnableFlag でウインドウのサイズを変更可能に した状態で ogv を再生中にウインドウの右端をつかんで3〜4秒間ウインドウサイズを広げたり 狭めたりということをしてから戻すというものです よろしければグリグリする時間やお使いのPCのOSなどを教えて頂けないでしょうか? あと、もしかしたら手元の最新バージョンでは別件の影響で直っている可能性もありますので、 よろしければこちらのバージョンをお試しになってみてください http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ
Re: ogv再生につきまして ( No.2 )
名前:computermania 日時:2013/05/29 06:20

お忙しい中お返事有り難うございます! 最新版でやってみましたが、やはりまだ起こるようです。 SetWindowSizeChangeEnableFlagでウィンドウを可変にして大きさを変えたり、ウィンドウのタイトルバーを掴んでひっぱり回してもフリーズすることがあります。 いろいろと調べましたところ、OS等は関係なく、古いマシンでは頻繁に発生することがあるようで、新しいマシンでも高い負荷を与えてやれば発生するようです。 (OGVの多重再生等) 現在詳細な条件を調査中ですので、今しばらくお待ちください。
メンテ
Re: ogv再生につきまして ( No.3 )
名前:computermania 日時:2013/05/30 05:14

あれからいろいろと試してみまして やはりTheoraのデコードが重くなってくると、Theoraのデコードスレッドから戻ってこれない(?)ような感じとなりフリーズするようです。 透過、不透過、拡大、モードも試してみましたが関係なさそうです。 以下のソースで起動した後、可変ウィンドウにしてグリグリするとフリーズいたします。 ムービーを4つ再生していますが、速いマシンではもう少し増やすかSetMovieRightImageAlphaFlagをTRUEにすればちょうど良い重さになって再現できるかと思います。 ご確認くださいませ。 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int i , j ; SetGraphMode( 1280 , 720 , 32 ) ; ChangeWindowMode(TRUE); SetWindowSizeChangeEnableFlag(TRUE); SetAlwaysRunFlag(TRUE); SetWaitVSyncFlag(60); SetBackgroundColor( 0,0,0 ) ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } /// 補間をバイリニアに SetDrawMode( DX_DRAWMODE_BILINEAR ) ; /// 描画先画面を裏画面にセット SetDrawScreen( DX_SCREEN_BACK ) ; // SetMovieRightImageAlphaFlag( TRUE ) ; int d0=LoadGraph("test.png"); int d1=LoadGraph("test1.ogv"); int d2=LoadGraph("test2.ogv"); int d3=LoadGraph("test3.ogv"); int d4=LoadGraph("test4.ogv"); PlayMovieToGraph(d0,DX_PLAYTYPE_LOOP); PlayMovieToGraph(d1,DX_PLAYTYPE_LOOP); PlayMovieToGraph(d2,DX_PLAYTYPE_LOOP); PlayMovieToGraph(d3,DX_PLAYTYPE_LOOP); PlayMovieToGraph(d4,DX_PLAYTYPE_LOOP); // ループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { DrawGraph(0,0,d0,TRUE); DrawGraph(50,50,d1,FALSE); DrawGraph(100,100,d2,FALSE); DrawExtendGraph(200,200,1500,1500,d3,TRUE); DrawExtendGraph(0,0,1500,1500,d4,TRUE); // 裏画面の内容を表画面に反映させる ScreenFlip() ; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }
メンテ
Re: ogv再生につきまして ( No.4 )
名前:bbotan 日時:2013/05/30 05:40

私も以前、普通のゲーム利用者がやらないくらいウィンドウを高速に振り回しまくると 青画面になる状態だったことがありますが、 ビデオカードのドライバ更新したらならなくなりました。
メンテ
Re: ogv再生につきまして ( No.5 )
名前:管理人 日時:2013/06/02 18:31

載せて頂いたプログラムでも現象は再現しませんでした 負荷が足りていなかったので、以下のように少しだけ変更させて頂きました #include "DxLib.h" #define NUM (5) int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int i , j ; int d[NUM]; SetGraphMode( 1280 , 720 , 32 ) ; ChangeWindowMode(TRUE); SetWindowSizeChangeEnableFlag(TRUE); SetAlwaysRunFlag(TRUE); SetWaitVSyncFlag(60); SetBackgroundColor( 0,0,0 ) ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } /// 補間をバイリニアに SetDrawMode( DX_DRAWMODE_BILINEAR ) ; /// 描画先画面を裏画面にセット SetDrawScreen( DX_SCREEN_BACK ) ; //SetMovieRightImageAlphaFlag( TRUE ) ; int d0=LoadGraph("test.png"); for( i = 0; i < NUM; i++ ) { d[i] = LoadGraph("test.ogv"); } for( i = 0; i < NUM; i++ ) { PlayMovieToGraph( d[i],DX_PLAYTYPE_LOOP); } // ループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { DrawGraph(0,0,d0,TRUE); for( i = 0; i < NUM; i++ ) { DrawExtendGraph( 0, 0, 1500, 1500, d[i], TRUE ); } // 裏画面の内容を表画面に反映させる ScreenFlip() ; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } #define NUM を 20 にして激しく処理負荷が高い状態でウインドウのサイズをグリグリ 変更してみたりしましたが、重いながらもフリーズすることなく再生は続きました こちらに上記プログラムをコンパイルした実行ファイルをアップしましたので、 よろしければ computermaniaさんの環境ではどのような結果になるか試してみて 頂けないでしょうか? https://dxlib.xsrv.jp/file/SetFontSizeTest.zip ( 再生している test.ogv は含まれていませんのでご用意ください ) あと、よろしければテストで使用されている ogvファイルの解像度やビットレートを教えて頂けないでしょうか?
メンテ
Re: ogv再生につきまして ( No.6 )
名前:computermania 日時:2013/06/09 10:44

お返事が遅くなりまして申し訳ございません。 いただきましたソースにて実行致ました所、以下の様な結果になりました。 x 713x1000 1285kbps 24f x 1400x1000 1503kbps 24f o 1280x720 8497kpbs 29.97f o 1280x720 10336kbps 29.97f x 320x240 85kbps 30f x 800x600 1043kbps 24f x 800x600 2452kbps 24f 変換はすべて ffmpeg2theora-0.29 にて行っております。 zipの方のソースは中身が違うようで、ムービーの再生はできませんでしたので、掲示板内のソースを貼り付けて実行しております。 ご参考になれば幸いです。 引き続き調べてみます。
メンテ
Re: ogv再生につきまして ( No.7 )
名前:computermania 日時:2013/06/10 10:16

もしかすると解像度等は関係なく、 Theora変換元ファイルにオーディオトラックがあるかないかが原因かもしれません。 引き続き調査しますので、今しばらくお待ちください。
メンテ
Re: ogv再生につきまして ( No.8 )
名前:管理人 日時:2013/06/23 20:58

ご情報ありがとうございます computermaniaさんの環境でも大丈夫な動画ファイルもあるんですね・・・ 私の環境では相変わらず再現しませんが、ogvのデコードは別のスレッドで 処理をしているので、スレッド間のデータのやり取りで競合が発生して デッドロックが起きてしまっている可能性があります なので、ogv のデコード処理の部分を見直して、今までよりもデッドロックが 起きにくくなるように処理を少し変更してみました そのバージョンをこちらにアップしましたので、よろしければお試しになってみてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存