もくじ
→https://qiita.com/tera1707/items/4fda73d86eded283ec4f
やりたいこと
仕事で、PCについているカメラから画像を取ってきて表示する部分に「DirectShow」というものを使っているものが出てきた。どういうものかよくわかってないので、調べたい。
もともとC++のライブラリっぽいが、C#でラップしたライブラリ(DirectShowLib)があるようなので、それを使ってとりあえず動かして感覚をつかみたい。
30秒で調べたところによると、動画や静止画を扱うWindowsのライブラリはどんどん移り変わっていっているようで、
- Video for Windows
- Media Control Interface(MCI)
- DirectShow
- MediaFoundation
- など...
という感じでいろいろある様子。(間違えてるかも)
DirectShowについては調べてると2010年より前の情報しか出てこない感じなので、調べづらいし、今勉強する意味あるかな?と思ってしまうが、とりあえず仕事で困らない程度に慣れておくことにする。
DirectShowLibのサンプルを動かして、画面の写真を撮るまでの流れ in 2020年3月
〇サンプルをダウンロード
下記のページの 2010-February
フォルダの中のDirectShowSamples-2010-February.zip
をダウンロードする。
https://sourceforge.net/projects/directshownet/files/DirectShowSamples/
〇ソリューションを開く
解凍してできたフォルダの中のいろいろあるサンプルから、Samples\Capture\DxSnap
を開く
→VSのソリューションDxSnap-2005.sln
を開く。
※slnファイルの形式が古いのでバージョンUPしますか?とVisualStudioに聞かれるので、バージョンUPする。
〇NugetでDirectShowLibをとる
DxSnap-2008プロジェクトのNugetで「DirectShowLib」のv1.0.0を追加する。
※サンプルには、元から「DirectSHowLib-2005」というライブラリが参照に入っているが、これが2020年時点ではNugetで手に入らないようなので、代わりにv1.0.0を追加する。
〇ターゲットフレームワークの設定
サンプルDxSnap-2005.sln
のターゲットフレームワークが.Net Framework 4
になっているが、これを.Net Framework 4.5
にする。
※NugetしたDirectShowLib v1.0.0が4.5でないと動かないため、そうする。
〇実行
おわり
メモ
同じサンプルの中に、DxPlay-2005
というソリューションがあり、そこで、カメラから画像をintで受けて、それをSystem.Drawing.Bitmapに直している部分があった。
→サンプルグラバーというやつの
GetCurrentBuffer()で、画像のデータがとれてるっぽい。その辺をみれば、参考になりそう。
参考(DirectShowを調べようと思って通り過ぎたもの)
〇DirectShowサンプル(C++)
https://github.com/Microsoft/Windows-classic-samples/tree/master/Samples/Win7Samples/multimedia/directshow
〇良さげ?なページ(C++)
https://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/directshow.html
〇画像を取って、保存するまで(ビルドしようとしたら、Win SDKの古いのがいるとかでビルドできなかった)(C++)
https://www.geekpage.jp/programming/directshow/samplegrabber.php
→最終的に、C++あきらめてC#のライブラリに行った。
〇C#のDirectShowラッパーのページ
top
http://directshownet.sourceforge.net/