>>MillkeyStars
アドバイス有難うございます、ここの意見を参考にMCIをいろいろといじりまわして
ようやく使い勝手が分かってきたので実験ソースコードを貼っておきます
//////// 定数を指定して動作を選ぶ ////////
#define DEVICE_TYPE 1 // 使用するデバイス種類 (0〜3)
#define WINDOW_STYLE 1 // 動画を表示するウィンドウのスタイル(0〜4)
#define VIDEO_HIDE 1 // 動画の非表示フラグ (0 = 表示 | 1 = 非表示)
#define VIDEO_SIZE 1 // 画面のサイズ(0 = 元サイズ | 1 = ストレッチ | 2 = フルスクリーン)
//////////////////////////////////////////
buffer 1
picload dir_exe+"/doclib/cg.gif"
w = ginfo_sx : h = ginfo_sy
screen 0, ginfo_dispx/2, ginfo_dispy/2
onexit *exit_routine
button "open", *restart
x = ginfo_cx : y = ginfo_cy
pos (ginfo_sx - w)/2, (ginfo_sy - h)/2
gcopy 1, 0, 0, w, h
pos x, y
stop
*start
// 再生ファイルを選択
dialog "", 16
if stat == 0 : end
FilePass = refstr
// ※使用するデバイスタイプ(DEVICE_TYPE)
switch DEVICE_TYPE
case 1 : devtype = "type mpegvideo" : swbreak // スプリッタとコーデックが揃えば何でも再生できるので、一番有効
case 2 : devtype = "type mpegvideo2" : swbreak
case 3 : devtype = "type avivideo" : swbreak
default : devtype = "" // 拡張子から自動的に選択
swend
// ※表示するウィンドウのスタイル(WINDOW_STYLE)
playflags = ""
switch WINDOW_STYLE
case 1 : wstyle = "style child parent "+hwnd : swbreak // 子ウィンドウ
case 2 : wstyle = "style overlapped parent "+hwnd : swbreak // オーバーラップウィンドウ
case 3 : wstyle = "style popup parent "+hwnd : swbreak // ポップアップウィンドウ
case 4 // メインウィンドウに直接表示
default : wstyle = "" // MCIの独自ウィンドウ
swend
// MCIを開く
mci strf("open \"%s\" alias HSP %s %s",FilePass, devtype, wstyle )
if stat == -1 : dialog "MCIオープン失敗" : goto *exit_routine
if WINDOW_STYLE == 4 : mci "window HSP handle " + hwnd // メインウィンドウのハンドルを渡す
// ステータスを調べる
mci "capability HSP device type" // デバイスタイプ
devtype = refstr
mci "where HSP source" // 画面サイズ
rec=refstr
dim as,4
split rec," ",as
title strf("デバイスのタイプ:%s / サイズ:%s, %s", devtype, as(2), as(3))
// ※動画の非表示フラグ (VIDEO_HIDE)
if VIDEO_HIDE {
if WINDOW_STYLE == 4 {
mci strf("put HSP destination at -%d -%d %d %d", as(2), as(3), as(0), as(1))
}else{
mci strf("put HSP window at -%d -%d %d %d", as(2), as(3), as(0), as(1))
}
mci "play HSP"
mci "window HSP state hide"
stop
}
if WINDOW_STYLE == 1 or WINDOW_STYLE == 4{
origin_x = ginfo_cx : origin_y = ginfo_cy
origin_w = ginfo_sx-ginfo_cx : origin_h = ginfo_sy-ginfo_cy
}else{
origin_x = ginfo_wx1 : origin_y = ginfo_wy1
origin_w = ginfo_sizex : origin_h = ginfo_sizey
}
// ※動画を表示するウィンドウのスタイル(VIDEO_SIZE)
switch VIDEO_SIZE
case 1 // ストレッチ
video_aspect = 1.0 * int(as(2)) / int(as(3))
window_aspect = 1.0 * origin_w / origin_h
if window_aspect < video_aspect {
video_w = origin_w
video_h = 1.0 * video_w / video_aspect
video_x = origin_x
video_y = origin_y + (origin_h - video_h) / 2
}else{
video_h = origin_h
video_w = 1.0 * video_h * video_aspect
video_y = origin_y
video_x = origin_x + (origin_w - video_w) / 2
}
swbreak
case 2 // フルスクリーン
wait 10 // ダイアログを閉じた後フルスクリーンをする場合これがないと画面が落ちる
mci "play HSP fullscreen"
stop // フルスクリーンはここで処理停止
case 0 // 元サイズ
default
video_w = as(2)
video_h = as(3)
video_x = origin_x + (origin_w - video_w) / 2
video_y = origin_y + (origin_h - video_h) / 2
swend
// 画面の出力位置、サイズを指定
if WINDOW_STYLE == 4 {
mci strf("put HSP destination at %d %d %d %d", video_x, video_y, video_w, video_h)
}else{
mci strf("put HSP window at %d %d %d %d", video_x, video_y, video_w, video_h)
}
// 再生
mci "play HSP"
stop
// 再生しなおす
*restart
mci "close HSP"
goto *start
//終了処理
*exit_routine
mci "close HSP"
end
実験環境
OS:WindowsXP SP3
コーデック:ffdshow
スプリッタ:FLVSplitter.ax, MP4Splitter.ax
上記の環境で手持ちのavi, mpg, wmv, flv, mp4ファイルは一通り再生できました