トップページ > 記事閲覧
動画の長さを超えた位置指定でフリーズ…を回避する方法
名前:たろう 日時: 2020/08/26 16:40

いつもすみません、たろうです 以下は「動画名.mp4」を再生して、クリック毎に早送りする仕組みですが t_plusの数値を大きくすると手持ちの動画ではどれもフリーズしてしまいます。 動画の長さよりも大きい数値を与えているからだと思いますが、 Ogg以外では動画の長さを調べる事が出来ないので、早送りを繰り返すうちいずれ末尾を超えるわけですから いずれフリーズしてしまう事になると思います。 せめてフリーズしない方法があるといいのですが、なにかございますでしょうか? (※例えばt_plusの数値の場所に動画が存在しているかどうか確認する方法など) お忙しいところすみません、よろしくお願いいたします --------------------------------------------- #include "DxLib.h" #include <locale.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { setlocale( LC_ALL, ".utf8" ); SetUseCharCodeFormat( DX_CHARCODEFORMAT_UTF8 ); ChangeWindowMode( TRUE ); SetGraphMode(600,600,16); if( DxLib_Init() < 0 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); int 動H=LoadGraph(u8"動画名.mp4"); PlayMovieToGraph(動H); int t=0,t_plus=1000000; while( ProcessMessage() == 0 ) { ClearDrawScreen() ; DrawExtendGraph(0,0,600,600,動H,0); if(t==0&&(GetMouseInput()&MOUSE_INPUT_LEFT )!=0) { t=30; int t_now=TellMovieToGraph(動H)+t_plus; SeekMovieToGraph(動H,t_now) ; PlayMovieToGraph(動H) ; }if(t>0)t--; ScreenFlip(); } DxLib_End(); return 0; }
メンテ

Page: 1 | 2 |

Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.1 )
名前:管理人 日時:2020/08/27 03:25

すみません、動画の長さよりも大きい値を SeekMovieToGraph に渡してもフリーズしないように 修正しましたので、よろしければこちらの修正版をお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) > Ogg以外では動画の長さを調べる事が出来ないので すみません、mp4 の場合は GetMovieTotalFrameToGraph と GetOneFrameTimeMovieToGraph で 動画の長さを取得することができます ( 注釈が『Ogg Theora でのみ有効』のままでした… mp4 についてを追記しました ) // 動画ファイルの総フレーム数を得る( Ogg Theora と mp4 でのみ有効 ) int GetMovieTotalFrameToGraph( int GraphHandle ) ; // 動画ファイルの1フレームあたりの時間を取得する(戻り値:1フレームの時間(単位:マイクロ秒)) LONGLONG GetOneFrameTimeMovieToGraph( int GraphHandle ) ; あと、何故か GetOneFrameTimeMovieToGraph の戻り値の単位がマイクロ秒ではなく 100ナノ秒単位になってしまっていたので、マイクロ秒になるように修正しました m(_ _;m
メンテ
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.2 )
名前:たろう 日時:2020/08/27 21:31

いつもありがとうございます、 先ほど試してフリーズしない事を確認いたしました。 追加で二つすみません、 下のプログラムで、TellMovieToGraphで戻る数値が左上に表示されるようになっていますが 手元のmp4の動画のうち結構な確率で 0~400辺りを行ったり来たりするものが存在するようです。 それが再現される動画を、ダウンロードしても問題なそうなもので探しましたが たとえば「hzcpTMO0CrI」でググって出てくる動画はその現象が発生します。 ほぼ同じ動画の「SL_5a6lmU9I」は問題ありません ※投稿禁止語句があるようでこんな感じでお伝えしております 同じく下のプログラムでTellMovieToGraphToFrameとSeekMovieToGraphToFrameを使って フレームで指定して早送りをするようにしましたが、動画の映像だけ進んで、音がついてこないようです。 お忙しいところすみませんが、ご確認いただけますでしょうか? よろしくお願いいたしますm(__)m --------------------------------------------- #include "DxLib.h" #include <locale.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { setlocale( LC_ALL, ".utf8" ); SetUseCharCodeFormat( DX_CHARCODEFORMAT_UTF8 ); ChangeWindowMode( TRUE ); SetGraphMode(600,600,16); if( DxLib_Init() < 0 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); int 動H=LoadGraph(u8"動画名.mp4"); PlayMovieToGraph(動H); int t=0,t_plus=1000; while( ProcessMessage() == 0 ) { ClearDrawScreen() ; DrawExtendGraph(0,0,600,600,動H,0); DrawFormatString( 0,0,GetColor(255,255,255),u8"(%d)" ,TellMovieToGraph(動H) ); if(t==0&&(GetMouseInput()&MOUSE_INPUT_LEFT )!=0) { t=30; int t_now=TellMovieToGraphToFrame(動H)+t_plus;//TellMovieToGraph(動H)+t_plus;// SeekMovieToGraphToFrame(動H,t_now) ;//SeekMovieToGraph(動H,t_now) ;// PlayMovieToGraph(動H) ; }if(t>0)t--; ScreenFlip(); } DxLib_End(); return 0; }
メンテ
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.3 )
名前:管理人 日時:2020/08/29 01:58

SeekMovieToGraph でフリーズしなくなったようで何よりです > 下のプログラムで、TellMovieToGraphで戻る数値が左上に表示されるようになっていますが > 手元のmp4の動画のうち結構な確率で 0~400辺りを行ったり来たりするものが存在するようです。 すみません、mp4のフレームレート情報によっては再生時間の計算の精度( ビット数 )が足りていませんでした m(_ _;m > 同じく下のプログラムでTellMovieToGraphToFrameとSeekMovieToGraphToFrameを使って > フレームで指定して早送りをするようにしましたが、動画の映像だけ進んで、音がついてこないようです。 すみません、再生状態で SeekMovieToGraphToFrame で再生位置を変更した場合に音がついてこないバグがありました どちらのバグも修正しましたので、よろしければこちらの修正バージョンをお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.4 )
名前:たろう 日時:2020/08/29 08:17

ご対応いただきありがとうございます さきほどTellMovieToGraphの件と、音がついてこない件につきまして、 問題なく動作する事を確認いたしました。 すみません、またご確認いただきたい点があるのですが No2のプログラムのままで、クリックを繰り返すと動画が進んで 末尾まで行くと思いますが、末尾を超えると 停止せず勝手に頭から再生がはじまり、 そしてその時音声だけが再生される感じになってしまっているようです (※たまに映像も再生される事もあったりするようです) TellMovieToGraphToFrameとSeekMovieToGraphToFrameを使った場合だけでなく TellMovieToGraphとSeekMovieToGraphを使った場合も同じ現象が発生するようです たびたびすみません、ご確認いただけますでしょうか? 宜しくお願いいたします<(_ _)>
メンテ
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.5 )
名前:管理人 日時:2020/08/31 02:09

> No2のプログラムのままで、クリックを繰り返すと動画が進んで > 末尾まで行くと思いますが、末尾を超えると > 停止せず勝手に頭から再生がはじまり、 > そしてその時音声だけが再生される感じになってしまっているようです 『指定された再生位置を API に渡して実行して、エラーが返ってきたらエラー扱いにする』という 処理を行っていたのが原因でした、API を実行する前に、事前に取得しておいた『総再生時間』を超えた 値が指定されていたら、API を実行せずにエラー扱いにすることでこのエラーが発生しなくなりました 本当に何度も申し訳ありませんが、よろしければこちらの修正版をお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.6 )
名前:たろう 日時:2020/08/31 10:08

ありがとうございます、自動で画像なしで動画が再開されれしまう件、 問題なく動作する事を確認させていただきました お忙しい所たびたびすみません、もしかすると DXライブラリ側でどうこうできる問題ではないかもしれませんが 幾つかのMP4のファイルや、その他例えばほぼすべてのFLVは LoadGraphで動画を読み込んだ時点で アクセス違反という事でフリーズしてしまう事が分かりました 再生できないのはコーデックがなければ仕方ないのですが せめてフリーズしないようにできるとうれしいです。 知識が足りず、これは参考にならないかもしれませんが 以下はフリーズしたときのアクセス履歴です。 呼び出し履歴 〜.exe!__report_gsfailure(...) 行 199 C 〜.exe!DxLib::Graphics_Image_SetupHandle_UseGParam(struct SETUP_GRAPHHANDLE_GPARAM *,int,int,int,int,int,int,int,int,int,int) C++ 40004000() 不明 [下のフレームは間違っているか、または見つかりません] -------------------------------------------------------------------- 以下はフリーズする動画を探すために使ったプログラムです 検索するフォルダのパスを"フォルダのパス"の所にいれると 次々に動画を読み込みます。 動画読み込み前にファイルパスを表示する仕組みになっていますので、 フリーズしたときに上に表示されているのがフリーズした動画です 昔の動画とかいろいろ詰め込んだフォルダで試すと、mp4だとだいたい20個に一つは固まる印象です ※上にのせていたプログラムはUTF-8にしていたので、ANSIに変えています #define _CRT_SECURE_NO_WARNINGS #include "DxLib.h" #define 探す(PATH,EXT) 総数 =ファイル検索( GG道M,PATH, EXT,総数); #define 読込 if(動H!=-1)DeleteGraph(動H); 動H=LoadGraph(GG道M[nb]); int ファイル検索(char 先[][260], char *path, char *ext,int i=0) { char pt[260]; sprintf(pt,"%s/*.%s",path,ext); FILEINFO fi; DWORD_PTR hd=FileRead_findFirst(pt,&fi); if(hd != (DWORD_PTR)-1){do{sprintf(先[i],"%s/%s",path,fi.Name);i++;}while(i<=1000 && FileRead_findNext(hd,&fi)>=0); FileRead_findClose(hd);} return i; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ); SetGraphMode(1000,600,16); if( DxLib_Init() < 0 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); int 総数=0,動H=-1,t=0,nb=10; char GG道M[1010][260],*path ="フォルダのパス"; 探す(path,"mp4"); 探す(path,"flv"); while( ProcessMessage() == 0 ) { ClearDrawScreen() ; DrawExtendGraph(0,0,1000,600,動H,0); if(t==0){ t=30;nb++;if(nb>=総数)nb=0; } else if(t==29){ 読込;/*PlayMovieToGraph(動H);*/ } if(t>0)t--; DrawFormatString( 0,0,GetColor(255,255,255),"総数(%d) パス(%s)",総数,GG道M[nb] ); ScreenFlip(); } DxLib_End(); return 0; } -------------------------------------------------------------------- お手数をおかけいたしますが 何卒よろしくお願いいたします<(_ _)>
メンテ
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.7 )
名前:管理人 日時:2020/09/01 00:22

> 再生できないのはコーデックがなければ仕方ないのですが > せめてフリーズしないようにできるとうれしいです。 すみません、FLVファイルは再生できないファイルなのですが、エラー処理に誤りがあり 内部で途中まで再生できるファイルとして扱ってしまっていて、それがエラーの原因となっていました 修正をしましたので、よろしければお試しください orz https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) > 昔の動画とかいろいろ詰め込んだフォルダで試すと、mp4だとだいたい20個に一つは固まる印象です > ※上にのせていたプログラムはUTF-8にしていたので、ANSIに変えています 特定の mp4ファイルが必ず固まるのでしょうか? もしそうでしたら、直接確認すれば原因が分かると思いますので、よろしければ固まってしまう mp4ファイルをメールで BQE00322(あっとまーく)nifty.com ( (あっとまーく) を @ に置き換えてください ) に送っていただけないでしょうか? m(_ _)m
メンテ
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.8 )
名前:たろう 日時:2020/09/01 01:58

ご対応いただきありがとうございます FLVのファイルでフリーズせず-1が返ってくることを確認いたしました その他申し訳ございません、 MP4のファイルでエラーフリーズしていたものは、ほとんどが拡張子だけMP4で 実体はFlashVideoでした。確認が足りずすみませんm(__)m ほかには、ファイル名に特殊文字が使われているものでエラーが出ていて 名前を直したら読み込めたものと、その他一つだけmp4で名前も特殊文字がなくても 読み込めないものがありましたが、多分それも動画側の問題だと思いますし それらにもちゃんと-1が返ってきてフリーズしなくなっていましたので、 これは期待通りの動作で満足です。ありがとうございますm(__)m 一点最後に質問だけさせていただきたいのですが 以前は多分(記憶があいまいです)コーデックパックを入れてしまえば FLVも再生できたと思うのですが、今回の修正で コーデックがあろうとなかろうと非対応のものは 再生不可になったという事でしょうか? お忙しい所しつこくすみません。 宜しくお願いいたします
メンテ
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.9 )
名前:紺帽子 日時:2020/09/01 07:55

横からですが動画ファイルのWebMを読み込むとアクセス違反で止まってしまいます。 読めないファイルについては常に-1を返してほしいです。
メンテ
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.10 )
名前:管理人 日時:2020/09/02 00:41

> たろうさん > MP4のファイルでエラーフリーズしていたものは、ほとんどが拡張子だけMP4で > 実体はFlashVideoでした。確認が足りずすみませんm(__)m なるほど、了解です > 以前は多分(記憶があいまいです)コーデックパックを入れてしまえば > FLVも再生できたと思うのですが、今回の修正で > コーデックがあろうとなかろうと非対応のものは > 再生不可になったという事でしょうか? いえ、特にその辺りの変更は行っていませんので、もし以前 FLVを再生できたのでしたら、 同じ状況( コーデックがある状況 )であれば再生できると思います > 紺帽子さん 手元で WebM形式の動画ファイルを LoadGraph で読み込んでみましたが、問題無く再生することができました もしこちらの暫定最新版をお使いではありませんでしたら、こちらをお試しになってみてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.11 )
名前:たろう 日時:2020/09/02 09:43

ありがとうございます。 コーデックが入っている場合の動作の件、了解しました 私も手元のwebmで試しましたが問題なく-1が返ってきました。 紺帽子さんのほうで問題がなければ「解決」をお願いいたします。 お忙しい所お手数をおかけいたしました ありがとうございました
メンテ
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.12 )
名前:管理人 日時:2020/09/04 02:10

> たろうさん たろうさんの環境では webm は読み込めず -1 が返ってくるのですね… > 紺帽子さん メールを拝見いたしました こちらでご返信いたします > ・WebMすべてで映像が乱れています。(映像の乱れ.png) 添付していただいたwebmファイルの全部で映像が乱れてしまうバグを修正しましたので、 よろしければこちらの修正版をお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) > ・音声Opus以外はアクセス違反になることがあります。 こちらは手元の環境では発生しませんでした 映像の乱れの修正で直ったのかもしれません > ・音声Opus以外はDxLibのログに"音声データのオープンに失敗しました"が出力されます。 > ・OggVorbisは再生されません。 私の環境でも音声データが OggVorbis の場合は再生できませんでした 件の webmの再生処理時に API に『音声データをデコードしてくれ』とお願いすると 『デコード形式が見つかりませんでした』とエラーが返ってきて、API に渡すパラメータも僅かで 試行錯誤の余地が無いので、現状では音声データが OggVorbis の場合は webmファイルは再生できない、 という仕様になりそうです > 別件なのですが、DXライブラリで内部的に文字列を整数変換する機能があると思います。 > atoiDxやGetPrivateProfileIntDx等。 > > 1.長い文字列を渡すとスタックオーバーランが発生します。 すみません、上記のバージョンで修正しました m(_ _;m > 2.intの表現できる値を超えるとオーバーフローしたまま演算を続けます こちらも atoi と同じ結果が返るように修正しました
メンテ
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.13 )
名前:紺帽子 日時:2020/09/04 21:35

atoiDx等にてエラーが発生しないことを確認できました。 atoiDx等について変換できない文字列を読み飛ばすのは仕様でしょうか? const char *s = "XYZ123"; int n1 = atoiDx(s); //=> 123 int n2 = atoi(s); //=> 0 動画の件では添付したwebmについてはすべて正しく再生できました。 逆に添付したmp4の映像が乱れてしまいました(以前は正しく再生できていました)。 手元のその他webmやmp4について再生を行ったところ 正常に再生できるものと映像が乱れるものに分かれました。 特に大きく映像が乱れるものはアクセス違反で落ちることがあります。
メンテ
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.14 )
名前:管理人 日時:2020/09/06 00:03

> atoiDx等について変換できない文字列を読み飛ばすのは仕様でしょうか? いえ、仕様ではなくバグです (_ _; 修正しましたので、よろしければお試しください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) > 動画の件では添付したwebmについてはすべて正しく再生できました。 > 逆に添付したmp4の映像が乱れてしまいました(以前は正しく再生できていました)。 すみません、添付していただいた webmを再生できるようにしたところ、mp4が正常に再生できなくなっていました こちらも上記のバージョンで修正しましたので、よろしければお試しください m(_ _;m
メンテ
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.15 )
名前:管理人 日時:2020/09/08 02:03

> 紺帽子さん メールありがとうございます 再度こちらでご返信を… > atoi系の処理なのですが >  > const char *s1 = "\n\t 0123"; > int n1 = atoiDx(s1); //=> 0 > int n2 = atoi(s1); //=> 123 >  > const char *s2 = "+XYZ123"; > int n3 = atoiDx(s2); //=> 123 > int n4 = atoi(s2); //=> 0 >  > 現在上記のような結果になっています。 > 先頭の空白類や0などは標準関数だと無視されます。 ご指摘ありがとうございます atoiDx もスペース文字や改行文字を無視する処理を追加しました > 動画のほうは、webmについて読み込み時と再生時に起こっていたアクセス違反はなく > なりました。 > またmp4も既存のファイルは正しく再生できるようになりました。 お試しいただきありがとうございます 正常に再生されるようになったようで何よりです > 映像が正しく表示されないwebmを添付しました。 > webmは解像度によって不具合が起こるようです。 ファイルのご提供ありがとうございます 添付していただいた webmも正常に再生されるように修正しましたので よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) > 小さい動画でも読み込みできるか試していたところ > ハングするmp4が作成できたので一緒に添付します。 こちら試してみたところ、OS の API ( Media Foundation ) の中でエラーが発生してしまっているようで 何時まで待っても API から処理が返ってこない、という状態になってしまっていました エラーが返ってくるなどの場合は対処のしようがあるのですが… なので、とりあえず現状では仕様となります (_ _;
メンテ
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.16 )
名前:たろう 日時:2020/09/08 21:07

たろうです。またすみません<(_ _)> DXライブラリをNo15のものに変更して試したのですが、 下のクリックすると早送りするプログラムで、 30分以上など長めのmp4の動画を読み込んで 画面をクリックしたままで進めていくと、 途中から映像だけ進んで、音声だけ初めから開始されてしまいます そこでさらにクリックするとまた音声もついてきたり 始めから開始されたりと、コロコロ変わるようです 5つほど動画は試しましたが、一つ以外は全て上記の現象が起こりましたので 大抵の動画で再現されると思います。 またwebmについては私は-1が戻れば満足なのですが、念のため試しましたところ 以下の動画で映像のみ再生され音が出ないようです (※windows10ですがコーデックは追加で何も入れていないので当たり前かもしれません) ttps://steamcdn-a.akamaihd.net/steam/apps/256760563/movie480.webm?t=1567094719 何度も申し訳ございません 宜しくお願いいたします<(_ _)> ------------------------------------------------------------------------------------- #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ); SetGraphMode(600,600,16); if( DxLib_Init() < 0 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); int 動H=LoadGraph("動画名.mp4"); PlayMovieToGraph(動H); int t=0,t_plus=60000; while( ProcessMessage() == 0 ) { ClearDrawScreen() ; DrawExtendGraph(0,0,600,600,動H,0); DrawFormatString( 0,0,GetColor(255,255,255),u8"(%d)" ,TellMovieToGraph(動H) ); if(t==0&&(GetMouseInput()&MOUSE_INPUT_LEFT )!=0) { t=30; int t_now=TellMovieToGraph(動H)+t_plus; SeekMovieToGraph(動H,t_now); PlayMovieToGraph(動H); }if(t>0)t--; ScreenFlip(); } DxLib_End(); return 0; }
メンテ
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.17 )
名前:紺帽子 日時:2020/09/08 21:55

atoi系はまだ直っていないようです。 const char *s1 = "+ 1"; atoiDx(s1); //=> 1 atoi(s1); //=> 0 const char *s2 = "++1"; atoiDx(s2); //=> 1 atoi(s2); //=> 0 const char *s3 = "+XYZ-1"; atoiDx(s3); //=> -1 atoi(s3); //=> 0 const char *s4 = "+XYZ+1"; atoiDx(s4); //=> 1 atoi(s4); //=> 0 const char *s5 = "\v1"; atoiDx(s5); //=> 0 atoi(s5); //=> 1 const char *s6 = "\f1"; atoiDx(s6); //=> 0 atoi(s6); //=> 1 ハングする動画について、Windows Media Playerで再生すると "ファイルの再生中にWindows Media Playerに問題が発生しました。" のダイアログがでて再生できませんでした。 ハングはしないので回避する方法はありそうです。 その他の動画については問題なく再生できるようになりました。 アクセス違反と映像の乱れは完全になくなりました。 ただ連続再生していると音声にごくまれに次のような現象が発生しています。 再生中の動画ファイルについて発生し、次の動画が再生されると直ります。 ・動画の最初から最後までプチノイズがはいる ・動画の最初から最後まで音声が一切再生されない ・動画の途中から音が小さくなる 再現性がなく必ず起こるわけではありません。 多くの動画を連続再生した後半に起こります。 再生はSetAlwaysRunFlag(TRUE);を設定して非アクティブ状態でも再生が行われるようにしています。 // 連続再生に使用しているプログラム #include "DxLib.h" #include <fstream> #include <string> #include <vector> // プレイリストを読み取る void ReadPlaylist(const char* filename, std::vector<std::string>& buffer) { std::fstream in(filename); if (!in.is_open()) { return; } std::string line; // バッファ while (std::getline(in, line)) { // 一行ずつ処理する if (line.empty() || line[0] == '#') { continue; } // 空行とコメント行は無視する buffer.push_back(line); // ほかは動画ファイル名と見做して格納する } } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { // プレイリストから動画ファイル名を読み取って連続で再生するプログラム SetGraphMode(1280, 720, 32); SetMainWindowText(DXLIB_VERSION_STR_T); SetAlwaysRunFlag(TRUE); // 非アクティブでも動画再生されるように ChangeWindowMode(TRUE); if (DxLib_Init() < 0) { return -1; } // 再生する動画ファイル名をテキストから読み込む std::vector<std::string> playlist; ReadPlaylist("playlist.txt", playlist); // 連続再生する for (std::size_t i = 0; i < playlist.size(); ++i) { clsDx(); printfDx("%u/%u %s\n", i + 1, playlist.size(), playlist[i].c_str()); PlayMovie(playlist[i].c_str(), 1, DX_MOVIEPLAYTYPE_BCANCEL); if (CheckHitKey(KEY_INPUT_ESCAPE)) { break; } } DxLib_End(); return 0; } > たろうさん スレッドを乗っ取ってしまって申し訳ありません。 > またwebmについては私は-1が戻れば満足なのですが、念のため試しましたところ > 以下の動画で映像のみ再生され音が出ないようです > (※windows10ですがコーデックは追加で何も入れていないので当たり前かもしれません) > ttps://steamcdn-a.akamaihd.net/steam/apps/256760563/movie480.webm?t=1567094719 そのWebMは音声にOggVorbisを使用しているようです。 WebM+OggVorbisの場合は音声はでないのは仕様とのことです。 このスレッドのNo.12を見てください。 たろうさんのプログラムを使用して私の環境で10分近く動画を進めてから ウィンドウの非アクティブ化やタイトルバーをクリックして動画を一旦止めると 音声だけ最初から再生されるという現象が発生しました。 SetAlwaysRunFlag(TRUE);を使用してから同じ動作をすると問題が発生しないようでした。
メンテ
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.18 )
名前:たろう 日時:2020/09/08 22:43

紺帽子さん、プログラムを試していただきありがとうございます すみませんNo12の件見落としていましたm(__)m
メンテ
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.19 )
名前:管理人 日時:2020/09/10 02:56

> たろうさん > 30分以上など長めのmp4の動画を読み込んで > 画面をクリックしたままで進めていくと、 > 途中から映像だけ進んで、音声だけ初めから開始されてしまいます 手元でも同様の現象を確認しました クリックするタイミングや処理の状況によってこの現象が発生してしまうバグがありました 修正版をアップしましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) > 紺帽子さん > atoi系はまだ直っていないようです。 ご指摘ありがとうございます 載せていただいた記述でも atoi と同様の結果が得られるように修正しましたので、 よろしければお試しください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) > ハングする動画について、Windows Media Playerで再生すると > "ファイルの再生中にWindows Media Playerに問題が発生しました。" > のダイアログがでて再生できませんでした。 > ハングはしないので回避する方法はありそうです。 手元の環境で Windows Media Player で再生しようとした場合は "ファイルの再生中にWindows Media Playerに問題が発生しました。"のダイアログは表示されず、 再生中状態になるものの再生時間のバーは動かない、という状態になりました ( ただ、停止ボタンや閉じるボタンは反応する ) 推測ですが、Windows Media Player は再生ボタンや停止ボタンに対応する処理を行うスレッドと 再生処理を行うスレッドが分かれていて、再生処理を行うスレッドはDXライブラリの場合と同じように Media Foundation の API の中から処理が戻ってこない状態に陥っているのではないかと思います ( DXライブラリは閉じるボタンに対応する処理や再生処理が全部一つのスレッドで行っているので 「アプリの応答がありません」状態に陥る ) > ただ連続再生していると音声にごくまれに次のような現象が発生しています。 > 再生中の動画ファイルについて発生し、次の動画が再生されると直ります。 > ・動画の最初から最後までプチノイズがはいる > ・動画の最初から最後まで音声が一切再生されない > ・動画の途中から音が小さくなる 9月6日にメールで頂いたwebmファイルで載せていただいた連続再生プログラムで確認してみたのですが、 手元の環境では再現しませんでした こちらの現象が発生したのはメールで頂いたwebmファイルとは異なるファイルでしょうか? > たろうさんのプログラムを使用して私の環境で10分近く動画を進めてから > ウィンドウの非アクティブ化やタイトルバーをクリックして動画を一旦止めると > 音声だけ最初から再生されるという現象が発生しました。 > SetAlwaysRunFlag(TRUE);を使用してから同じ動作をすると問題が発生しないようでした。 こちらも手元の環境では再現しませんでした ただ、たろうさんからご報告いただいた現象の修正が、こちらの現象にも関わっている可能性が高いので ( 同じ『音声だけ最初から再生される』という現象なので )こちらの現象も一緒に直ったかもしれません よろしければ上記の修正版でもこちらの現象が発生するかお試しください m(_ _;m
メンテ
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.20 )
名前:たろう 日時:2020/09/10 20:18

いつもすみません、たろうです 「途中から映像だけ進んで、音声だけ初めから開始せれる」件につきましては 修正版で先ほど問題なく動作する事を確認いたしました。 お忙しい所ご対応いただきありがとうございました<(_ _)>
メンテ

Page: 1 | 2 |

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

   クッキー保存