トラックバーで代用してみました。
ドラッグのみ対応です。
キー操作や任意の位置でマウスクリックなども行ないたい場合は頑張ってください。
//↓64ビット整数値変換モジュール
#module
// このモジュールは↓からいただきました。
// http://hsp.tv/play/pforum.php?mode=pastwch&num=65456
#defcfunc i642str int lowint,int hiint
//64ビットの整数を文字列に変換
// lowint...下位32ビットを指定
// hiint...上位32ビットを指定
db = 1.0
lpoke db,0,lowint:lpoke db,4,hiint
return strf("%I64d",db)
// 文字列を64ビット数値へ変換(API使用)
#uselib "Shlwapi.dll"
#func StrToInt64Ex "StrToInt64ExA" str, int, var
#deffunc str2i64 str s1, var i1
StrToInt64Ex s1, 0, i1;
return;
#global
#define IID_IMFPMediaPlayer "{A714590A-58AF-430a-85BF-44F5EC838D85}"
#usecom IMFPMediaPlayer IID_IMFPMediaPlayer "{}"
#comfunc IMFPMediaPlayer_Play 3
#comfunc IMFPMediaPlayer_Pause 4
#comfunc IMFPMediaPlayer_Stop 5
#comfunc IMFPMediaPlayer_FrameStep 6
#comfunc IMFPMediaPlayer_SetPosition 7 var, var // 追加
#comfunc IMFPMediaPlayer_GetPosition 8 var, var // 追加
#comfunc IMFPMediaPlayer_GetDuration 9 var, var // 追加
#comfunc IMFPMediaPlayer_SetRate 10 float
#comfunc IMFPMediaPlayer_Shutdown 38
newcom iMFPlayer,IMFPMediaPlayer
#uselib "Mfplay"
#func MFPCreateMediaPlayer "MFPCreateMediaPlayer" wstr,int,int,int,int,var
#uselib "Mfplat"
#func MFStartup "MFStartup" int,int
#func MFShutdown "MFShutdown"
#define MFSTARTUP_NOSOCKET 0x1
#define MFSTARTUP_LITE (MFSTARTUP_NOSOCKET)
#define MFSTARTUP_FULL 0
MFP_POSITIONTYPE_100NS = 0, 0, 0, 0; // GUID
screen 0,800,800
title "Media Foundation (1.3倍速再生サンプル)"
LOADED=0
onexit *lEnd
objsize 100,24
pos ginfo_winx-500,0
button gosub "Load",*lFileLoad
pos ginfo_winx-400,0
button gosub "Play",*lPlay
pos ginfo_winx-300,0
button gosub "Pause",*lPause
pos ginfo_winx-200,0
button gosub "Stop",*lStop
pos ginfo_winx-100,0
button gosub "Step",*lStep
// トラックバー
pos 0, 0;
tWidth = 300; // トラックバーの幅
winobj "msctls_trackbar32", "", 0, 0x40000000 | 0x10000000, tWidth, 24; // WS_CHILD | WS_VISIBLE
hTrackbar = objinfo(stat, 2);
sendmsg hTrackbar, 0x405, 1, 0; // 位置調整 (TBM_SETPOS)
oncmd gosub *tHscroll, 0x0114; // トラックバーの位置取得 (WM_HSCROLL)
trackFlag = 1;
gosub *lFileLoad
// 再生中のループ
*main
if LOADED {
NowTime = "";
PROPVARIANT = 0, 0, 0, 0; // PROPVARIANT構造体の初期化
IMFPMediaPlayer_GetPosition iMFPlayer, MFP_POSITIONTYPE_100NS, PROPVARIANT; // 現在の再生時間を取得(100ナノ秒単位)
NowTime = i642str(PROPVARIANT.2,PROPVARIANT.3); // 現在の再生時間を文字列で取得(100ナノ秒単位)
if(strlen(NowTime) > 4) {
lpoke NowTime, strlen(NowTime) - 4, 0; // 現在の再生時間を下位4桁切り捨てでミリ秒単位に変換
}
intNT = int(NowTime); // 全体をミリ秒(整数値)に変換
if( trackFlag ) {
sendmsg hTrackbar, 0x405, 1, intNT * 100 / intAT; // トラックバーの位置調整 (TBM_SETPOS)
}
}
wait 10;
goto *main;
;stop
*lFileLoad
dialog "mp4;*.avi;*.mpg;*.mpeg",16
if stat=0{
if LOADED{
return
}else{
stop
}
}
file=refstr
gosub *lLoad
IMFPMediaPlayer_SetRate iMFPlayer,1.3 ;1.3倍速再生
return
*lLoad
if LOADED{
gosub *lRelease
}
MFStartup
MFPCreateMediaPlayer file, 1,0,0,hwnd,iMFPlayer
; ↑0にすると自動再生しない
LOADED=1
PROPVARIANT = 0, 0, 0, 0; // PROPVARIANT構造体の初期化
AllTime = "";
// 動画の読み込み待機
repeat
IMFPMediaPlayer_GetDuration iMFPlayer, MFP_POSITIONTYPE_100NS, PROPVARIANT; // 動画全体の長さを取得(100ナノ秒単位)
if(stat == 0): break;
wait 10;
loop
AllTime = i642str(PROPVARIANT.2,PROPVARIANT.3); // 動画全体の長さを文字列で取得(100ナノ秒単位)
if(strlen(AllTime) > 4) {
lpoke AllTime, strlen(AllTime) - 4, 0; // 動画全体の長さを下位4桁切り捨てでミリ秒単位に変換
}
else {
AllTime = "1"; // 動画の長さが1ミリ秒以下の場合は0除算回避のため1ミリ秒とする
}
intAT = int(AllTime); // 全体をミリ秒(整数値)に変換
return
*lRelease
gosub *lStop
IMFPMediaPlayer_Shutdown iMFPlayer
MFShutdown
return
*lPlay
if LOADED : IMFPMediaPlayer_Play iMFPlayer
return
*lPause
if LOADED : IMFPMediaPlayer_Pause iMFPlayer
return
*lStop
if LOADED : IMFPMediaPlayer_Stop iMFPlayer
return
*lStep
if LOADED : IMFPMediaPlayer_FrameStep iMFPlayer
return
// トラックバー処理
*tHscroll
if( lParam = hTrackbar ) {
if( (wParam & 0xFFFF) == 0x0004 ) { // TB_THUMBPOSITION
gosub *lPause; // 一時停止
sendmsg hTrackbar, 0x0400, 0, 0; // TBM_GETPOS
tPos = stat;
intCT = intAT * tPos / 100; // 変更後の時間(ミリ秒)
StrCT = ""+intCT+"0000"; // 変更後の時間 文字列形式(100ナノ秒)
PROPVARIANT = 20, 0, 0, 0; // PROPVARIANT構造体の初期化
str2i64 StrCT, PROPVARIANT(2); // 文字列を64ビット整数値に変換
IMFPMediaPlayer_SetPosition iMFPlayer, MFP_POSITIONTYPE_100NS, PROPVARIANT; // 再生時間の変更
gosub *lPlay; // 再生再開
trackFlag = 1;
}
if( (wParam & 0xFFFF) == 0x0005 ) { // TB_THUMBTRACK
trackFlag = 0;
}
}
return;
*lEnd
if LOADED{
gosub *lRelease
}
mes "MFShutdown:"+stat
end