sample\hspdsp\sample17.hsp » Plain Format
// 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