トップページ⇒tech
990コメント427KB

DirectShowと戦うスレ Part 2

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/08(水) 00:25:56
前スレ
http://pc8.2ch.net/test/read.cgi/tech/1026666092/
01521492007/01/19(金) 03:05:59
レスありがとうございます。
サンプルも151もまるで理解できないのでとりあえずDirectShowを1から勉強してます。
0153デフォルトの名無しさん2007/01/19(金) 04:54:19
最終的にどういう条件で何がしたいのかを書いたほうがいいかもよ。
他の選択肢があるかもしれんし。。。
0154デフォルトの名無しさん2007/01/19(金) 23:55:04
MPEG3Layer-3デコーダ
これが標準にインストールされてるデコーダだよ。
このデコーダ通ったストリームがWAVEファイルみたいな生な音声ファイルになってるからそこに変換フィルタを自作してやればいいよ。

意外と簡単にいけるかもしれん…
0155デフォルトの名無しさん2007/01/24(水) 10:52:40
ttp://mobiquitous.com/programming/usbcamera.html
この↑ページをみながらDirectShowLibを使ってC#で
USBのマイク&カメラ(LogicoolのQcam10.0)からの入力をCaptureGraphBuilderを使って
MuxAVI経由でAVIファイルとして保存しているのですが、
フィルタグラフマネジャIGraphBuilderのRun(),Stop()およびIFileSinkFIlterのSetFileName()を使って、
Run 5秒間保存 Stop 保存先変更 Run 5秒間保存 Stop 保存先変更・・・
と繰り返すと、できあがったファイルは
1つ目、所望のものが得られた
2つ目、映像が〜5秒フリーズして5秒後から再生される。音声は再生直後から5秒までにちゃんと入っている
3つ目、映像が〜10秒フリーズして再生される。音声は同上
のようになっていて、どうもVideoのほうの時間がおかしいのですが、
そこをうまく扱えるような方法があったら教えてください。

0156デフォルトの名無しさん2007/01/24(水) 12:34:32
それQCAMのバグだと思ってる。
厳密に言うとMediatimeの初期化をしてくれてないからそうなる。

カメラの後に「Smart Tee」繋いで、さらにフレビューピンに繋いだら?
01571552007/01/24(水) 17:57:20
ありがとうございます!
とりあえずそれでやってみます!
01581552007/01/24(水) 20:43:33
GraphEditでも再現できる現象だと(いまさらながら)わかったのですが、
>>156さんの
>>カメラの後に「Smart Tee」繋いで、さらにフレビューピンに繋いだら?
のおっしゃるように
VideoSource->SmartTee->PreviewPin->AviMux->FileWriter
とつないだら、Runできずに

The graph could not change the state.
タイムスタンプがこのサンプルに設定されていません。(Return code:0x80040249)

と出て行き詰まっています。
知識不足でお聞きしたいのですが、
タイムスタンプがないのはバグなのでしょうか、
それとも当然の動きで設定になにか必要なのでしょうか・・?

もともと連続でファイルを区切って数秒間の音声付き映像をキャプチャできれば違う方法でもよく、
いちいちGraphBuilderを解放してまた作るとうまくいくことはいくんですが、
それでは解放と作成に時間がかかるのでもっと早くできる方法を探していて
上記155みたいな試行錯誤してます。
0159デフォルトの名無しさん2007/01/24(水) 20:47:14
>>158
previewピンからの出力にはタイムスタンプがつかないのがDirectShowのお約束です。

>いちいちGraphBuilderを解放してまた作るとうまくいくことはいくんですが、
QCAMのフィルタだけDisconnectして取り除いて作り直して挿入して接続するとか。
0160デフォルトの名無しさん2007/01/24(水) 20:58:38
そうそう。そのタイムスタンプを付けないのがプレビユーピンなんだ。

で、なんでそうしろといったかと言うと
キャプチャピンとプレビューピン両方にレンダラ繋いで再生→停止を繰り替えすとわかる。
キャプチャピンに繋いだ方は画像が流れて来なくなる以前に5秒再生してたら5秒間固まる。
これはQCAMがタイムスタンプを初期化してないからだと思う。

多分自分でスタンプ情報作ってやればよかったと思うけどソースが会社なんだ…
コンブライアンスが厳しい
01611552007/01/24(水) 22:07:33
>>159,>>160
ご返答ありがとうございます。
なるほど。
タイムスタンプが設定されていません。はPreviewPinより下流のFilterが発していたことがわかっていませんでした。(恐らくFileWriter?)
>キャプチャピンに繋いだ方は画像が流れて来なくなる以前に5秒再生してたら5秒間固まる。
まさにそのとおりです。
>多分自分でスタンプ情報作ってやればよかったと思うけどソースが会社なんだ…
>コンブライアンスが厳しい
っということは諦めるかタイムスタンプを自分で打つfilterを作るかでしょうか・・キビシイですね
とりあえず>>159さんの
>QCAMのフィルタだけDisconnectして取り除いて作り直して挿入して接続するとか。
をやってみます。
0162デフォルトの名無しさん2007/01/24(水) 23:03:55
外で携帯打つと手がかじかんでまともに文入力できてないな俺w
フレビューピン、コンブライアンスワラタ
01631552007/01/25(木) 08:21:37
現在、問題がどういうわけか再現しなくなって直ってしまったので嬉しいような複雑な気分です。
たぶん(としかいえないのがつらいのですが)Qcam10.5をインストールした後に直ったと思われるので、
Qcam側の原因が自動的に解決されたのだろうと解釈しています・・
いろいろと本当にありがとうございました。
01641552007/01/25(木) 08:23:22
>>162
携帯だったのですね
感謝してます
01651622007/01/25(木) 18:45:16
最新のカメラドライバを入れる事でこの問題が解決されるのですね。
どうもありがとう。自分も試してみますm(__)m
0166デフォルトの名無しさん2007/01/26(金) 20:48:07
DirectSHOWと直接は関係ない質問かと思いますが、教えてください。

変換フィルタにてRGB24ビットのIMediasampleを扱っているのですが、
カメラから入ってきた画像に線を書いてレンダラに渡したいと思ってます。

DIB形式のBMP画像に直接線を描く関数を探しております。
なにが難しいと思っているかというと、デバイスコンテキストが得られない事で、「LineTo」などを代表するWinAPIが使えない事です。

みなさんはどのように画像の加工をしているのでしょうか?
やっぱりオーバーレイとかですか?
0167デフォルトの名無しさん2007/01/27(土) 00:44:03
生のRGBデータ配列を渡してHBITMAPを返すようなWin32APIがあったはず。
それをメモリデバイスコンテキストでセレクトしてやればGDIで描画できるんじゃないかな。


0168デフォルトの名無しさん2007/01/27(土) 01:10:27
>>167
ありがとうございます。
http://www.greenwood.co.jp/~k-aki/pc/directshow_movie/directshow_movie.html#h-7
↑このページのレンダラ処理に>>167さんのおっしゃるようなことが書いてあったため
試して見ます
ちなみにこんなソース
// ビデオ ヘッダーへのポインタを獲得する。
const VIDEOINFOHEADER *pVideoHeader
= (const VIDEOINFOHEADER *)pMediaType->pbFormat;

// ビデオ ヘッダーには、ビットマップ情報が含まれる。
// ビットマップ情報を BITMAPINFO 構造体にコピーする。
ZeroMemory(&m_bitmapInfo, sizeof(m_bitmapInfo));
CopyMemory(&m_bitmapInfo.bmiHeader
, &(pVideoHeader->bmiHeader)
, sizeof(BITMAPINFOHEADER));

// ビットマップ ヘッダーから DIB を作成し、バッファへのポインタを獲得する。
HBITMAP hBitmap
= CreateDIBSection(0, &m_bitmapInfo, DIB_RGB_COLORS, &m_buffer, NULL, 0);
if(hBitmap){
m_hdc = CreateCompatibleDC(NULL);
SelectObject(m_hdc, hBitmap);
0169デフォルトの名無しさん2007/02/05(月) 11:52:49
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/directx9_c/directx/htm/creatinganaudiocapturegraph.asp
ここを参考に、DirectShowLib + C#で、
waveレンダラを
マイク--> tee --> スピーカ(default audio renderer)
--> wavDest(wavFilter) --> file writer(sinkFilter)
なる構成で作ろうとしています。(GraphEditではできました。)
上記URLによるとcaptureGraphBuilderが使えないので、FindPinとフィルタグラフマネジャのconnectを使って
つなげていこうとしています。
しかし、実行時に、各Filterを作ってAddFilterをした後に、つなげる段階でエラーが出てしまいます。
エラーの出る場所
//wavDest(wavFilter) --> file Writer(sinkFilter)
wavFilter.FindPin("Out", out outPin);
sinkFilter.FindPin("in", out inPin);
graphBuilder.Connect(outPin, inPin);//ここでエラー0x80040217

他のフィルターの結合はすべてGraphEditによるデバッグ(?)で確認しましたが、
最後のファイル書き込み部分がつながりません。
なにかヒントをいただけたらよいのですがどうでしょうか・・

01701692007/02/05(月) 11:53:51
ちなみに
wavFilterは
Guid id = new Guid("3C78B8E2-6C4D-11D1-ADE2-0000F8754B99");
Type comType = Type.GetTypeFromCLSID(id);
object comObject = Activator.CreateInstance(comType);
wavFilter = (IBaseFilter) comObject;

sinkFIlterは
sinkFilter = (IBaseFilter)new FileWriter();
sinkSetFilter = (IFileSinkFilter) sinkFilter;
AMMediaType mediaInfo = new AMMediaType();
mediaInfo.majorType = MediaType.Audio;
mediaInfo.subType = MediaSubType.PCM;
sinkSetFilter.SetFileName(sinkFileName, mediaInfo);
こんな感じでやっております。
01711692007/02/05(月) 21:45:12
自己レスです。
sinkSetFilter.SetFileName(sinkFileName, null);
にしたらできました。
なんでやろ
0172デフォルトの名無しさん2007/02/06(火) 19:24:44
DirectShowのフィルタプロジェクトを作成できるアドインか何か、
むかしここかどこかに貼ってあった気がするんだけど、
誰か知りませんか?
0173デフォルトの名無しさん2007/02/07(水) 12:21:04
>>172
「拡張ストアド プロシージャーDLL」
これで作っちゃだめなの?
自分はいつもこれで作って、
〇「proc.c」を削除
〇「stdafx.c」にStreamヘッダを追加
〇追加インクルード
〇モジュール定義
〇ライブラリ追加
をしていた。これがめんどいです?
0174デフォルトの名無しさん2007/02/07(水) 13:28:32
>>69
 有り難うございます。
 あちらで聞いた方が良かったですか。でも、今から同種の質問を飛ばすとマルチですし。
やはり、October 2004かsummer 2003ですか。試してみます。

私もVC6やめたいところですが、色々としがらみと要望がありまして。
未だにVC6の需要があるので困ります。
01751742007/02/07(水) 13:30:27
すみません、DirectX初心者質問スレ宛を誤爆しました。
0176デフォルトの名無しさん2007/02/07(水) 15:53:05
>>173
ありがとうございます。めんどいとかじゃなくて
そのやり方を知りませんでした。
参考になりました。
0177デフォルトの名無しさん2007/02/07(水) 16:14:12
と思ったけど、2005には拡張ストアド〜がありませんでした。
Sampleを改造することにします。
0178デフォルトの名無しさん2007/02/07(水) 16:17:44
さがしてみたらここにありましたがVC6用でした。
http://hammer.prohosting.com/~arabo/DirectMediaWz.shtml
0179デフォルトの名無しさん2007/02/07(水) 19:02:10
え〜2005無料版でもほとんど一緒なのあるよ
ぶっちゃけDLL作るプロジェクトならなんでも可

まぁ結局新規プロジェクトでフィルタ作れるようになってもサンプル改造に落ち着くんだけど
0180デフォルトの名無しさん2007/02/08(木) 08:58:22
DirectShow使う開発で一番多く使われているプログラム言語ってVC2003かな?
VC6…DirectXサポート切れていて最新の盛り込みできない
VC2005無料版…リソースエディタがないため扱いづらい
VC2005…普及してる?
C#…これ自体存在が微妙
VB…本格的にやるには不向き
他…資料がなさすぎね??
0181デフォルトの名無しさん2007/02/08(木) 11:44:35
>>180
VC2005無料版はいろいろ難関がありそうだよね。
ただVC2003のプロジェクト(非DirectShow)をコンバートしただけなのに
PlatformSDKのセッティングとか初めてだと面食らう。

なぜかウチの環境だとPlatformSDKのツリーがVc7の下にあって・・・。

近いうちにVC2005導入予定だけど、普及の問題は別として開発しやすいのかな?
0182デフォルトの名無しさん2007/02/09(金) 00:09:39
プログラムからビデオキャプチャを行わせることに挑戦しています。
プレビューで使われる画像サイズやフレームレートをプログラムから
指定する方法は無いでしょうか。

IVideoWindow等でウィンドウを小さくする等だと転送するデータは変わらないので
負荷が下がらないと思うので駄目だと思います。それとも変わるのでしょうか。

IPropertySetStorageで色々設定できるダイアログが表示されるが
これって使う人の立場で考えると
製品によってダイアログが違うので説明が大変だし
変にいじって品質を落としたりする可能性があって嫌なんだが
これしかないのでしょうか。
0183デフォルトの名無しさん2007/02/09(金) 01:31:30
>>182
自分でカメラの出力pinに対して要求だせばいいよ
MSDNのヘルプみるよろし
0184デフォルトの名無しさん2007/02/09(金) 02:20:04
>>183
プレビューが
[キャプチャ]->[レンダラ]
という接続なので要求の出し方わかりません
01851832007/02/09(金) 08:20:34
×カメラ
〇キャプチャー

でした。誤解させてしまったかもしれませんすみません。
で、キャプチャのピンのプロパティーページにて解像度やフレームレートをかえられるのであれば

そのピンに対して「EnumMediaType」、メディアタイプの列挙型を受けとればよいです。
列挙型のなかにピン接続したいタイプがあれば接続させます。

私はフィルタ内制作ばかりやっているのでフィルタグラフ用の具体的な関数名までわかりませんが、「Free Mail」と言うSNSサイトにくれば過去ログに貴方と同じ質問の回答があります
0186デフォルトの名無しさん2007/02/09(金) 13:29:55
>>182
IAMStreamConfig
0187デフォルトの名無しさん2007/02/09(金) 14:00:20
私は流れ設定です
0188デフォルトの名無しさん2007/02/09(金) 19:51:15
流れ設定ってなんですか?
0189デフォルトの名無しさん2007/02/10(土) 01:59:59
IAMNewAboutDirectShow
0190デフォルトの名無しさん2007/02/11(日) 02:17:48
YUVで映像が流れてるとき「IMediaSample」には
どんな形で入ってるんですか?
RGBTRIPLEしか構造体ワカランス(´・ω・`)
0191デフォルトの名無しさん2007/02/11(日) 23:20:45
YUVにも色々あるわけだが
0192デフォルトの名無しさん2007/02/12(月) 00:04:10
>>191
はい。IYUV、I420の2つでお願いします。
どちらもU値とV値が四分の一に圧縮されていてMediaSubTypeは違っていても中身は同じフォーマットだと思います。
0193デフォルトの名無しさん2007/02/12(月) 01:29:29
質問の意味が良くわからないが、IMediaSampleからデータにアクセスするには
IMediaSample::GetPointer(), IMediaSample::GetActualDataLength()というメンバ関数を通してバッファにアクセスできる。
ただし幅や高さなどの情報はAM_MEDIA_TYPEという構造体に収められていて、
これはIMediaSampleからは限定的な用途でしか取得できない。
その用途とはメディアタイプがダイナミックに変化したことをダウンストリームに伝えるという用途である。
そのため、IMediaSampleにはGetMediaTypeという気の利いた名前のメンバ関数があるが、
この関数を通してAM_MEDIA_TYPEが取得できるのはメディアタイプがダイナミックに変化した瞬間だけであり、
取得できるのは変化した後のメディアタイプである。
常に今流れているサンプルのAM_MEDIA_TYPEが取得することはできない。



0194デフォルトの名無しさん2007/02/12(月) 01:47:42
>>192
ネットで調べたところ、どうやらプレーンぽいなあ。

最初にYプレーン
次に縦横がそれぞれ1/2に縮小されたU
次に縦横がそれぞれ1/2に縮小されたV
となっているようです。
0195デフォルトの名無しさん2007/02/12(月) 06:07:34
MSDNのドキュメントに普通にある
0196デフォルトの名無しさん2007/02/14(水) 01:56:31
SONYが設備投資を縮小だってね。
なにやってるんだかよくわからんよ。
このままだとVAIO部門も潰されるんじゃないか?
潰されたとしてNECあたりが買い取ってくれるといいけどね。
0197デフォルトの名無しさん2007/02/14(水) 22:02:18
>>196
誤爆(^ω^)おつ

>>190なんですがMSDNと睨めっこしてたけどまだワカランス
>>193の内容は理解出来てるんだけどプレーンがわからんのだな。GetPointer()で映像の画素情報にアクセスできるんだけどプレーンってどうアクセスするの(`・ω・´)??

>>194
そう自分もググッたんでそれは大丈夫。IYUVは一画素にYに8bit、UVに2bitの計12bit使うほーまっと
0198デフォルトの名無しさん2007/02/14(水) 22:58:43
>>197
LPBYTE pY = GetPointer で得たポインタ。
LPBYTE pU = pY + width*height;
LPBYTE pV = pU + width*height/4;

Y値は pY から width*height バイト。
U値は pU から (width/2) * (height/2) バイト(縦横ともに半分の解像度ってこと)。
V値は pV から (width/2) * (height/2) バイト。
こんな感じ。UVは逆かもしれない。

パック形式のYUYVとかの場合は(4:2:2ってやつ)、UとVだけ水平解像度が半分で
UとVがYと交互に入ってる式。

>IYUVは一画素にYに8bit、UVに2bitの計12bit使うほーまっと
UVは4ピクセル辺り1バイトだから、8/4で2bitと言ってるだけ。
0199デフォルトの名無しさん2007/02/14(水) 23:42:16
>>198
ありがとう了解それがわからんかったです。
02001942007/02/15(木) 08:07:41
>>197
なんだよプレーンの意味がわかってないのかよ
0201デフォルトの名無しさん2007/02/15(木) 08:14:54
うん。ビットマップみたいにピクセル毎に並んでるかと思ってた。
0202デフォルトの名無しさん2007/02/17(土) 18:32:41
DMOというのでフィルタを既に作ったんだけどさ
これって何かいまいちだね。

データを得られればとりあえずはいいので
サンプルグラバっていうのを使ったほうが簡単だったみたい。

でも微妙な動作が違うような。
まあ、既にリリースもしたし、いまさら作り直して挙動が変わるのは困るので
このまま突き進むしかない。

DMOだとピン接続決定とか切断とかわからないみたいだね。
ピン接続できるかの問い合わせがあるけど、
これにOkで答えてもその後同じ条件でまたピン接続できるか問い合わせがある。
接続したとか接続してないとかないみたい。

データの出力が能動的じゃなくて受動的なのもなんか作りにくいな。
DirectShowって難しい。
0203デフォルトの名無しさん2007/02/17(土) 18:35:23
DMOだけどさ
カテゴリにオーディオエンコーダってのを指定しているんだけど
接続できるか問い合わせされるときビデオ関係が含まれていやがんの。

別に問題ないけどさ。
0204デフォルトの名無しさん2007/02/18(日) 00:39:21
サンプルグラバを使う道もそれなりに険しいと思うよ。

0205デフォルトの名無しさん2007/02/21(水) 00:47:18
>>186
これでサイズ指定が出来ました。

使えないフォーマットがあるし
RGB555とかYUY2とかはどれ選んでいいのか(負荷の一番低いもの)わからないので
とりあえず設定ファイルに入れて変更可能にしといた。

プレビューがデフォルトで640x480になって高負荷になり
画像サイズ変更はプレビュー(レンダラ接続)前じゃないと変更できない
という不便さから解放されました。
0206デフォルトの名無しさん2007/02/24(土) 12:06:13
USBカメラではなくて、ネットワークの映像取り込みをしたいと思ってます。
ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/DirectX9_c/directx/htm/selectingacapturedevice.asp
レベルが低くて大変恐縮なんですが、上記のページのようにすると
キャプチャのデバイスで、ネットワークカメラも選択できるようになるのでしょうか?

・USBカメラのプログラム作成すると、ネットワークカメラも
そのまま取り込み出来るのでしょうか?

・プログラミングも初級レベルなので、サンプルプログラム
などあると勉強しやすいのですが、本やサイトなどありますでしょうか。
USBカメラについてのサンプルプログラムは、いくつか見つかりました。

よろしくお願いします。
0207デフォルトの名無しさん2007/02/24(土) 13:07:39
206です。いろいろと検索しております。
ttp://homepage1.nifty.com/MADIA/vc/vc_bbs/200307_03070013.html
こちらにネットワークカメラについての制御の仕方について
少し書いてありました。

USBカメラのように一律なプログラムでなくて、
ネットワークカメラごとに、プログラムを変えないといけないのでしょうか。
なにを考えていけば、わからないのですが。
・ネットワークカメラごとのマニュアルを読んで、HTTPでネットワークカメラに
 接続、画像を取り込む
・そのあとは、USBカメラと処理が同じ
こんな感じなのでしょうか?

具体的なコードはまだわからないのですが、方針として
ネットワークカメラの制御が、HTTPだけですむなら、
USBカメラのプログラムで、画像を渡す部分だけ、
改造すれば大丈夫でしょうか。

スレ違いでしたら、誘導していただけますと助かります。
よろしくお願いします。
0208デフォルトの名無しさん2007/02/24(土) 23:27:29
特殊なカメラ(業務向けの何十万もするような奴)で遠隔地で画像を取ってネットワークにストリームしてくれるカメラならあると思う。
そういう場合、そのカメラを操作するにはそのメーカーが提供するライブラリを使うことになるだろうね。
映像を受ける側はカメラ用のフィルタグラフではなくネットワークからのストリームを受信するような感じになると思う。
0209デフォルトの名無しさん2007/02/25(日) 01:49:42
>>208
お返事ありがとうございます。

livecaptureっていうフリーのすごいソフトありますが、
どうやって複数のネットワークカメラに、対応しているのか疑問でしたが、
メーカーさんが公開しているマニュアルを見て、プログラミングしてるのかもしれないですね。
通信の仕方をメーカーさんが、公開してないとだめなんですね。ふむふむ。。
0210デフォルトの名無しさん2007/02/25(日) 14:22:29
専用のカメラを使ってるね。その手のカメラは買えば当然遠隔操作のコマンドとかマニュアルが付いてくるはず。

0211デフォルトの名無しさん2007/02/26(月) 10:33:36
>>210
>当然遠隔操作のコマンド
付いてくるけど画像ストリームの仕様は無いのよ
とりあえずメーカーに問い合わせてみる
0212デフォルトの名無しさん2007/02/26(月) 18:16:38
っ自分で解析
0213デフォルトの名無しさん2007/02/27(火) 01:19:35
キャプチャデバイスのプロパティへアクセスするにはIAMVideoProcAmpや
IAMCameraControlがありますが、これらでサポートされていないパラメータへ
アクセスする方法はありますか?

具体的には、USB Video Classのサポートで追加された、

KSPROPERTY_VIDEOPROCAMP_DIGITAL_MULTIPLIER
KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE_COMPONENT

辺りへアクセスしたいんですが。(対象デバイスがそれらのプロパティをサポート
してるのは確認しています)
axextend.idlやstrmif.hのenumにはidが定義されていないし、WHITEBALANCE_COMPONENTの
NODE_S2タイプのアクセス関数(パラメータが2個あるタイプ)もヘッダに見つかりません。

これはカスタムで書くしかないんでしょうか。
0214デフォルトの名無しさん2007/02/27(火) 13:54:19
IKsPropertyとかなんかそんな名前のインタフェイスで出来ると思う。
0215デフォルトの名無しさん2007/03/01(木) 02:00:42
キャプチャボードからの映像信号に処理を加えて、それを表示するプログラムを作りたいと思い、
DirectShowの勉強を始めました。
一通り調べた結果、以下の事を勉強する必要があると思いましたが、他にも「これ知っとけ」
みたいなことがあったら教えてください。

〜既にある知識〜
C、Win32API、grapheditの扱い

〜これから学ぶべきと思うこと〜
C++、COM、自作フィルタの作成と登録の方法
0216デフォルトの名無しさん2007/03/01(木) 07:21:37
俺も似たような事やってる…
概念理解が勉強の中心になると思う。ガンガレ〜

既に知ってるとは思うが、「BMP構造」を理解しておくとよいよ。

基本はBMP画像のぱらぱら漫画を加工する事になりますので。
02172152007/03/01(木) 14:07:11
>>216
ありがとうございます。
BMPについてはWin32APIでいじり倒してきたのでいけると思います。
DirectShowについてはその仕様と情報の少なさに辟易していますが、
地道にがんばろうと思います。
0218デフォルトの名無しさん2007/03/01(木) 17:23:44
>>215
学ぶべきことがわかってるのはすばらしい!

ただし、下手に段階踏むと挫折しかねないので、
とりあえずサンプルコードからはじめるといいと思う。

「これで動くけど、なんでだろー?」って形で勉強するといいかも。
0219デフォルトの名無しさん2007/03/01(木) 21:52:11
簡単なサンプル作ってあげよか?インプレイスフィルタとトランスフォームどっちの変換フィルタ使ったらいいか調べるだけでも最初は一苦労だろ
0220デフォルトの名無しさん2007/03/01(木) 22:30:27
SDKのサンプルが一番いいよ
0221デフォルトの名無しさん2007/03/01(木) 22:44:15
そりゃサンプルで自分も勉強したけど、映像の処理なら「コントラスト」、「RGB」この2つから入ると思う。
この2つを最初にみたとき何が最低限実装が必要なメソッドかわからんかった。
そんな意味でのもっとシンプルなサンプル
02222152007/03/01(木) 23:19:46
>>218
ありがとうございます。
そうすることにします。
>>219
助かります!
是非お願いします!
0223デフォルトの名無しさん2007/03/02(金) 00:06:52
>>222
ひとまず、君の使ってる環境を教えてくれ。
自分はVC6+DX8SDK、VC2003+DX9(オウガスト)
の2つの環境でやっとる
02242152007/03/02(金) 00:12:39
>>223
了解です。
VC++2005Express + PlatformSDK + DirectX SDK (June 2006)
0225デフォルトの名無しさん2007/03/02(金) 00:25:29
http://www.geekpage.jp/programming/directshow/
http://www.geocities.co.jp/SiliconValley/7406/tips/dshow/
http://hammer.prohosting.com/~arabo/DirectShow.shtml
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/DirectX9_c/directx/htm/directshow.asp
0226デフォルトの名無しさん2007/03/02(金) 02:37:07
>>255
わかったよ。確かにそれみりゃわかるね。
甘やかすのは無用。勉強させろと無言のプレッシャーを感じる…。
02272152007/03/02(金) 03:03:29
>>225
二つ目のサイト以外は既に目を通したものばかりですが、それでも難しいと思いました。
キャプチャの出力解像度を変えることすらできませんでした・・・。
とりあえずC++から地道にべんきょーします。
0228デフォルトの名無しさん2007/03/02(金) 04:17:44
あとアセンブラの知識が必要になることもあるな
0229デフォルトの名無しさん2007/03/02(金) 08:49:03
マジすか?アセンブラワカンネ。
そしてここはsage進行なんですね。マイナーだからageてました
0230デフォルトの名無しさん2007/03/02(金) 08:53:36
DirectShowの本見ると「この本はC++を3年以上やってる方を対象に書いてます」みたいな事が書いてありますね。
C++経験者でないときついのか。
0231デフォルトの名無しさん2007/03/02(金) 15:09:51
>>227
入門や概説を一通り読んだら、リファレンスを全部読むのを薦めます。
02322132007/03/02(金) 21:13:20
>>214
色々調べて試したみたところ、IKsPropertySetが使えそうなのは判りました。
ただ、これでVideoProcAmpのプロパティへアクセスしてみたところ、
旧来のKSPROPERTY_VIDEOPROCAMP_BRIGHTNESSのようなFilterベースの
プロパティアクセスをサポートしているものはうまく動作しますが、
KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE_COMPONENTのような
ノードベースのアクセスしかサポートされていないパラメータへはアクセス出来ないようです。
入力インスタンス構造体のFlagsにKSPROPERTY_TYPE_TOPOLOGYをつけて
Get()を使ってみてますが、正常終了するものの中身が0です。

旧来のパラメータもノードベースでアクセス出来るようなので試したみたところ、
入力インスタンス構造体をノードベース(KSP_NODE)ではなくフィルタベース(KSPROPERTY)で
見ているようです。
どうもIKsPropertySetはフィルタベースのアクセスしかサポートしていないのでは、と
推測してるのですがどうなんでしょうか。
IKsControlを使うべきなのかと思い試してますが、こっちはnot supportedのえらーコードが返ります。
0233デフォルトの名無しさん2007/03/02(金) 21:25:17
DirectShowは最初わかんないことだらけだったな。
今でもわかんないこと多いけど。
サンプルと手助けがないとつらいね。
0234デフォルトの名無しさん2007/03/02(金) 22:02:35
>>232
勘で書いてるんだけど、IKsTopologyInfo:, CreateNodeInstanceでノードを作って、
ノードの方から IKsProperty を QueryInterface で取得して、IKsPropertySet::Setで
プロパティをセットするんじゃないだろうか。
0235デフォルトの名無しさん2007/03/02(金) 23:55:00
>>233
DirectShowは設計がマズイと思う。
フィルタグラフマネージャは自前でスレッドをもってユーザスレッドストリームスレッドとの切り離しをすべきだ。
いつの間にかメインスレッドから呼び出されていたりしてデッドロックとか多い。

0236デフォルトの名無しさん2007/03/03(土) 11:14:01
>>235
ほんとそのとおりだね。
IBasedPin::Reciver内で別スレッド立ててアロケータ確保すると
うまくやらないとアボーンする。。
02372152007/03/03(土) 23:03:00
>>231
ありがとうございます。
そうしてみます。

C++の入門書を一通り読みましたが、新しいことがいっぱいで疲れました・・・。
次はMSDNのリファレンスを読みます。
早くキャプチャソフト作りたいです。
0238デフォルトの名無しさん2007/03/04(日) 00:56:51
>>234
切り離すモードと切り離さないモードがある。
02392132007/03/05(月) 22:24:32
>>234
DDKやPlatformSDKの情報からみて、まさに指摘されてるようなことなんじゃないかと
思って試してみてますが、IKsTopologyInfo::CreateNodeInstance自体がエラーになるんですよね。

色々調べてみると、どうもWindowsXPでCreateNodeInstance自体が完全にサポート
されていない雰囲気がするのですよ。UVC extensionを調べててこんな情報がありました。

ttp://www.codecomments.com/archive421-2005-11-657282.html

自分のやり方が間違ってるかもとも思うんで、しばらく頭を冷やしてもう一度
試してみるつもりです。
0240デフォルトの名無しさん2007/03/05(月) 22:27:24
現在、キャプチャカードからのプレビューをモニタするソフトを作っておりまして、
キャプチャ(640×480出力)→ビデオレンダラ
というふうに繋いでいます。
ビデオレンダラでフルスクリーンにすると、4:3のアスペクト比を守りながら拡大してくれるのは
うれしいのですが、16:9ソースの表示にも対応するために、フルスクリーンの状態で
16:9にしたいです。
しかし、どうしてもできません。
描画されるビデオウィンドウはウィンドウズアプリのメインウィンドウに貼り付けているカタチです。
ソースは640×480を保ったまま、16:9にリサイズしてフルスクリーンにしたいです。
ご助言、よろしくお願いします。
0241デフォルトの名無しさん2007/03/05(月) 22:40:46
>>240
ビデオレンダラーから(フィルタグラフからでもいいのか?)
IVMRAspectRatioControl、IVMRAspectRatioControl9 や IVMRWindowlessControl を取得して、
SetAspectRatioModeでアスペクトレシオを無視するようにする。

レンダラのサイズは自前で16:9にしておく。
0242デフォルトの名無しさん2007/03/05(月) 22:57:06
変換フィルタを作成しているのですが、再生中にいきなりビデオのサイズが変わるような場合に、
再接続することなく対応したいのですが、レンダラへ新しい縦横サイズは教えてやれたのですが、
バッファサイズを変更できませんでした。
マニュアルには現在より大きなバッファサイズが必要な場合は、ReceiveConnectionを使えとありますが、
フィルタのどこにどのようなコードを追加すればよいのか分かりません。
デタラメな文章ですが、アドバイスありますでしょうか。。
02432402007/03/06(火) 00:47:31
>>241
ありがとうございます!
まずウィンドウレスモードですが、試そうとしたところ、ビデオをウィンドウに転送するところで
強制再起動が掛かかるなど恐ろしいことになってしまったので、ちょっと置いておきます。
ウィンドウモードで作りこんでしまったこともあり、できればこのままで解決したいと思っております。

他の試みとして、IVMRAspectRatioControlをVMR7から呼び出してSetAspectRatioModeで
アスペクト比固定をしないよう設定したのですが、相変わらずアス比固定でフルスクリーン
になりました・・・。
GetAspectRatioModeで確認しましたが、ちゃんとVMR_ARMODE_NONEになっていました。
そこで、grapheditで調べましたところ、
ttp://vista.jeez.jp/img/vi7310912755.jpg
二つあるフルスクリーンボタンのうち、「Set Full Screen」のほうはアス比固定拡大、「Full Screen Window」
のほうは全体に引き伸ばして表示される、という結果になりました。
先に試したプログラムのほうでは、前者のほうになっているのではないかと考えられます。
後者の「Full Screen Window」ボタンを押すことと等価な処理としては何が考えられるでしょうか?
02442402007/03/06(火) 01:37:56
ttp://msdn.microsoft.com/library/ja/directx9_c/directx/htm/usingwindowlessmodewiththevmr.asp?frame=true
ここのウィンドウレスモードの説明を見ていると、こちらのほうが良さそうですし、なんとか
ウィンドウレスモードで動くようにしてみます。
0245デフォルトの名無しさん2007/03/06(火) 15:01:49
>>243
古来より DirectShow でフルスクリーン再生をする際には、
レンダラをフルスクリーンモードにするのではなく
単に全画面のウィンドウで再生する方が好しということになっています。
後者はそれでしょう。
02462402007/03/06(火) 16:27:28
ウィンドウレスモードで解決しました!

>>245
なるほど、そういうことですか。
0247デフォルトの名無しさん2007/03/07(水) 21:22:13
二つのキャプチャデバイスが接続されているPC上で、ボタンをクリックする度に
IEnumMoniker::Next()を繰り返すことでキャプチャデバイスを切り替えるというプログラムを組んでいます。
デバイスが検出されなくなったら、IEnumMoniker::Reset()をして先頭から数えなおすように
しています。
一回の切り替えを細かく説明すると、
ストリームの停止→キャプチャフィルタの削除→上記メソッドで検出した新たなデバイスをグラフに追加
→ICaptureGraphBuilder2::RenderStream()でグラフをVMR9に直に接続→再生
という流れです。

これに問題がありまして、この切り替えを8回繰り返す(4順する)と必ず画面が最後のフレームを
表示したまま固まってしまいます。
考えられる原因や対処法がありましたら、ご教授お願いします。
0248デフォルトの名無しさん2007/03/08(木) 02:22:27
どこがデッドロックしているか調べるといい
02492132007/03/08(木) 03:23:24
USB Video Classキャプチャデバイスのプロパティアクセスについて質問をしていた213です。
問題が度解決できました。この辺を触る人はあまりいなさそうですがご報告だけでも。

結論からいうと、IKsTopologyInfoを使ってKSNODETYPE_VIDEO_PROCESSINGノードを
検索し、そのノードからIVideoProcAmpインタフェイスをCreateNodeInnstanceで生成することで、
拡張されたプロパティへアクセス出来ました。(IAMVideoProcAmpやIKsPropertySetではなく)
IVideoProcAmpはノードベースのインタフェイスとしてvidcap.hで定義されてますが、
Vista用のWindowsSDKで配布されているバージョンでないと定義自体存在しません。
USB Video ClassがXPSP2以降のサポートだったのでPlatform SDK(2003R2)を使っていたのですが、
これがまず失敗でした。
また、NTDDI_VERSIONとsdkddkver.hを使い、XPSP2以降であることを明示する必要がありました。

あと細かい話ですが、MSDNやWindowsSDKのドキュメントには、IVideoProcAmpノードの
生成時にIIDとしてIID_IVideoProcAmpを指定しろ、と書かれてますが、こいつのオブジェクトが
どこにも存在せずリンクエラーになります。_uuidof(IVideoProcAmp)で指定しないと駄目な模様です。
02502472007/03/08(木) 17:52:00
解決しました!
原因は二つ目のキャプチャデバイスをRenderStream()するときのみ、間に色空間変換フィルタが
挿入され、キャプチャフィルタを削除したときに色空間変換フィルタ、VMR9間のピンが持つ
アロケータにバッファがどんどん蓄積されていくためだったようです。
デバイスを切り替える度、VMR9との接続を切るようにすると、うまく動作するようになりました。
0251デフォルトの名無しさん2007/03/09(金) 00:51:33
フィルタをビルドするためにstrmbasd.libとstrmbase.libが必要なのですが、それを作成するための
ビルドがどうしてもできません。
お持ちの方がおられましたらお譲りください。
お願いします。

アップローダ
ttp://www.rupan.net/uploader/

環境
WindowsXP SP2
Platform SDK for Windows Server 2003 SP1
Visual Studio 2005 Express Edition
0252デフォルトの名無しさん2007/03/09(金) 02:40:17
baseclasses.sln をダブルクリックして開いてビルドを実行するだけだろ。
■ このスレッドは過去ログ倉庫に格納されています