sample\hspdsc\(HSP3) sample [Omake].hsp » Plain Format
/*********************************************************************
(おまけ)DirectShow を直接 HSP で取扱ってみるサンプル
DirectShow経由でメディアファイルを開きます。
MCIを使ったほうが断然早いような気が…。
でも、対応したデコーダとスプリッタがあれば、FLVだろうとMP4だろうと
取扱えるので便利かもしれない。
*********************************************************************/
#define CLSID_FilterGraph "{e436ebb3-524f-11ce-9f53-0020af0ba770}"
#define IID_GraphBuilder "{56a868a9-0ad4-11ce-b03a-0020af0ba770}"
#define IID_MediaControl "{56a868b1-0ad4-11ce-b03a-0020af0ba770}"
#define IID_MediaPosition "{56a868b2-0ad4-11ce-b03a-0020af0ba770}"
#define IID_MediaSeeking "{36b73880-c2c8-11cf-8b46-00805f6cef60}"
#define IID_VideoWindow "{56a868b4-0ad4-11ce-b03a-0020af0ba770}"
#define IID_BasicVideo "{56a868b5-0ad4-11ce-b03a-0020af0ba770}"
#define WS_CHILD 0x40000000
#define WS_CLIPSIBLINGS 0x04000000
#define WM_APP 0x8000
#define WM_GRAPH_NOTIFY WM_APP + 1
#usecom IGraphBuilder IID_GraphBuilder CLSID_FilterGraph
#usecom IMediaControl IID_MediaControl CLSID_FilterGraph
#usecom IMediaPosition IID_MediaPosition CLSID_FilterGraph
#usecom IMediaSeeking IID_MediaSeeking CLSID_FilterGraph
#usecom IVideoWindow IID_VideoWindow CLSID_FilterGraph
#usecom IBasicVideo IID_BasicVideo CLSID_FilterGraph
// COMの初期化
newcom pGraphBuilder, IGraphBuilder
// COMのQueryInterface呼び出し
querycom pMediaControl, pGraphBuilder, IMediaControl
querycom pMediaSeeking, pGraphBuilder, IMediaSeeking
querycom pMediaPosition, pGraphBuilder, IMediaPosition
querycom pVideoWindow, pGraphBuilder, IVideoWindow
querycom pBasicVideo, pGraphBuilder, IBasicVideo
onerror gosub *error : onerror 0 ; COMエラー回避用
onexit *exit
dialog "*", 16
if stat == 0 : end
pMediaControl->"RenderFile" refstr
if stat != 0 : dialog "レンダラ失敗", 1 : gosub *exit
// ビデオ レンダラが接続されていない場合、
// IVideoWindowインターフェイスのメソッドはすべてエラー コード VFW_E_NOT_CONNECTED を返す。
// そのためか、HSP側でエラーが発生し終了してしまうのでonerrorで一時的に回避。
;mes varuse(pVideoWindow)
onerror 1 ; エラー回避
pVideoWindow("WindowStyle") = WS_CHILD | WS_CLIPSIBLINGS
pVideoWindow("Owner") = hwnd
pVideoWindow->"SetWindowPosition" 0, 0, 640, 480
onerror 0 ; エラー回避終了
pMediaPosition("Rate") = 1.3f ; 再生速度が指定可能
pMediaControl->"Run"
val = pMediaPosition("StopTime") ; トータル時間を取得
repeat ; 再生時リピート
val2 = pMediaPosition("CurrentPosition") ; 現在の時間を取得
title ""+strf("%4.1f秒", val2)
if val2 == val : pMediaPosition("CurrentPosition") = 0 : pMediaControl->"Run"
wait 12
loop
stop
*exit
pMediaControl->"Stop"
delcom pBasicVideo
delcom pVideoWindow
delcom pMediaSeeking
delcom pMediaPosition
delcom pMediaControl
delcom pGraphBuilder
end
*error
return