日本語プログラミング言語なでしこの公式掲示板

なでしこ1 質問

トップ 新規 検索

2020-11-28 05:01:51

Re④:WEBカメラの立ち上げ

雪乃☆雫 さん

タブンできたので貼る。
前に書いたよーな理由で、お試しはしてませんが;

#-----------------------------------------------------------------------
# なでしこでwebカメラを起動して表示
#-----------------------------------------------------------------------
!母艦設計=「母艦の可視はオフ」

#-----宣言--------------------------------------------------
CWハンドルとは整数=-1  #キャプチャーウィンドウのハンドル。

!WS_VISIBLEとは整数=$10000000    # 初期状態(枠なし)で表示。
!WS_CHILDとは整数=$40000000      # 子ウィンドウ。
CWスタイルとは整数=WS_VISIBLE||WS_CHILD  #キャプチャーウィンドウのスタイル

カメラ接続状態とは整数=オフ。
フレームレートとは整数=60      #ミリ秒単位
#-----------------------------------------------------------

#-----母艦設計----------------------------------------------
#---母艦-----
母艦について
  位置は「0,0」
  スタイルは「枠固定」
  オフに最大化ボタン有効変更。
  オフに最小化ボタン有効変更。
  タイトルは「webカメラ」
  閉じた時は~終了処理。

母艦を黒色で画面クリア。
#-----------------------------------------------------------

#-----メイン------------------------------------------------
カメラ起動。
ウィンドウサイズ設定。
母艦の可視はオン。
#-----------------------------------------------------------
*カメラ起動
  キャプチャーウィンドウ作成("",CWスタイル,0,0,640,480,母艦のハンドル,0)
  CWハンドルはそれ。1秒待つ。
  5回
    CWハンドルに0のカメラ接続。
    1秒待つ。
    もし、それがはいならば、カメラ接続状態はオン。抜ける。
  もし、カメラ接続状態がオフならば、
    CWハンドルをウィンドウ破棄。
    「カメラに接続出来ませんでした」と言う。
    終わる。
  CWハンドルをフレームレートにプレビューレート設定。
  CWハンドルをオンにプレビューモード設定。

*ウィンドウサイズ設定
  CWハンドルのステータス取得。
  母艦のクライアント幅はCWの幅
  母艦のクライアント高さはCWの高さ
*終了処理
  CWハンドルからカメラ切断。
  CWハンドルをウィンドウ破棄。
  終わる。
#-----------------------------------------------------------

#-----キャプチャー用関数------------------------------------
#https://msdn.microsoft.com/en-us/library/windows/desktop/dd757696(v=vs.85).aspx
#---VFW定数-----
!WM_CAP_DRIVER_CONNECTとは整数=$400+10           # キャプチャウィンドウをキャプチャドライバに接続します。
!WM_CAP_DRIVER_DISCONNECTとは整数=$400+11        # キャプチャウィンドウからキャプチャドライバを切断します。
!WM_CAP_SET_PREVIEWとは整数=$400+50              # プレビューモード(オン/オフ)
!WM_CAP_SET_PREVIEWRATEとは整数=$400+52          # プレビューモードのフレーム表示レート(ミリ秒)

!WM_CAP_GET_STATUS=$400+54                        # キャプチャウィンドウのステータスを取得します。
#-----------------------------------------------------------
●カメラ接続(ハンドルに{数値=0}Noの)
  メッセージ送信(ハンドル,WM_CAP_DRIVER_CONNECT,No,0)  # カメラが1台ならNoは0でOK

●カメラ切断(ハンドルから)
  メッセージ送信(ハンドル,WM_CAP_DRIVER_DISCONNECT,0,0)

●プレビューレート設定(ハンドルをmsに)
  メッセージ送信(ハンドル,WM_CAP_SET_PREVIEWRATE,ms,0)  # ms=ミリ秒単位

●プレビューモード設定(ハンドルをfに)
  メッセージ送信(ハンドル,WM_CAP_SET_PREVIEW,f,0)     # f=オン/オフ
#-----------------------------------------------------------
●ステータス取得(ハンドルの)
  PACK(CW,S,"UINT,UINT,BOOL,BOOL,BOOL,long,BOOL,BOOL,BOOL,DWORD,DWORD,DWORD,DWORD,HPALETTE,BOOL,DWORD,UINT,UINT")
  メッセージ送信(ハンドル,WM_CAP_GET_STATUS,76,POINTER(S))    # Size=バイト単位。S=CAPSTATUS構造体へのポインタ。
  UNPACK(S,CW,"UINT,UINT,BOOL,BOOL,BOOL,long,BOOL,BOOL,BOOL,DWORD,DWORD,DWORD,DWORD,HPALETTE,BOOL,DWORD,UINT,UINT")

■CW
 ・幅
 ・高さ
 ・fLiveWindow
 ・fOverlayWindow
 ・fScale
 ・ptScroll
 ・fUsingDefaultPalette
 ・fAudioHardware
 ・fCapFileExists
 ・dwCurrentVideoFrame
 ・dwCurrentVideoFramesDropped
 ・dwCurrentWaveSamples
 ・dwCurrentTimeElapsedMS
 ・hPalCurrent
 ・fCapturingNow
 ・dwReturn
 ・wNumVideoAllocated
 ・wNumAudioAllocated
#-----------------------------------------------------------

#-----API---------------------------------------------------
#https://msdn.microsoft.com/ja-jp/library/cc428606.aspx
●キャプチャーウィンドウ作成(lpszWindowName,dwStyle,x,y,nWidth,nHeight,hWnd,nID) =DLL("avicap32.dll",
"HWND capCreateCaptureWindowA(
LPCSTR lpszWindowName,  // ウィンドウ名
DWORD dwStyle,          // ウィンドウスタイル
int x,                  // X
int y,                  // Y
int nWidth,             // W
int nHeight,            // H
HWND hWnd,              // 親ウィンドウのハンドル
int nID                 // ウィンドウ識別子…ってなんすか;
)")
#-----------------------------------------------------------
#https://msdn.microsoft.com/ja-jp/library/cc411022.aspx
●メッセージ送信(hWnd,Msg,wParam,lParam) =DLL("user32.dll",
"LRESULT SendMessageA(
HWND hWnd,      // 送信先ウィンドウのハンドル
UINT Msg,       // メッセージ
SHORT wParam,   // メッセージの最初のパラメータ
LPCSTR lParam   // メッセージの 2 番目のパラメータ
)")
#-----------------------------------------------------------
#https://msdn.microsoft.com/ja-jp/library/cc410763.aspx
●ウィンドウ破棄(ハンドルを) =DLL("user32.dll",
"BOOL DestroyWindow(
HWND hWnd   // 破棄するウィンドウのハンドル
)")
#-----------------------------------------------------------

 おっしゃるとうりの、最低限の機能にしました。
 前に貼ったリンク先との違いは、ちゃんとカメラのキャプチャーウィンドウのステータスをゲットして、母艦のサイズを設定している点です。
 カメラや設定によって解像度が変わるから、決め打ちじゃダメだったんです。

(編集パスワード送信)

子記事

親記事 (No.592)
返信した記事(元) (No.595)

この内容(No.598)に返信

この内容(No.598)をダウンロード

この内容(No.598)のテキスト表示





www.eznavi.net