Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2017/02/01 (水)

動画を保存したい!

| 16:18 | 動画を保存したい! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 動画を保存したい! - 雪乃☆雫のなでしこ日和 動画を保存したい! - 雪乃☆雫のなでしこ日和 のブックマークコメント

 さて、引き続きカメラです。

 折角、画面は動いているわけなんだから、静止画だけじゃなく、のまま動画で保存してみたいと思うのが人情ですよね~(?)

 調べてみると、「WM_CAP_SEQUENCE」が、ストリーミングビデオおよびオーディオキャプチャをファイルに開始…するラシイ。

 「WM_CAP_SEQUENCE」は「$400+62」とゆうことで、とりあえず、

メッセージ送信(CWハンドル,$400+62,0,0)

 のようにしてみたんだけど・・・

 一応、これだけで、出来たことは出来たんだけどね。

 デフォルトのファイル名は、「CAPTURE.AVI」のようなことが書いてあったんだけども、1が返ってきているのに、見当たらない

 一体、どこにあんのかと思ったら、検索しないとたどり着けないよーな深いところに「CAPTURE.AVI」が作られてました;

 これはよろしくないので、変更しなくては・・・

 っと、また具合わるくなりながら、ぐーぐる検索様のお力を借りて調べると、「WM_CAP_FILE_SET_CAPTURE_FILE」が、キャプチャーファイル名を設定するヤツらしい。

 これは、「$400+20」とゆうことで、

メッセージ送信(CWハンドル,$400+20,0,"{デスクトップ}CAPTURE.AVI")

 で行けるだろうと思ったら、行かなかった。

 これは、どうやら、最初に「WM_CAP_FILE_SAVEDIBA」が出来なかったのと同じ現象だね。

 ーとーうだうだ考えて、はまりまくった末にひらめいたのは、文字列が通ってないんじゃ? ってこと。

 本家のコードをようく眺めてみたら、「SendMessage」の引数は、wParamがShort、lParamがStringになってるんだね。

 なるほど。

 こうして置いて、数字的なヤツは最初のパラメーター、文字列は2番目のパラメーターで送ってるラシイ。

 とゆうわけで、メッセージ送信のパラメーターの引数の型を変えてみた。

●メッセージ送信(hWnd,Msg,wParam,lParam) =DLL("user32.dll",
"LRESULT SendMessageA(
HWND hWnd,      // 送信先ウィンドウのハンドル
UINT Msg,       // メッセージ
SHORT wParam,  // メッセージの最初のパラメータ
LPCSTR lParam   // メッセージの 2 番目のパラメータ
)")

 動いた!

 いや~、なんか、賢くなったんじゃないですか?

 でっ、いちおうこんな感じで、録画もできるようになりました♪

 ちなみに、[Esc]キーか、マウスボタンを押すことで保存終了です。

 終了ない限り、ディスクが一杯になるまで保存し続けますのでご注意ですw

キャプチャファイル設定とは整数=$400+20  # WM_CAP_FILE_SET_CAPTURE_FILE
シーケンスとは整数=$400+62     # WM_CAP_SEQUENCE

*動画保存
  ファイル名は「{今日} {}」を「yyyymmdd_hhnnss」に日時形式変換。
  ファイル名は「{デスクトップ}{ファイル名}.avi」
  メッセージ送信(CWハンドル,キャプチャファイル設定,0,ファイル名)
  メッセージ送信(CWハンドル,シーケンス,0,0)

 ああぁ・・・メッセージ送信が増えてくると・・・(+_+)

 それぞれ関数にした方が見やすかったかな。

めだかめだか2017/02/01 21:01お久しぶりで御座います。
雪乃さんはすっかりAPIマスターですねw
そんな雪乃さんに質問なのですが、

>「WM_CAP_SEQUENCE」は「$400+62」とゆうことで、

これが、わからないんですが...(>_<)
初歩的な質問で申し訳ないですが、ご教授お願いします...!

雪乃☆雫雪乃☆雫2017/02/02 00:08 えっと・・・そんなにマスターはしてないんだけど、参考にしたのはここです。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd757696(v=vs.85).aspx
https://www.ecoop.net/coop/api/winmes.html

 最初のトコは、全部英語ですからご注意です。ワタシなんぞは、開いた瞬間めまいがして、次に具合わるくなりますwww
 しか~し、ガマンして、ぐーぐる翻訳さまに読んで頂くと、「WM_CAP_SEQUENCEメッセージは、ストリーミングビデオおよびオーディオキャプチャをファイルに開始…」するヤツだと言うことが分かります。
 コレを、SendMessageで送ってやれば、その機能が使えるよってコトです。
 でも、「WM_CAP_SEQUENCE」とゆう文字列を送るわけではなくって、定数として割り当てられてる数値があるので、今度はそれを探さなきゃならないんですよ~(´д`)(前のコードの場合は、参考にしたコードの中に宣言してあった数値を拾っただけなので、カンタンだったんですが)

 さてそこで、2番目のトコです。
 あんまよく分かんないケド、VFW的なメッセージの定義値が一覧表になっています。
 「WM_CAP_SEQUENCE」は「WM_CAP_START+62」となっています。
 この表には書いてないけど、参考にしたコードによると、なんか知らんけど、「WM_USER=WM_CAP_START=$400」とゆうことになるらしいんだよね。
 だから、「WM_CAP_SEQUENCE」は「$400+62」なのです。
(1086と書くことも出来るけど、$400+62のほうが見やすいでしょ? なんとなく)

めだかめだか2017/02/03 01:31返信有難う御座いますー

なるほどー...
WM_CAP_STARTは$400なんですねー...
確かに、1086よりもこっちの方がみやすいですねw

もち合わせでの知識だけでは、理解することが出来ない様な領域ですね...
時間さえあれば、ゆっくりと調べてながらも自力で理解も出来るのですが...


何はともあれ、有難うございます!

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170201