sample\iron\sample_video_player2.hsp » Plain Format
;============================================================
; sample_video_player2.hsp — iron_video フル機能 GUI プレイヤー
;
; シークバー + 現在時刻 / 全長 / 再生速度 / 音量スライダ付き。
; iron_video.hsp の Position/Duration API (PROPVARIANT) を活用。
;============================================================
#include "hsp3_net_64.as"
#include "iron_video.hsp"
title "iron_video Player — シークバー付き"
screen 0, 900, 680
font "MS Gothic", 14
loaded = 0
vol_int = 80
rate_idx = 2 ; 0:0.5x 1:0.75x 2:1.0x 3:1.25x 4:1.5x 5:2.0x
; ----- UI -----
pos 10, 10
objsize 80, 28
button gosub "Open", *do_open
pos 100, 10
objsize 60, 28
button gosub "Play", *do_play
pos 165, 10
objsize 70, 28
button gosub "Pause", *do_pause
pos 240, 10
objsize 60, 28
button gosub "Stop", *do_stop
pos 305, 10
objsize 80, 28
button gosub "-10s", *do_back10
pos 390, 10
objsize 80, 28
button gosub "+10s", *do_fwd10
pos 500, 14
mes "速度:"
pos 540, 10
objsize 50, 28
button gosub "0.5x", *do_r05
pos 595, 10
objsize 50, 28
button gosub "1.0x", *do_r10
pos 650, 10
objsize 50, 28
button gosub "1.5x", *do_r15
pos 705, 10
objsize 50, 28
button gosub "2.0x", *do_r20
pos 770, 14
mes "Vol:"
pos 800, 10
objsize 80, 24
input vol_int, 4, 4, 24
; Video area (10, 50) - (890, 560)
color 16, 16, 16 : boxf 10, 50, 890, 560 : color 0, 0, 0
pos 380, 300
color 200, 200, 200
mes "Open で動画選択"
color 0, 0, 0
; Seek bar area: (10, 580) - (890, 610)
; Info: (10, 620) - (890, 660)
gosub *redraw_ui
*main_loop
; マウスでシークバークリック
getkey k_lb, 1
if k_lb {
mx = mousex
my = mousey
if (my >= 580) & (my <= 610) & (mx >= 10) & (mx <= 890) {
if loaded {
dur = iron_video_duration_ms()
if dur > 0 {
; click_x → 位置比
ratio = (mx - 10) * 1000 / 880
new_pos = dur * ratio / 1000
iron_video_seek_ms new_pos
}
}
repeat 5 : await 20 : loop
}
}
; 音量更新
if loaded : iron_video_set_volume 0.01 * double(vol_int)
gosub *redraw_ui
await 100
goto *main_loop
*redraw_ui
cur = 0 : dur = 0
if loaded {
cur = iron_video_position_ms()
dur = iron_video_duration_ms()
}
; シークバー
color 60, 60, 60 : boxf 10, 580, 890, 610
color 100, 100, 100
line 10, 580, 890, 580
line 10, 610, 890, 610
if dur > 0 {
bar_w = 880 * cur / dur
color 80, 160, 240 : boxf 10, 583, 10 + bar_w, 607
}
; 時刻表示
color 32, 32, 32 : boxf 10, 620, 890, 660 : color 0, 0, 0
color 255, 255, 255
pos 10, 625
cur_s = cur / 1000
dur_s = dur / 1000
mes strf("%02d:%02d / %02d:%02d 状態: code=%d", cur_s / 60, cur_s \ 60, dur_s / 60, dur_s \ 60, iron_video_state())
color 0, 0, 0
return
*do_open
dialog "mp4;*.mkv;*.avi;*.wmv;*.mov;*.mp3;*.wav", 16
if stat = 0 : return
fname = refstr
if loaded : iron_video_close
color 16, 16, 16 : boxf 10, 50, 890, 560 : color 0, 0, 0
iron_video_open fname, hwnd
loaded = 1
iron_video_set_rate 1.0
return
*do_play : if loaded : iron_video_play
return
*do_pause : if loaded : iron_video_pause
return
*do_stop : if loaded : iron_video_stop
return
*do_back10
if loaded {
cur = iron_video_position_ms()
new_pos = cur - 10000
if new_pos < 0 : new_pos = 0
iron_video_seek_ms new_pos
}
return
*do_fwd10
if loaded {
cur = iron_video_position_ms()
dur = iron_video_duration_ms()
new_pos = cur + 10000
if new_pos > dur : new_pos = dur
iron_video_seek_ms new_pos
}
return
*do_r05 : if loaded : iron_video_set_rate 0.5
return
*do_r10 : if loaded : iron_video_set_rate 1.0
return
*do_r15 : if loaded : iron_video_set_rate 1.5
return
*do_r20 : if loaded : iron_video_set_rate 2.0
return