Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.1 ) |
- 名前:管理人 日時:2020/08/27 03:25
|
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
|
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.4 ) |
- 名前:たろう 日時:2020/08/29 08:17
ご対応いただきありがとうございます
さきほどTellMovieToGraphの件と、音がついてこない件につきまして、
問題なく動作する事を確認いたしました。
すみません、またご確認いただきたい点があるのですが
No2のプログラムのままで、クリックを繰り返すと動画が進んで
末尾まで行くと思いますが、末尾を超えると
停止せず勝手に頭から再生がはじまり、
そしてその時音声だけが再生される感じになってしまっているようです
(※たまに映像も再生される事もあったりするようです)
TellMovieToGraphToFrameとSeekMovieToGraphToFrameを使った場合だけでなく
TellMovieToGraphとSeekMovieToGraphを使った場合も同じ現象が発生するようです
たびたびすみません、ご確認いただけますでしょうか?
宜しくお願いいたします<(_ _)>
|
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.5 ) |
- 名前:管理人 日時:2020/08/31 02:09
|
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
|
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
|
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.11 ) |
- 名前:たろう 日時:2020/09/02 09:43
ありがとうございます。
コーデックが入っている場合の動作の件、了解しました
私も手元のwebmで試しましたが問題なく-1が返ってきました。
紺帽子さんのほうで問題がなければ「解決」をお願いいたします。
お忙しい所お手数をおかけいたしました
ありがとうございました
|
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.12 ) |
- 名前:管理人 日時:2020/09/04 02:10
 |
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
|
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.15 ) |
- 名前:管理人 日時:2020/09/08 02:03
 |
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
 |
Re: 動画の長さを超えた位置指定でフリーズ…を回避する方法 ( No.20 ) |
- 名前:たろう 日時:2020/09/10 20:18
いつもすみません、たろうです
「途中から映像だけ進んで、音声だけ初めから開始せれる」件につきましては
修正版で先ほど問題なく動作する事を確認いたしました。
お忙しい所ご対応いただきありがとうございました<(_ _)>
|