今回質問させていただきたいのは、
タイトルの通り連続再生(非同期)についてです。
OpenMovieToGraph() または、 LoadGraph()で
一気に使用動画のグラフィックハンドルを取得してから、
再生を開始させ、GetMovieStateToGraph() にて再生が終わったか判断し
次の動画の再生を開始する。
という一連の流れのプログラムを書いていましたが、
動画切り替わりのタイミングで、黒背景が1〜4フレームほど出てしまいます。
約1秒ごとに、約500KB〜700KB程度の動画へ再生を切り替える処理になっているので、
読み込みが追いついていないのかと考え、
動画をなるべく軽くしたり、切り替え判別に
TellMovieToGraph()なども使用してみましたが一向に改善せず...
何か解決策、または代替案などはないものでしょうか?
以下に、症状発生時のコードを載せます。
【ソースコード】
#include "DxLib.h"
#include <stdlib.h>
#include <time.h>
int Init(void); // 初期化関数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
int MovieGraphHandle[3] = {-1, -1, -1}; // グラフィックハンドル
int rnd = 0; // 乱数
/*** 初期化処理 ***/
if(Init()){
return -1;
}
/*** グラフィックハンドルロード ***/
MovieGraphHandle[0] = OpenMovieToGraph("./data/030.avi");
MovieGraphHandle[1] = OpenMovieToGraph("./data/030_1.avi");
MovieGraphHandle[2] = OpenMovieToGraph("./data/030_2.avi");
/*** 全て再生位置を先頭へ ***/
SeekMovieToGraph(MovieGraphHandle[0], 0);
SeekMovieToGraph(MovieGraphHandle[1], 0);
SeekMovieToGraph(MovieGraphHandle[2], 0);
/*** 1つめの動画の再生 ***/
PlayMovieToGraph(MovieGraphHandle[rnd]);
/*** メインループ ***/
while(ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0){
DrawExtendGraph(0, 0, 640, 480, MovieGraphHandle[rnd], FALSE); // イメージの描画
/*** 再生が終わった(?) ***/
if((GetMovieStateToGraph(MovieGraphHandle[rnd])) == 0){ // TellMovieToGraph() もうまくいかない(?)
/*** ランダムに次の動画を選択し、再生開始 ***/
rnd = rand() % 3;
SeekMovieToGraph(MovieGraphHandle[rnd], 0);
PlayMovieToGraph(MovieGraphHandle[rnd]);
}
}
/*** DXライブラリ終了処理 ***/
DxLib_End();
return 0;
}
int Init(void){
/*** ウィンドウモードに設定 ***/
ChangeWindowMode(TRUE);
/*** ログ出力を行わない ***/
SetOutApplicationLogValidFlag(FALSE);
/*** DXライブラリ初期化 ***/
if(DxLib_Init() == -1){
return -1;
}
/*** 非アクティブ状態でも動作するように設定 ***/
SetAlwaysRunFlag(TRUE);
/*** ウィンドウサイズとカラービット数の設定 ***/
SetGraphMode(640, 480, 32);
/*** ダブルバッファ & バイリニア補間方式へ ***/
SetDrawScreen(DX_SCREEN_BACK);
SetDrawMode(DX_DRAWMODE_BILINEAR);
/*** ウィンドウタイトルの設定 ***/
SetMainWindowText("mod");
/*** 乱数初期化 ***/
srand((unsigned int)time(NULL));
return 0;
}