HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0708
GrapeColor画面キャプチャー8解決


GrapeColor

リンク

2011/7/8(Fri) 12:02:37|NO.39951

HSPで画面を動画としてキャプチャーするソフトを作ろうと思ってるんですが、
なぜか保存された動画を見てみると異常なスピードで再生されます。
(ちなみにできた動画は1000フレーム/秒、データ速度は4294967kbpsになってます)
原因が分かる方教えてください.

#include "hspcv.as" #uselib "gdi32.dll" #cfunc CreateDC "CreateDCA" sptr,sptr,sptr,int #func DeleteDC "DeleteDC" int #func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int #define NULL 0 #define SRCCOPY 0x00CC0020 #define CAPTUREBLT 0x40000000 color 255,0,0 boxf ;CVバッファを初期化 cvbuffer 0, ginfo_dispx, ginfo_dispy ;aviファイル出力の開始 cvmakeavi "test.avi", -1, 15, 0 repeat 100 ; デスクトップ画面のサイズでバッファ画面を作成 sx = ginfo_dispx : sy = ginfo_dispy buffer 2, sx, sy ; デスクトップ画面のデバイスコンテキスト取得 hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL) ; デスクトップ画面の画像をコピー BitBlt hdc, 0, 0, sx, sy, hdcScreen, 0, 0, SRCCOPY | CAPTUREBLT ; デバイスコンテキスト削除 DeleteDC hdcScreen ;CVバッファに書き込み gsel 2 cvputimg 0 ;aviファイルに画像を出力 cvputavi wait 30 loop cvendavi gsel 0 color 0,0,255 boxf stop



この記事に返信する


hexa.hemi

リンク

2011/7/8(Fri) 18:17:45|NO.39953

cvputaviという命令は、処理に少し時間がかかります。
(ちなみに僕は録画用とavi作成用の2つのブロックに分けてやっています。)

あと、repeatの中にbuffer、CreateDC、DeleteDCが入っていることも
処理が遅くなる原因になりえます。



GrapeColor

リンク

2011/7/8(Fri) 19:23:01|NO.39954

>>hexa.hemi
それで、なんでビットレートが異常に多くなってしまうのでしょうか?



ken

リンク

2011/7/8(Fri) 22:36:51|NO.39959

fpsの問題だと思います。
通常動画は60fps又は遅くとも30fpsです。処理が遅くてAVIにするとき1秒間のフレーム数が少ないと
再生すると早くなります。cvmakeaviでfpsが指定できますが処理ループはこれより早くする必要があります。
ここら辺がHSPの限界を感じるところです。



GrapeColor

リンク

2011/7/8(Fri) 23:47:52|NO.39960

>>ken
いえ、fpsを小さくすると遅くなり、大きくすると速くなります。
僕の場合。
ただ小さくすると遅くなるとともにコマ落ちがはげしくなります。



てきとう

リンク

2011/7/9(Sat) 16:15:13|NO.39961

早い話
1秒以内に設定したFPSの枚数録画できてないだけ
FPS数録画に2秒かかったら再生は倍速になる
少ない方が1秒で終わりやすいから通常の再生速度に近づく
時計でも表示して録画すれば分かりやすい

後、waitはBitBltやcvputimgにどんなにに時間とられても
指定の時間を待つから指定の枚数取れなくてあたりまえ


実際の録画時間と設定時間を表示するようにしたもの

#include "hspcv.as" #uselib "gdi32.dll" #cfunc CreateDC "CreateDCA" sptr,sptr,sptr,int #func DeleteDC "DeleteDC" int #func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int #define NULL 0 #define SRCCOPY 0x00CC0020 #define CAPTUREBLT 0x40000000 screen 0,640,32 color 255,0,0 boxf color 0,255,0 fps=15 mtim=6 ;録画時間設定(秒) fc=((640.0/mtim)/fps) fs=0.0 ;CVバッファを初期化 cvbuffer 0, ginfo_dispx, ginfo_dispy ;aviファイル出力の開始 cvmakeavi "test.avi", -1, fps, 0 ; デスクトップ画面のサイズでバッファ画面を作成 sx = ginfo_dispx : sy = ginfo_dispy buffer 2, sx, sy ; デスクトップ画面のデバイスコンテキスト取得 hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL) tima=gettime(7) onexit goto *label repeat mtim*fps gsel 2 ; デスクトップ画面の画像をコピー BitBlt hdc, 0, 0, sx, sy, hdcScreen, 0, 0, SRCCOPY | CAPTUREBLT ;CVバッファに書き込み cvputimg 0 ;aviファイルに画像を出力 cvputavi gsel 0 boxf fs,0,fs+fc,32 fs+fc timb=gettime(7) timc+=timb+1000*(timb<tima)-tima tima=timb await (1000/fps) loop *label onexit 0 gsel 0,2 title "[録画終了] 全フレーム数("+int(fs/fc)+")" color mes " 録画時間 実際の時間("+(timc/1000)/60+":"+((timc/1000)\60)+"."+timc\1000+") 設定時間("+mtim/60+":"+mtim\60+") 再生速度予測("+0.001*timc/mtim+"倍速)" ; デバイスコンテキスト削除 DeleteDC hdcScreen cvendavi stop


ビットレートが高いのはCodec録画品質と解像度の問題
後、未圧縮の再生速度はプレヤーによって変ったりする



HK2

リンク

2011/7/10(Sun) 23:32:26|NO.39975

私がこれから述べるのはプロパティでの表示のことです。


てきとうさんのソースを実行させていただきました。
プレイヤーで再生すると15fpsで再生されますが、
プロパティの表示上のfpsは高いです。

GrapeColorさんの話によると、
設定が15fpsで表示されるビットレートが4294967kbpsなので、
1フレームあたり約34MByteを消費することになります。
2900*2900 32bitという大きなビットマップのサイズです。
画面の大きさがここまであるとはまあ思えないので、プロパティの値はあてにならないと思います。

もしかするとHSPCVのバグかもしれません。


なお、この文はあくまでもプロパティでの表示のことです。



GrapeColor

リンク

2011/7/12(Tue) 10:28:51|NO.39978

HSPでは限界があるみたいですね^^;
諦めてC言語あたり勉強します



HK2

リンク

2011/7/13(Wed) 19:36:13|NO.39992




ONION software Copyright 1997-2023(c) All rights reserved.