動画の遅延再生プログラム
PCとPCカメラを使って、
10秒前後の遅延再生する簡易プログラムを
作りたいと思っております。
WEBカメラのドライバのフリーソフト
EWCLIBを利用して、下記ソースまで
作ったのですが、高スペックなPCにも
かかわらず、フレームレートが
ばらつきます。
フレームレートは30にしており、
妥協して15にしても同様の
問題がおこるので、おそらくWindowsかカメラの
自動制御が悪さをしていると思われます。
当方試行錯誤したのですが、ついに行き詰りました。
ソースの改良、ハードの取替え、動作環境の
変更等対策がありましたらご教授願います。
ちなみに高価なものであれば、すでに同機能以上の
ものが世の中にあるのは把握しておりますので、
なるべくなら、安価に仕上げれるものが
望ましいです。
#include <esplib.h>
#include <ewclib.h>
#pragma comment(lib, "winmm.lib")
#include <crtdbg.h>
#define FRAMES 60
#define WX 320
#define WY 240
float a=0,b=0,c=0;
void ESP_Ready(void)
{
ESP_CreateImage(0,"000",0,0,WX,WY,400);
ESP_OpenTextWindow(0,86,512,439,135);
ESP_Printf("初期化中...\n");
int r= EWC_Open(WX,WY,15);
if(r){
ESP_Printf("Error %d\n",r);
return;
}
ESP_Printf("Startをクリックしてください.\n");
}
void ESP_Main(void)
{
int w=0;
int **latesc;
latesc = new int*[FRAMES];
for(int i=0;i<FRAMES;i++){
latesc[i] = new int[WX*WY];
}
for(;;){
a=timeGetTime();
CopyMemory(ESP_VramPtr[0],latesc[w],WX*WY*4);
// フレームバッファを指定
ESP_Select(0);
ESP_Update();
// 新しいフレームが来るまで待つ
for(;;){
Sleep(1);
if(EWC_IsCaptured(0)) break;
}
// フレーム番号 r の表示
c=timeGetTime();
b = c - a;
ESP_Locate(0,5);
ESP_Printf("ewc_time[0]= %f [s]\n",b);
ESP_Locate(0,3);
ESP_Printf("w=%03d\n",w);
EWC_SetBuffer(0,latesc[w]);
w=(w+1)%(FRAMES-1); //wには最後に書き込まれたフレームを指定する
if(ESP_STOP) break;
}
for(int i=0;i<FRAMES;i++){
delete[] latesc[i];
}
delete[] latesc;
ESP_Printf("Stop\n");
}
void ESP_Finish(void)
{
EWC_Close();
}
お礼
ありがとうございます。デバッガを見たところ、DLL内を指しているため、やはりメインのソースで起こっているみたいです。 ソースの改善はまだ手をつけておりませんが、 ご指摘いただいた箇所は修正かけてみます。 それでも解決できない場合はまたご相談させてください。