dsp_CaptureVideoExを用いた縮小キャプチャ2
撃 2013/6/2(Sun) 13:02:42|NO.54493
前回解決済みとしましたので新スレで失礼します。
おかげさまで動画リアルタイムキャプチャができるようになったのですが、
フレームの取得が少々不安定というか、処理が重たいわけでは
なさそうながらややガタつきが出る場合があります。
現在使っているルーチンでテストソースを組んでみました。
より高速化、安定化できる点がありましたらご指摘ください。
#include "user32.as"
#include "gdi32.as"
#include "hspdsp.as"
dsp_Init
screen 0,320,240,0,0,0
buffer 10,64,64,0
screen 11,256,256,0,327,0 ;実際はscreenではなくbufferで使用
dialog "*",16,"メディアファイル" ;ファイル選択
if stat=0:end
gsel 10
dsp_UseCaptureVideoEx 1
dsp_Open refstr,OPEN_DEFAULT_RENDERER,0,0,0
dsp_SetCaptureBufferSamples 1
onexit *exit ;Xで終了する
bai=0
size=64
gsel 11
SetStretchBltMode hdc,4 ;きれいに縮小するモード選択
dsp_Play hwnd,0,0,0,0 ;再生開始
*main
stick ky ;スペースキーでキャプチャサイズを変える
if ky&16{bai++:bai=bai\8:size=64+bai*16}
gsel 11
dsp_CaptureVideoEx hdc,0,0,size,size*dsp_info(1)/dsp_info(0),SRCCOPY
redraw
mref vram,66
gsel 0
color 255,255,255:boxf
color 0,0,0:pos 0,0:mes"メインウィンドウ"
pos 0,16:mes"キャプチャサイズX:"+size
pos 0,32:mes"キャプチャサイズY:"+size*dsp_info(1)/dsp_info(0)
pos 0,48:mes"vram読み取りテスト:"+peek(vram,195500)
await 0 ; ↑0〜196607までの任意の整数値
goto *main
*exit
dsp_Stop
dsp_Close
dsp_Exit
end
inovia 2013/6/2(Sun) 13:39:46|NO.54494
フレームが変更されているかどうかチェックし、
されている場合はdsp_CaptureVideoExを実行したほうが若干軽くなるかも。
#include "user32.as"
#include "gdi32.as"
#include "hspdsp.as"
dsp_Init
screen 0, 320, 240, 0, 0, 0
buffer 10, 64, 64, 0
screen 11, 256, 256, 0, 327, 0 ;実際はscreenではなくbufferで使用
dialog "*", 16, "メディアファイル" ;ファイル選択
if stat = 0 : end
gsel 10
dsp_UseCaptureVideoEx 1
dsp_Open refstr, OPEN_DEFAULT_RENDERER, 0, 0, 0
dsp_SetCaptureBufferSamples 1
onexit *exit ;Xで終了する
bai = 0
size = 64
gsel 11
SetStretchBltMode hdc, 4 ;きれいに縮小するモード選択
// フレーム数に変更(うまくいかない場合もあり)
dsp_SetMediaSeeking 1, 1
dsp_Play hwnd, 0, 0, 0, 0 ;再生開始
current_time = -1
*main
// フレームが変わっているかチェック
if current_time = dsp_GetMediaSeeking(3){
await 0
goto *main
}else{
current_time = dsp_GetMediaSeeking(3)
}
stick ky ;スペースキーでキャプチャサイズを変える
if ky & 16{bai++ : bai = bai\8 : size = 64 + bai * 16}
gsel 11
dsp_CaptureVideoEx hdc, 0, 0, size, size * dsp_info(1) / dsp_info(0), SRCCOPY
redraw
mref vram, 66
gsel 0
color 255, 255, 255 : boxf
color 0, 0, 0 : pos 0, 0 : mes"メインウィンドウ"
pos 0, 16 : mes"キャプチャサイズX:" + size
pos 0, 32 : mes"キャプチャサイズY:" + size * dsp_info(1) / dsp_info(0)
pos 0, 48 : mes"vram読み取りテスト:" + peek(vram, 195500)
await 0 ; ↑0〜196607までの任意の整数値
goto *main
*exit
dsp_Stop
dsp_Close
dsp_Exit
end
撃 2013/6/2(Sun) 16:22:04|NO.54496
またしても完璧です、お世話になりました。
dsp_SetMediaSeekingを使ってフレーム更新を間引く方法は自分も
考えたのですが引数の2番目がよくわからなかったので、
mdet使って1フレームあたりのmsを計算して?みたいなのを考えてたところでした。
あと1つ追加質問で申し訳ございません。
作っているプログラムはhgimg3のフルスクリーンモードで実行できるものです。
hspdspを使用していなかったバージョンでは普通にフルスクリーン実行できていたものが、
現在はいったんHSPがタスクバーに降りてしまって、そこをクリックするとフルスクリーン
モードにできるという現象が発生しています。
自分はちょっとウィンドウハンドルとかデバイスコンテキストなどが
理解できていないのですが、その関係なのでしょうか?
漠然としていてすみませんが、もし思いあたる原因などございましたらお願いいたします。
撃 2013/6/2(Sun) 18:12:33|NO.54504
うーん…
動画の種類によってはうまくフレーム数が取得できない場合もありますね。