とりあえず、時間があったので俺も作ってみました。
#include "hmm.as"
#define WindowWidth 640 ;ウィンドウの幅
#define WindowHight 480 ;ウィンドウの高さ
#define ScreenMode 1 ;0でフル,1でウィンドウ(フルスクだと面倒なので今はウィンドウモード)
SetFrame=160000 ;取得位置
NowDir=dirinfo(0) ;現在のディレクトリ
onexit goto *system_end
dialog "avi;*.wmv;*.mpg", 16, "ビデオ"
Fname=refstr
if (strlen(Fname)==0) {
dialog "ファイルが選択がされなかったので終了します。"
end
}
title ""+Fname
;ID0のウィンドウを作成(画面の真ん中に表示するため。あってもなくてもいい。)
screen 0,WindowWidth,WindowHight,0,((ginfo_dispx-WindowWidth)/2),((ginfo_dispy-WindowHight)/2)
dginit
if (stat==DG_ERR):end ;初期化失敗時は停止
dgscreen WindowWidth,WindowHight,ScreenMode,32,0 ;ウィンドウ作成
dshinit 1,1
if (stat==DSH_ERR):end ;初期化失敗時は停止
dshloadfname ""+Fname,1 ;動画読み込み
DSHGETORIGINALVIDEOSIZE 1,MovieWidth,MovieHight ;動画のXYサイズを取得
dgbuffer 1,MovieWidth,MovieHight ;バッファ作成
dggsel 1:dgcolor 0,0,0,255:dgclear ;バッファクリア(一応)
DSHSETMOVIETODGBUFFER 1,1 ;バッファを関連付け
dshplay 1 ;再生
dggsel 0
movie_cap_flag=0 ;フラグ
count=0
*main
await 0
title ""+Fname+":Seek"+Nowseek+"/"+MaxFrameNo
DSHGETPLAYPOSITION 1,Nowseek,MaxFrameNo ;動画の長さを取得
stick key,0
if (key&128):goto *system_end ;ESCで終了
if (key&16):movie_cap_flag=1
dgcolor 0,0,0,255:dgclear ;画面クリア
dgcolor 255,255,255,255
dgScaleAndAngle WindowWidth, WindowHight, 0
dgpos 0,0:dgrect 0,0,MovieWidth,MovieHight
if (movie_cap_flag):DSHSETSEEK 1,SetFrame
dggcopy 1,2
dgredraw
if (movie_cap_flag):{
DSHGETPLAYPOSITION 1,Nowseek,MaxFrameNo ;動画の長さを取得
if ((SetFrame>=Nowseek)):{
chdir NowDir
DGBMPSAVE "shot.bmp"
count ++
}
}
if (count>60):goto *system_end
goto *main
;終了処理
*system_end
dshend
dgend
end
動画を再生したら、スペースキーを押して下さい。
指定位置をキャプチャします。
キーを押してから1秒間、毎フレームキャプチャします。
何でこうするかというと、
シークセット→キャプチャ→すぐ終了ってやると、
画面が更新される前に終了してしまい、正しくキャプチャできないからです。
「これくらいやれば、大丈夫だろ」ってぐらいの時間を設定しています。
ただ、これは親の速いマシンで作ったので、俺のマシンでは無理でした。
>>これらのプラグインはきちんと動作確認はされているのでしょうか?
おそらくされています。
遅いマシンでは画面の更新が追いついてないだけでしょう。多分。
あとは、こういう使い方をすると思って作ってないということもあるかと思います。
>>hmm.dllで呼び出されたバッファはDSHENDを呼び出してもクリアされず残ってしまうの
>>ではないでしょうか?
>>それに加えてDSHINITやDGINITで、ただ単に使用しますというフラグが立つだけで
>>初期化されてないって事はないですか?
そうかもしれません。dshの方はわかりませんが、dg系は実際前にありました。
ただ、そういうのは「dgcolor 0,0,0,255:dgclear:dgredraw」で消せば何とかなります。
とりあえず、シークセット→キャプチャ→すぐ終了ってやると、
正しくキャプチャできないのは確かです。俺が作ったやつみたいに、
しばらく再生してからでないと難しいかと。
これ以上のものは今の俺では無理です。申し訳ない、力になれなくて。
あと、さっき調べてたら、VFW(Video for Windows)ってのAPIを使えばできるって
ありました。
もっとも、俺はAPI詳しくないからさっぱりなんですが…
>>「○○すると幸せになれるかもしれません」って台詞は相手をバカにしているとしか思えません。
バカにしてるつもりないんですけどね…
飛角さんがそう感じたのなら謝ります。すいません。
ただ、 NO.16378レスの最後で
>>今回はまともな回答でした。(NO.16378より引用)
「今回は」ってことは、これ以外は(実際まともに答えていたとしても)まともに答えて
ないって取られても仕方のないレスをしてる人には言われたくないですよねぇ、StarratSさん?