// sample17.hsp 0.5秒毎にコマ送り再生(音声あり) #include "hspdsp.as" dsp_Init dialog "*",16 if stat=0:stop fname=refstr //MDet系命令呼び出し dsp_MDetOpen fname //ストリームの総数を取得 Streams=dsp_MDetGetOutputStreams() repeat Streams dsp_MDetSetCurrentStream cnt Type=dsp_MDetGetStreamType() if Type=0{ mes "VideoStream = "+cnt fps=(1.0*dsp_MDetGetFrameRate()/100) len=(1.0*dsp_MDetGetStreamLength()/100) mes "-> "+fps+" fps (フレームレート)" mes "-> "+len+" s (秒)" mes "-> "+int(fps*len)+" frames (フレーム数)" } if Type=1{ mes "AudioStream = "+cnt } loop //使い終わったらお片づけ dsp_MDetClose dialog // システム標準のレンダラーで開く dsp_Open refstr,OPEN_DEFAULT_RENDERER,0,0,0 //サイズを取得 x=dsp_info(0):y=dsp_info(1) onexit *exit ; 終了時開放するため dsp_Play hwnd,0,0,640,480 ; 0,0 座標に 640x480 の大きさで表示 dsp_Stop ;一時停止 dsp_SetEvHWND hwnd ;イベントがメッセージとして通知されます。 oncmd gosub *change,WM_GRAPH_NOTIFY ;イベント通知 repeat s=dsp_CanFrameStep(int(fps)) //毎回実行させる(値は0でも実は問題なし。) dsp_SetFrameStep int(fps)+1/2 //毎回実行させる title "現在のフレーム "+cnt+": 目標フレーム数 "+int(2*len)+"" //コマ送り操作完了までループさせる repeat if stream_end=36:break // コマ送り操作完了 if stream_end=1:break // 再生終了 wait 12 loop if stream_end=1:break // 再生終了 stream_end=0 wait 1 loop dialog "再生終了" stop *exit dsp_Stop dsp_Close ; メディアファイルを閉じる dsp_Exit ; 開放 end *change // 自前で処理する場合は dsp_GetStopped()を使ってイベントID をとります。 // この際、- 値に変わるまでループしてください。(取りこぼしを防ぐため。) repeat tmp=dsp_GetStopped() ;tmp に イベントID が入ります。 if tmp<0:break ;値が - を返すまでループ // 1 はグラフの再生が終了したときに返ります。 sdim tt,128 dupptr tt,dsp_getmediaevstr(tmp),128,2 // 今回は1と36しか処理しないのでこれでOK // 1 = 再生完了 // 36 = コマ送り操作完了 if tmp=36:stream_end=36 if tmp=1:stream_end=1:break loop return