■過去ログ置き場に戻る■ 1- 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

DirectShowと戦うスレ Part 2
1 名前:デフォルトの名無しさん :2006/11/08(水) 00:25:56
前スレ
http://pc8.2ch.net/test/read.cgi/tech/1026666092/

2 名前:デフォルトの名無しさん :2006/11/08(水) 00:30:59
>>1
それだけかよ。

3 名前:デフォルトの名無しさん :2006/11/08(水) 02:05:53
DirectShowプログラマーのみなさん。
メソッドのデッドロックとか、わけわからん現象多くないすか。
このスレに怒りやテクをぶつけましょう。

関連スレ
Win32API質問箱 Build46
http://pc8.2ch.net/test/read.cgi/tech/1159158014/
鬱だ氏のう DirectX (Part 16)
http://pc8.2ch.net/test/read.cgi/tech/1133007002/
くだすれDirectX(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1132965206/
【C++】 DirectX初心者質問スレ Part11 【C】
http://pc8.2ch.net/test/read.cgi/tech/1159456184/
DirectX総合スレ (Part5)
http://pc8.2ch.net/test/read.cgi/gamedev/1157727402/

4 名前:デフォルトの名無しさん :2006/11/08(水) 02:06:48
関連サイト
MSDN Microsoft DirectX9.0 DirectShow
http://msdn.microsoft.com/library/ja/DirectX9_c/directx/htm/directshow.asp
DirectX ホームページ
http://www.microsoft.com/japan/windows/directx/
MSDN ホームページ
http://www.microsoft.com/japan/msdn/
MSDN ライブラリ
http://msdn.microsoft.com/library/ja/
MSDN 2 ライブラリ
http://msdn2.microsoft.com/ja-jp/library/
Geekなページ DirectShowプログラミング [VC++]
http://www.geekpage.jp/programming/directshow/
あひるのホームページ DirectShowをよりよく使いたい人たちのサイト
http://hammer.prohosting.com/%7Earabo/DirectShow.shtml
Windowsでビデオキャプチャを作るため参考資料まとめ
http://www1.bbiq.jp/kougaku/link_videocap.html
奈良高専 土井研究室  動画あれこれ
http://wwwdoi.elec.nara-k.ac.jp/html/jisyu/doga/index.html
東京理科大 Kato Laboratory プログラミングキャプチャ
http://www.katolab.ee.kagu.sut.ac.jp/programing/capture.htm
京大川嶋氏 DirectShowのビデオキャプチャプログラミング
http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/directshow.html
M.Oshikiri's HomePage
http://www.geocities.jp/konbiki/tips/index.html
DirectShowを利用した透明ウィンドウでのビデオ再生
http://codezine.jp/a/article/aid/322.aspx

Google
http://www.google.com/

5 名前:デフォルトの名無しさん :2006/11/08(水) 07:40:31
スレたて乙

6 名前:デフォルトの名無しさん :2006/11/09(木) 00:26:04
フィルタロックとストリームロックの使いどころとか使い方とかよくわからない。
効果があったんだかないんだかもよくわからない。

7 名前:デフォルトの名無しさん :2006/11/12(日) 00:36:32
Windows SDKにも入ってないしDirectShowのSDKはどこいったんだ

8 名前:デフォルトの名無しさん :2006/11/12(日) 00:45:55
プラットフォームSDKに行ったよ。
プラットフォームSDKとはPlatform SDK for WindowsServer2003 みたいな名前の奴だよ。
一瞬WindowsServer2003かよ、関係ないね
っと思うところがミソ。

9 名前:デフォルトの名無しさん :2006/11/12(日) 03:38:34
976 :デフォルトの名無しさん [sage] :2006/11/03(金) 15:16:44
   フィルタは知らんけどVC6でDirectShowを使うなら
   #include <dshow.h>
   #pragma comment(lib, "strmbase.lib")
   と
   Platform SDKの
   audevcod.h
   DShow.h
   specstrings.h
   strsafe.h
   が有ればビルド出来るはず。
   インクルードパスに直接Platform SDK指定しても良いけど
   俺は上記ファイルだけ抽出したフォルダをパス指定した。
 
   Platform SDK
   http://www.microsoft.com/downloads/details.aspx?familyid=D8EECD75-1FC4-49E5-BC66-9DA2B03D9B92&displaylang=en
   (ページ下にWeb Installも有る)


986 :デフォルトの名無しさん [sage] :2006/11/04(土) 19:07:47
   DirectX 9.0 SDK (October 2004)のstrmiids.libはVC6でリンク出来た。
   VC6でDirectShow使うソースでリンクエラー出た人、エラーでたインターフェイス教えてくれない?
   リンク出来るか試してみたい。

   ※ DirectX 9.0 SDK (October 2004)
   http://download.microsoft.com/download/1/5/1/1513e3ec-f6e2-4fb1-bf27-7c8983b3bf91/dxsdk_oct2004.exe


10 名前:デフォルトの名無しさん :2006/11/12(日) 11:03:04
うーん
Windows SDK以外に
旧式のPlatform SDKも入れないといけないのか

11 名前:デフォルトの名無しさん :2006/11/12(日) 11:58:13
Win2K+VC6ならね。
Windows SDK(for Vistaのアレ?)はWinXP SP2以降しかサポートしてないから。

12 名前:デフォルトの名無しさん :2006/11/12(日) 11:59:11
素のVC6でDX9SDKを使う手抜き技。

#include <windows.h>
#ifndef _W64
typedef unsigned long DWORD_PTR;
typedef long LONG_PTR;
typedef unsigned long ULONG_PTR;
#endif
#include <dshow.h>

13 名前:デフォルトの名無しさん :2006/11/12(日) 12:03:11
何故summer 2003を使わない?>VC6

14 名前:デフォルトの名無しさん :2006/11/12(日) 12:05:01
どのdshow.h使ってる? >>9のPlatform SDKでは
#include <dshow.h> だけでコンパイル出来たけど。
マクロあたりで引っ掛かるのかな。

15 名前:デフォルトの名無しさん :2006/11/12(日) 12:12:54
MicrosoftのSDKはいいかげんにして欲しい。
単体で良いかどうか、出た日付、サポートする環境を書いて一覧ページを置いて欲しい。
BaseClasses入ってたり入ってなかったりするし。

16 名前:10 :2006/11/12(日) 12:22:01
ってよく見たらWindows SDKにもDirectShow入ってた。

17 名前:デフォルトの名無しさん :2006/11/12(日) 16:46:47
Webカメラの映像の解像度を変更する処理にチャンレンジしているが、
初期化時に
pAMStreamConfig->SetFormat(*****);
で解像度を変更するには成功。

しかし、
pCaptureGraphBuilder2->RenderStream(****);
を実行してしまうと解像度の変更ができない。

これを解決する方法か、または
RenderStreamで接続したピンを未接続にする方法はないでしょうか?

再起動後ではなく、リアルタイムに解像度を変更したいので。


18 名前:適当に答えてみる :2006/11/12(日) 18:01:27
IID_IMediaControlでプレビューをSTOPして
SetFormatして
プレビュー再開じゃだめなの?

19 名前:デフォルトの名無しさん :2006/11/12(日) 19:30:42
>>18
いえ、Runする前にでもRenderStream後だと
SetFormatが失敗するようなのです。

ですのでRun後、Stopしたとしても
それまでに一度RenderStreamが実行されていると
SetFormatがうまくいかず、苦労しています。

初期化の過程で、RenderStream前に
SetFormatした場合は成功しています。
しかし、リアルタイムに変更するからには
それができずにいます。

なので、RenderStreamをする前の状態に
戻すような方法はないのかと。


20 名前:デフォルトの名無しさん :2006/11/12(日) 21:18:01
一度止めて初期化からやり直すのは無理なの?

21 名前:デフォルトの名無しさん :2006/11/12(日) 21:30:45
DirectShow関連をすべてReleaseしてから
再度初期化からやり直しても
やはり二回目のSetFormatが失敗します。

やはりRenderStreamを解除するような手段が必要な気がします。

22 名前:デフォルトの名無しさん :2006/11/12(日) 21:57:59
> 再度初期化からやり直しても
そうか、それは困るね。
CoUninitializeとかプロセス起動し直しでも失敗する?

23 名前:デフォルトの名無しさん :2006/11/12(日) 22:22:39
丁寧にありがとうございます。
CoUninitializeまでやっても同様でした。

プロセス再起動というのは初耳ですが、
カメラに関する処理以外(DirectShow以外)には
影響を与えたくないんですが、大丈夫でしょうか?

いろいろ調べてますが、
IFilterChain::RemoveChainが怪しいのですがネット上の情報が皆無で
コンパイラを通すところですでに引っ掛かってます。

24 名前:デフォルトの名無しさん :2006/11/12(日) 22:43:25
子プロセス作ってパイプで、とかアドホックな手もあるだろうけど
CoUninitializeで無理なら駄目かもね。
インターフェイス使ってどうにかする方は俺には分からない。

25 名前:デフォルトの名無しさん :2006/11/12(日) 22:50:09
>>23
1.IPin::Disconnectでピンの接続解除
2.SetFormat
3.RenderStream


26 名前:デフォルトの名無しさん :2006/11/12(日) 22:55:41
AMCapみたいに、USBカメラのプロパティダイアログを呼んで
解像度変更するのはダメなの?

27 名前:デフォルトの名無しさん :2006/11/12(日) 23:01:34
Managed DirectXが先に死亡したのねw

28 名前:デフォルトの名無しさん :2006/11/13(月) 17:05:24
>>25
うおーー!!
成功しました。ありがとうございます。
FindPinで2つのフィルタ間の出力ピンと入力ピンとを見つけ、
そのピンをDisconnectで接続を外し、SetFormat。
そののちRenderStreamでできました。

ヘルプのDisConnectの欄をを見るとIPin::Disconnectの方は
「アプリケーションからこのメソッドを呼び出さないこと」
とか書いてて「じゃあヘルプに載せるなよ」とか思いました。
なんとかIFilterGraph::Disconnectの方で成功。

本当に助かりました。1つの問題で何時間も悩み、
DirectShowのクセの強さを痛感しました。

29 名前:デフォルトの名無しさん :2006/11/13(月) 19:51:12
今のSDKに GraphEdit って付いてないんだっけ。

あれでちょっと調べてみれば接続済みのときには設定変更できないとか
あれこれ挙動もわかるし悩まずにプログラミングできるんだけど。

30 名前:デフォルトの名無しさん :2006/11/13(月) 21:24:48
ん???ついてるよ

31 名前:デフォルトの名無しさん :2006/11/14(火) 14:14:48
Videos for Windoewsは
前スレにも過去スレにも話題も出てないし
スレも立っていないようですが
もはや今の時代こんなの使うべきじゃない
って解釈でOKでしょうか?

32 名前:デフォルトの名無しさん :2006/11/14(火) 23:03:16
XPが最後でVistaでは廃止されて使えないんじゃなかったっけ?

33 名前:デフォルトの名無しさん :2006/11/15(水) 00:20:58
使えないと困るだろ。
今後改善・改良されないだけ。

34 名前:デフォルトの名無しさん :2006/11/15(水) 00:22:11
そういえば64bitプロセスからDShow使うとどうなるんだろう。
フィルタも64bit用DLLを用意しないとダメ?

35 名前:デフォルトの名無しさん :2006/11/15(水) 09:13:55
MDX2.0は期限切れで使えません

36 名前:デフォルトの名無しさん :2006/11/15(水) 12:41:43
質問があります。
DirectShowフィルタのプロパティー画面を制作しているのですが、
タブを追加する方法がわかりません。
CBasePropatyという基底クラスにタブ追加メソッドがないのでどうしたらいいのかがわからんです。

WindowsAPIでいうところの「TabContrl_InsertItem」みたいなことをするにはどうしたらよいでしょうか?

37 名前:デフォルトの名無しさん :2006/11/15(水) 12:46:31
>>33
どっかで廃止って見て、かなり前に作ったVideos for Windoews使いまくりのアプリを
どうしようって思ってたんだけど、勘違いだったか。
よかったよかった。

38 名前:デフォルトの名無しさん :2006/11/15(水) 17:22:27
VFWは最近のボードだと、
正しく動作しないことも多いような...。


39 名前:デフォルトの名無しさん :2006/11/15(水) 17:55:43
>>36
ISpecifyPropertyPages::GetPagesで複数のCLSIDを返せば良いだけでは?

40 名前:デフォルトの名無しさん :2006/11/15(水) 18:30:09
うちのUSBカメラはVFWはすでに無視してます

41 名前:デフォルトの名無しさん :2006/11/15(水) 23:17:00
>>39
せっかく教えてもらったのにヽ(´ー`)ノ


42 名前:デフォルトの名無しさん :2006/11/16(木) 01:01:49
VFWtってC#マネージドでも使えますか?

43 名前:デフォルトの名無しさん :2006/11/16(木) 02:01:34
動画をデスクトップに保管しそのファイルを解凍し(解凍ソフト)、そのファイルをMPG2AVIに
入れて変換開始ボタンを押すと<DirectShowフィルタが構築されません>
とでて変換出来ません。どなたか親切な方教えて下さい。ちなみに私は初心者です。
宜しくお願いします

44 名前:デフォルトの名無しさん :2006/11/16(木) 07:56:15
動画板池

45 名前:デフォルトの名無しさん :2006/11/16(木) 08:09:05
>>43
保管したファイルを解凍の時点でわかんない
向こうで質問するにしても気をつけれ

46 名前:デフォルトの名無しさん :2006/11/16(木) 20:15:19
つかDirectShowも所詮はCOMだしなぁ
.NETで動画触ろうと思ったら
結局何が一番良いんだろうなぁ

47 名前:デフォルトの名無しさん :2006/11/16(木) 21:46:09
所詮はCOMってどーゆー意味だろ

48 名前:デフォルトの名無しさん :2006/11/16(木) 22:14:38
COM拒否症かも

49 名前:デフォルトの名無しさん :2006/11/16(木) 23:22:12
>>38とか>>40とか色々まとめると
動画に静止画とかを挿入するような
単純な機能だけならVFWで十分
と思って良い?

50 名前:デフォルトの名無しさん :2006/11/17(金) 08:50:22
じゃあSHOWってなにがすごいのさ?

51 名前:デフォルトの名無しさん :2006/11/17(金) 09:02:24
すごいかどうかは別にして、VFWでできることはDirectShowでも簡単にできる。
あえてVFWを使う必要なしってことかな。

52 名前:デフォルトの名無しさん :2006/11/17(金) 13:17:19
COMでとっつきにくいのを乗り越えてDirect Showで書いても
別に局.NETでマネージされてくれるわけでもないし
じゃあ結局どの辺にご利益があるのかなあ
と言うことだとエスパー

53 名前:52 :2006/11/17(金) 13:20:15
スマソ2行目の局は入力ミス
脳内あぼーんしてくれ

54 名前:デフォルトの名無しさん :2006/11/17(金) 14:20:12
>>50
AVI 以外を扱いたくなったときに対応可能ってとことか。

>>46
.Net で動画触るなら、C++/CLI で書くのが一番。
DirectShow でも WMF でも SDK 使って普通に使える。

55 名前:デフォルトの名無しさん :2006/11/18(土) 01:06:37
単にVFWを捨ててDirectXに統合したかったんでしょ。
で、のちのち気が変わってDirectShowだけプラットフォームSDKに移動したと。

56 名前:デフォルトの名無しさん :2006/11/18(土) 14:11:04
プラットフォームSDKへの移動は、どちらかというと昇格だね。

57 名前:デフォルトの名無しさん :2006/11/19(日) 09:52:40
DVDでコマ送り、コマ戻しはどのようにやるのがよいのでしょう?

58 名前:デフォルトの名無しさん :2006/11/19(日) 11:44:04
。みいかはいつ対応するの?

59 名前:デフォルトの名無しさん :2006/11/20(月) 01:32:42
なんでそんな書き方する?普通にドットネットってかけよ。

60 名前:デフォルトの名無しさん :2006/11/20(月) 01:46:12
最初のshiftが同時押しになったらしい

61 名前:デフォルトの名無しさん :2006/11/20(月) 18:26:00
.NETのことだったのか

62 名前:デフォルトの名無しさん :2006/11/24(金) 02:05:52
質問です。
変換フィルタを使って動画の画面サイズ解像度を変更(下げる)するフィルタ
を作ろうかなと考えております。
中身の処理はアンチエイリアスを自作する予定です。
【質問】
壱:OutPinに解像度を設定する項目があると思うんですがどうやってするんでしょうか?
弍:動画(1秒に15枚のBMP画像)を周波数解析したら普通のPCでは処理重杉でしょうか?

63 名前:デフォルトの名無しさん :2006/11/24(金) 03:31:07
1.希望サイズ、フォーマットの出力メディアタイプの提示をする。(TransformフィルタならGetMediaTypeで提示したいメディアタイプを返す。)
2.JPEG圧縮だって一応周波数に変換するから何とかなるんじゃない?

64 名前:デフォルトの名無しさん :2006/11/24(金) 04:46:37
>>63
壱:InputPinからGetMediaTypeで解像度取得してSetMediaTypeで
下流ストリームに教えてあげるのね。やってみます。
弍:JPEGはDCT。コサイン変換で周波数解析すればおk
と言う事と深読みしてみる(`・ω・´)
回答いただきありがとうございます。

65 名前:デフォルトの名無しさん :2006/11/24(金) 14:39:06
なんか公式の解説ページにあるコードが間違いだらけな気がするのは俺だけ?
明らかにNullのクラスポインタからメソッド呼び出そうとしてたり

66 名前:デフォルトの名無しさん :2006/11/24(金) 15:04:07
>>44
動画板って特別企画の動画2ch板のことか?
あそこに初心者質問スレが立つことなんてあるのか?

67 名前:デフォルトの名無しさん :2006/11/24(金) 20:07:34
>>64
下流ストリームに教えてあげるのはGetMediaTypeと思われ。。。

68 名前:デフォルトの名無しさん :2006/11/24(金) 21:10:08
>>67
なんですと〜。ちゃんと
確認の意味で書いてよかった。

へるぷ見て勉強しなおします

69 名前:デフォルトの名無しさん :2006/11/24(金) 23:31:34
>>68
ヘルプもいいけど、ベースクラスのソースとサンプル見た方が早いよ

70 名前:デフォルトの名無しさん :2006/11/25(土) 01:01:26
>>68
「おいおい、あんた何を俺にくれるのよ?」が GetMediaType

71 名前:デフォルトの名無しさん :2006/11/25(土) 01:05:01
>>65
あるね。ビルドやってないだろ、見たいなの。

72 名前:デフォルトの名無しさん :2006/11/25(土) 02:43:18
DirectShowってやっぱ"Show"って言ってるだけあって
入力方向より出力方向の方が充実してるって感じなんでしょうか?
正直、他アプリからDirectShowへの入力はかなりイマイチな希ガス

73 名前:デフォルトの名無しさん :2006/11/25(土) 03:07:28
ソースフィルタ側ってあんまり活用されてないよねえ

74 名前:デフォルトの名無しさん :2006/11/25(土) 08:05:50
上流はプッシュ、プルモデルを正しく理解して実装するのは(最初のうちは)大変かと 
トランスフォームなら良くわからなくても実装しやすいからね

75 名前:デフォルトの名無しさん :2006/11/25(土) 12:15:15
フィルタ開発しているとピン接続を拒否されたときの理由を調べるのがつらい。
もっと簡単にわかってほしい。

76 名前:デフォルトの名無しさん :2006/11/27(月) 01:07:10
>>51とかよぉ、VFWとやらがどんなもんなのかはまあ知らねぇんだが
DirectShowが簡単ってこたぁねぇ気がすんだがなぁ。
普及させたいからかなんか知らんが誤解を与えるような表現はイクナイ

77 名前:デフォルトの名無しさん :2006/11/27(月) 01:40:18
簡単じゃないけどそれはハードルであって
そこを超えると何もかもが簡単になるという

RUBYYYYYYYYYYYYYYYYYYY

ってやつ

78 名前:デフォルトの名無しさん :2006/11/27(月) 13:03:01
質問です。
長さ無制限のストリームを供給し続けるプル型のソースフィルタを実装することは可能でしょうか?
IAsyncReader::LengthでTotalバイトを取得できるようになっていますので、ここに長さ無制限を示す数値を設定しないといけないのかとは思うのですが、
0や-1を返すとかありなのでしょうか。

ご存知のかたいらっしゃいましたら、ご教示お願いします。



79 名前:デフォルトの名無しさん :2006/11/27(月) 23:36:33
素人でスマンが、DrectXからDirectShowへ入力しようとしてるんだが、
俺なりに調べてみた所、サーフェイスを云々してRECT型使ってGDI経由で入力、
と言うようなスマートじゃない方法しか思いつかないんだが、
何か調べ方間違ってるんだろうか?
WindowsXP限定なら他にもありそうな感じだったがそれはしたくない。

そもそもこういう用途でDirectShowを使おうとすること自体間違いなんだろうか?
Directつながりでやりやすそうとか安易に思ってたんだが。

80 名前:デフォルトの名無しさん :2006/11/28(火) 00:48:21
よくわからんがDirectShowのレンダラに絵を表示させる仕事をさせたいわけ?
できなくはないが簡単にはできない。

81 名前:79 :2006/11/28(火) 01:35:49
編集とか圧縮とかもできればやりたいが基本的にはまずは動画を出力したい、
レンダラ側とかは何とかなりそうだが、ソース側が‥
「プッシュ型ならどっちかって言うと簡単」みたいな記述を↓で見かけて
http://m--takahashi.com/old/09850.html
鵜呑みにしてソースフィルタ自作しようと思ったものの失敗だったか?
かと言ってFile Monikerとやらも簡単そうには見えないし

と言った状況であります。

82 名前:デフォルトの名無しさん :2006/11/28(火) 13:36:05
>>81
DirectX でレンダリングした結果を動画ファイルにしたいってこと?
それってソースフィルタ書くことになるわけだけど、ソースフィルタ書くってのは
DirectShow のアレコレの中でも非常に難しいことなので、覚悟してやってくれ。
あとプッシュにするかプルにするかは勝手に選べるわけでもないんで、
その辺の理解も必要(パーサが対応してる方じゃないとそもそもグラフが組めない)。
漏れならWMF SDKで WMV にするなぁ。

あと万が一もし単に画面に動画を出したいだけなら、DirectXだけでそのままやれば十分。
ってかDirectShowのレンダラもDirectXで描いてるわけで。

83 名前:デフォルトの名無しさん :2006/11/28(火) 15:58:15
WMF SDKは日本語のドキュメントが公開されてないっぽいので躊躇してたが
実際インストールしてマニュアル見たらこっちのほうが簡単そう

>>82ありがとうございました

84 名前:デフォルトの名無しさん :2006/11/28(火) 19:34:50
62ですが動画サイズ変換フィルタでしました
ありがとうございました

なぜGetMediaTypeの中に出力Pinの設定をかくのか未だ謎。
まぁもう少し使い勝手(入力画像サイズの自動判断など)よくしたら
ソースとバイナリうpします
今後の為にも

85 名前:デフォルトの名無しさん :2006/11/28(火) 19:36:21
う〜〜〜ん 何をしたいのか よくわからん。
DirectXで描画したイメージを100%忠実に取り出すことなんて そもそもできるのか? 

86 名前:デフォルトの名無しさん :2006/11/28(火) 22:49:29
> なぜGetMediaTypeの中に出力Pinの設定をかくのか未だ謎。
ココわからないと、この先しんどいと思われ

87 名前:デフォルトの名無しさん :2006/11/28(火) 23:01:47
>>86
GetMediaTypeは上流ストリームの設定を取るインターフェースだけではなく

下流ストリームの接続の設定も取るしくみなのかしら?
だとしたらPinそれぞれにMediaTypeを取れるインターフェースを作ってもらいたいものよね

88 名前:デフォルトの名無しさん :2006/11/28(火) 23:52:18
>>87
だからそうなってるだろ?

89 名前:デフォルトの名無しさん :2006/11/29(水) 17:43:12
>>84
後学の為の資料としてソースうpしてくれるなら
ソースは直接書き込んだ方がいいかも。
うpろだだと後々検索でこのスレ見た人とかは拾えないから。

>>85
DllInjectionでDirect3D乗っ取ってフロントバッファを取得して、
それを直接DirectShowに流して動画キャプチャソフトを作りたいんじゃないかな?
俺は>>83じゃないからわからんけど。質問見た感じそんな所じゃないかなーと思った


90 名前:デフォルトの名無しさん :2006/11/29(水) 19:49:16
>>89
わかりました。
えいちてぃーえむえるにしてソースをどこかに貼りますね。
ただまだ解決出来ない問題がありますので暫くかかると思うけど…

画面の解像度変更すると出力Pinとレンダラの間に中間フィルタ「Colorコンバータ」が何故か入る
(´・ω・`)

中間フィルタさえはいらなきゃちゃんと表情されるのに…

91 名前:デフォルトの名無しさん :2006/11/30(木) 02:41:37
>>89
フロントバッファと画面イメージって必ずしも同じじゃないんじゃ?
よくわからんけど。。。

92 名前:デフォルトの名無しさん :2006/11/30(木) 22:47:39
>>91
え、BeginScene()とEndScene()の間のレンダリング結果が
Present()によってバックバッファからフロントバッファに
Blt(あるいはFlip)されると思ってたけど、違う?

93 名前:デフォルトの名無しさん :2006/12/07(木) 14:28:29
class CGrabCB: public CUnknown, public ISampleGrabberCB
{

          ・
          ・
とコールバックとかいうのをすると、下記のようなエラーがでるのですが
どうすればよいのでしょうか?

.\AAA.cpp(489) : error C2504: 'CUnknown' : 定義されていない基本クラスが宣言されています。
.\AAA.cpp(492) : error C2501: 'CGrabCB::DECLARE_IUNKNOWN' : 識別名を宣言するのに、型が指定されていません。
.\AAA.cpp(1057) : error C2259: 'CGrabCB' : 抽象クラスをインスタンス化できません。
次のメンバが原因です :
'HRESULT IUnknown::QueryInterface(const IID &,void ** )' : 純粋仮想関数は定義されていません。
c:\Program Files\Microsoft Platform SDK\Include\Unknwn.h(113) : 'IUnknown::QueryInterface' の宣言を確認してください。
'ULONG IUnknown::AddRef(void)' : 純粋仮想関数は定義されていません。
c:\Program Files\Microsoft Platform SDK\Include\Unknwn.h(117) : 'IUnknown::AddRef' の宣言を確認してください。
'ULONG IUnknown::Release(void)' : 純粋仮想関数は定義されていません。
c:\Program Files\Microsoft Platform SDK\Include\Unknwn.h(119) : 'IUnknown::Release' の宣言を確認してください。

94 名前:デフォルトの名無しさん :2006/12/07(木) 14:38:30
まず、CUnknownはどこから出てきた?
仮にCUnknownがIUnknownのメソッドを実装するクラスとして存在したとしても、
C++ではCGrabCBがCUnknownを継承しただけでは、
ISampleGrabberCBのIUnknownのメソッドを実装したことにはならないはず。

95 名前:デフォルトの名無しさん :2006/12/07(木) 14:51:07
実はうまくできてるパソコンがあって、別のPCでも動かそうと思ったら、
このエラーが出てしまって。前も出たのですがどうやって修正したのか忘れてしまった
次第です。
やり方は
ttp://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/directshow.html
を真似しました。

96 名前:93 :2006/12/07(木) 14:59:05
streams.hをインクルードし忘れてました。。
で、インクルードすると
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\atlconv.h(1000) : error C2084: 関数 'LPDEVMODEA AtlDevModeW2A(LPDEVMODEA,const DEVMODEW *)' は既に本体を持っています。
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\atlconv.h(548) : 'AtlDevModeW2A' の前の定義を確認してください
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\atlbase.h(6683) : warning C4193: #pragma warning(pop) : 一致する '#pragma warning(push)' がありません

またエラーが出てきてしまいました。前はこれでうまく言ったのですが・・

97 名前:デフォルトの名無しさん :2006/12/10(日) 22:24:56
DirectShowでWEBカメラ映像を表示するプログラムを作ったのですが、
TVチューナーの付いたパソコンだとTV映像が表示されてしまいます。

なんとかWEBカメラに限定させることはできないでしょうか?

98 名前:デフォルトの名無しさん :2006/12/11(月) 17:08:23
今、WMVを無圧縮AVIにするプログラムを作っているのですが
(最終的に別のソフトでxvidでmp4にする予定)
出力されるAVIが映像の再生時間だけ2倍になってしまいます
(音は普通に再生)

Directshowでの調整がうまくいかなかったので一度AVI作成後にRateとScaleとMicroSecPerFrameを調整して
AVI状態ならずれの修正はできたのですが、それをmp4に変換すると再生がおかしくなってしまい
原因がつかめなかったのでDirectshowでAVI作成するところまでもどってきたのですが
Grapheditでマスターストリーム指定で30秒くらいのファイル一個だけですがうまくいったので<wmv9
IConfigAviMuxをソースに追加してみてSetMasterStreamが成功はしているのですが
結果に反映されてくれません。

ソースは以下のようなものなのですがどこがいけないのでしょうか

-------------------------------------------------------------------------
IGraphBuilder*pGraph= NULL;
ICaptureGraphBuilder2*pBuilder= NULL;
IBaseFilter*pSrc= NULL;
IBaseFilter*pMux= NULL;
IBaseFilter*pAudioDec= NULL;
IBaseFilter*pAVIDec= NULL;
IPin*pPinIn= NULL;
IPin*pPinOut= NULL;
IMediaSeeking*pSeek= NULL;
IMediaSeeking*pRate= NULL;
IMediaEvent*pMediaEvent= NULL;
IMediaControl*pMediaControl;
longevCode;


99 名前:デフォルトの名無しさん :2006/12/11(月) 17:08:55
CoInitialize(NULL);

CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&pGraph);
CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC, IID_ICaptureGraphBuilder2, (void **)&pBuilder);

IBaseFilter *pAVIMux =NULL;//+id{CLSID_AVI mux}_GUID
pAVIMux = searchFilter(pGraph, L"AVI Mux" );

IConfigInterleaving *pConf = NULL;
IConfigAviMux *pConfMux = NULL;
pGraph->AddFilter(pAVIMux, L"AVI Mux");

LONG lo = -1;

pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, OutputFile, &pMux, NULL));

pBuilder->GetFiltergraph(&pGraph));
pGraph->AddSourceFilter( InputFile, L"SourceFilter", &pSrc));

pAVIDec = AVI Decompressorフィルタ取得
pAudioDec = WMAudio Decoder DMOフィルタ取得

pGraph->AddFilter(pAVIDec, L"AVI Decompressor");
pGraph->AddFilter(pAudioDec, L"WMAudio Decoder DMO");

pPinOut = GetPin(pSrc, PINDIR_OUTPUT);
pPinIn = GetPin(pAudioDec, PINDIR_INPUT);
pGraph->Connect(pPinOut, pPinIn);

pBuilder->RenderStream( NULL, NULL, pSrc, pAVIDec, pMux );

100 名前:デフォルトの名無しさん :2006/12/11(月) 17:10:19
pBuilder->RenderStream( NULL, NULL, pSrc, NULL, pMux );
pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);
pGraph->QueryInterface(IID_IMediaEvent, (void **)&pMediaEvent);

pMux->QueryInterface(IID_IMediaSeeking, (void**)&pSeek);

CLSID id;
pAVIMux->GetClassID(&id);
CoCreateInstance(id, NULL, CLSCTX_INPROC, IID_IConfigAviMux, (void **)&pConfMux);
pAVIMux->QueryInterface(IID_IConfigAviMux, (void**)&pConfMux);
pConfMux->QueryInterface(IID_IConfigAviMux, (void **)&pAVIMux);
pConfMux->GetMasterStream(&lo);
pConfMux->SetMasterStream(1);
pConfMux->GetMasterStream(&lo);

if (pMediaControl->Run() == S_OK)
{
途中経過表示など
}

//終了処理
if(pRate != NULL) pRate->Release();
if(pConf != NULL) pConf->Release();
if(pAVIMux != NULL) pAVIMux->Release();
if(pConfMux != NULL) pConfMux->Release();

if(pAudioDec != NULL) pAudioDec->Release();
if(pAVIDec != NULL) pAVIDec->Release();
if(pGraph != NULL) pGraph->Release();
if(pBuilder != NULL) pBuilder->Release();

101 名前:デフォルトの名無しさん :2006/12/11(月) 17:11:22
if(pSrc != NULL) pSrc->Release();
if(pMux != NULL) pMux->Release();
if(pMediaEvent != NULL) pMediaEvent->Release();
if(pSeek != NULL) pSeek->Release();
if(pMediaControl != NULL) pMediaControl->Release();
if(pPinIn != NULL) pPinIn->Release();
if(pPinOut != NULL) pPinOut->Release();
CoUninitialize();
-----------------------------------------------------------------------
いろいろ試行錯誤していたので少し読みにくくてもうしわけありません。

102 名前:デフォルトの名無しさん :2006/12/11(月) 17:21:22
CLSID id;
pAVIMux->GetClassID(&id);
CoCreateInstance(id, NULL, CLSCTX_INPROC, IID_IConfigAviMux, (void **)&pConfMux);
pAVIMux->QueryInterface(IID_IConfigAviMux, (void**)&pConfMux);
pConfMux->QueryInterface(IID_IConfigAviMux, (void **)&pAVIMux);

の辺りを主にいじっていました(コードを実行する場所をかえたりなども)

103 名前:デフォルトの名無しさん :2006/12/11(月) 17:33:02
>>98-102
WMV: 各サンプルにタイムコードあり
AVI: 各サンプルにタイムコードなし

とかこのあたりの問題はOK?

104 名前:デフォルトの名無しさん :2006/12/11(月) 17:42:49
AVI→mp4の変換がうまくいかなかずに調べていて自分で出力済みのAVIを
いじるのは無理と判断しまして、Directshowで出力前設定をいじれば勝手に
それをはさんでくれるのではないかと思いまして(Grapheditではうまくいったので)

動画関係をいじりはじめたのがつい最近なので色々調べはしましたが
細かいところはよくわかっていないと思います

105 名前:デフォルトの名無しさん :2006/12/11(月) 17:46:28
「AVI→mp4の変換がうまくいかなかずに」

「AVI→mp4の変換がうまくいかずに」
が誤字なのとそのあとの調べたものを書きそこねました
自分で無理だと判断↓原因がタイムコードです


106 名前:デフォルトの名無しさん :2006/12/11(月) 19:56:38
GraphEditではどんなフィルタ構成になった?

107 名前:デフォルトの名無しさん :2006/12/11(月) 19:57:30
>>97 ソースをWEBカメラになるように明示的に指定すればいいんじゃね?

108 名前:デフォルトの名無しさん :2006/12/11(月) 20:26:13
>107
そういうのって、どこかで指定できましたっけ?
接続してるカメラを列挙してるから
カメラ以外は入ってこないと思ってたんですが。

109 名前:デフォルトの名無しさん :2006/12/11(月) 22:20:47
なんかフレームの持続時間が意識されていないような気がするけどどうだろう。
>>103氏の懸念していることに近いけど。

入力のWMVと出力されたAVIの総フレーム数は一致しているだろうか。
また、それぞれのフレームレートはどうなっているのかな?
その辺の具体的な数値があった方が状況を確認しやすいと思う。

110 名前:98 :2006/12/12(火) 10:44:27
GraphEditでは
WMVファイル →WMAudioDecoderDMO          →AVIMux →FileWriter
       →WMVideoDecoderDMO →AVIDecompresser→
となっています

変換結果は
フレームレートは両方30fpsなのですが、
出力されたAVIのフレーム数は1723です(WMVのほうは調べ方がちょっとわからなかったです)
再生時間がWMV時点で28.7秒でAVIにすると57.4秒で丁度綺麗に2倍になる感じです
フレームの持続時間のほうはフレームレートの調整程度しか意識していませんでしたので
また少し自分でも調べてみようと思います。

111 名前:98 :2006/12/12(火) 10:55:08
出力済みAVIファイルは下のようにヘッダを書き換えればAVI状態ではうまく再生できたのですが
mp4に変換するとファイルによって色々な症状がでて3個ほどサンプルを試した内では
ひとつもまともに再生できませんでした。

dwAudioTime = (double)dwAudioLength * dwAudioScale / dwAudioRate;

dwMicroSecPerFrame = dwAudioTime / dwVideoLength * 1000000.0+0.5;

dwVideoRate = 1000000L;
dwVideoScale = dwMicroSecPerFrame;

112 名前:98 :2006/12/12(火) 11:05:27
3連続で書いてすいません。
書き換えた部分はstrhヘッダ(ストリームタイプがvids)の
rateとscale、avihヘッダのmicrosecperframeです

113 名前:デフォルトの名無しさん :2006/12/12(火) 11:10:40
>>110
>フレームレートは両方30fpsなのですが、 出力されたAVIのフレーム数は1723です
30fpsで1723フレームなら、57秒ちょっとで合ってるじゃないですか。

GraphEdit で WMV ファイルを再生して、ビデオレンダラのプロパティで再生フレーム数を見れば
おおむねのフレーム数がわかると思います。それでフレーム数を確認してみてください。

それから、WMV はフレーム毎にタイムスタンプが付いていますから(≒フレームの時間的間隔が
一定ではない)、デコードして AVIMux で結合という簡単な処理では決して正しい AVI ファイルは
出来ないということも理解する必要があります。



114 名前:98 :2006/12/12(火) 13:05:01
指示いただいた通りGraphEditでフレーム数確認したところ861フレームでした

WMV(変換元ファイル)のほうは28秒ちょっとなので57秒でフレームが丁度2倍になっている感じですね

>それから、WMV はフレーム毎にタイムスタンプが付いていますから(≒フレームの時間的間隔が
>一定ではない)、デコードして AVIMux で結合という簡単な処理では決して正しい AVI ファイルは
>出来ない

やはりちょっとヘッダー部などをいじった程度だと無理でしたか
Directshowのフィルターがその辺の処理をやってくれるのではないかと
甘く見ていました

115 名前:98 :2006/12/12(火) 13:17:20
あと、AVIDecompressorのあとにビデオレンダラにつなげるとその時点では
まともに再生されるのですが、AVIMuxでファイル保存できるようにするときに
タイムスタンプが抜かれてしまうのでしょうか?

116 名前:デフォルトの名無しさん :2006/12/12(火) 16:42:29
>>115
AVI 形式のファイルは、メディアフォーマットで指定された同一持続時間の
サンプルがずらーっと並ぶだけというようなフォーマット。
なので正しいフレームレートでかつ1フレームの欠落もないデータじゃないと
正常に再生できない。

変換元ファイルを走査して、真のフレームレートを計算してWMV側で落ちている
フレームも捏造して自分でmuxするとかやり方はあるような気がするけれども、
絵と音がずれないAVIファイルを作るのはとても難しいです。

117 名前:98 :2006/12/12(火) 19:17:37
やはり、自分でやるしかないとなると相当むずかしいみたいですね
とりあえずWMVファイルを調べてその最小公倍数分のフレームレートをAVIファイルに設定、
フレームの余計な部分に空フレーム挿入などで試してみようと思います。

途中で挫けそうですが、もしうまくいったら報告だけでもさせていただきます。
…WMVとかに使っているコーデックで圧縮かかってるとその別ソフトが読み込んでくれないから大変です...orz

色々教えていただいてありがとうございました。

118 名前:デフォルトの名無しさん :2006/12/21(木) 21:42:10
ボコノン教授
どこみても質問に回答してる。
ネ申ですか?それともM$の中の人ですか?

119 名前:デフォルトの名無しさん :2006/12/22(金) 00:43:59
教徒だろw

120 名前:デフォルトの名無しさん :2006/12/22(金) 08:57:53
>>119
教徒と言う事は宗教団体さんみたいなもんなんすね。
DirectShow究めるためにボコノン教に入ってみたいかも

121 名前:デフォルトの名無しさん :2006/12/23(土) 17:14:46
パーサー(スプリッタ)フィルタを自作したいのですが、
参考になるサンプルなどありますか?
情報が少なくて困っています。
変換フィルタはいくつか作成したことがあります。

122 名前:いつでもどこでも名無しさん :2006/12/23(土) 23:31:06
YUY2の16bit列をRGB16bit列に変換したいのですが、便利な関数またはフィルタありませんか?

123 名前:デフォルトの名無しさん :2006/12/27(水) 00:00:48
>>121
ソースがプルなのかプッシュなのかによりスプリッタの挙動が大きく異なるわさ
プッシュなら来たサンプルバラして後方にポンポコ投げろや
プルなら入力ピン繋がった時点でソース先読みして各種情報提供してやるとか色々とアレ
年末ゆえ酒飲んでて上手く得ないけど、まあ察しろ
出力ピンに関してはINFTeeのサンプルが参考になるよ

>>122
変換式ならググればゴロゴロみつかるし、後は自分でやってもたいしたことないだろ がんばれー

124 名前:デフォルトの名無しさん :2006/12/27(水) 00:01:47
上手く得ないけど → 上手く言えない タイプミスうぜー

125 名前:デフォルトの名無しさん :2006/12/27(水) 20:37:01
>>123
変換を自作したがいちピクセル単位でやると遅くてつかいものにならんかったよ。
そこで私は
趣味→オーブンしーぶい(ただだけど配布できない)仕事→あいぴーぴー(よっしゃでかえるレベル)
を使った。一個関数呼ぶだけだった


126 名前:122 :2006/12/28(木) 02:18:06
>>123
変換式は見つかりました。でもSSE命令とか使いたいところです。
アセンブラ画像処理プログラミング って本買ってきたので頑張ります

>>125
OpenCVやIPPの場合、どんな関数使えばいいですか?
正にIplImageが欲しいです

127 名前:122 :2006/12/28(木) 02:23:55
>>125
OpenCVって配布できないんですか?

http://journal.mycom.co.jp/news/2006/11/08/360.html
http://e-words.jp/w/BSDE383A9E382A4E382BBE383B3E382B9.html

BSDライセンスってことですが

128 名前:122 :2006/12/28(木) 02:57:28
IPPの関数は見つかりました。しかしOpenCVのcvHoughLines2が使いたいので
OpenCVで変換する関数を是非教えて下さい

129 名前:122 :2006/12/28(木) 09:22:06
>>123
アドバイスありがとうございます。
ソースフィルタはFile Source(Async)です。
とりあえず、空の変換フィルタ(CTransformFilter)を作成し、
ソース→空フィルタと接続して解析しようと思ったのですが、
「同じトランスポートをサポートしていない為、ピンを接続できません。0x80040266」
というエラーが起こり、接続することすらできません…

130 名前:121 :2006/12/28(木) 09:23:06
↑121でした。

131 名前:デフォルトの名無しさん :2006/12/28(木) 12:47:29
>>129
FileSource にTransformFilterがそのまま接続可能(かも)と思う時点で
知識が少なすぎて説明とか不可能なレベル。
SDK の DirectShow のドキュメントを先頭からちゃんと読むべし
(大した分量じゃないでそ)。

132 名前:デフォルトの名無しさん :2006/12/30(土) 08:42:31
#define D3D_DEBUG_INFO
が定義されているとムービー再生時に
VMR9のRenderlessが無視されてActiveMovie Windowが
ポップアップで出てくるんだけど、これ抑制させる方法ないでしょうか?


133 名前:デフォルトの名無しさん :2006/12/30(土) 18:38:31
どこの何の話?

134 名前:デフォルトの名無しさん :2007/01/05(金) 01:08:09
お、スレッド落ちてたの直ったのか。
>>127>>128
オープンしーぶいの話し少し待ってもらってもいいか?
仕事始まれば家に帰るからさ

ライセンスの話は多分私が間違えていると思う。
ただインターネットの書き込みで気になるのがあった
それを張り付けますよ〜。

135 名前:デフォルトの名無しさん :2007/01/06(土) 11:16:08
落ちてたんじゃなくてサーバ移転しただけじゃないのかな

136 名前:デフォルトの名無しさん :2007/01/09(火) 19:46:03
[MSDN Online 更新情報] December 2006 DirectX SDK が公開されました。 [DirectX] (2006-12-22 09:00)
http://www.microsoft.com/japan/msdn/directx/downloads.aspx

137 名前:デフォルトの名無しさん :2007/01/09(火) 20:55:30
かなり前にインスコ済みなんだが

138 名前:デフォルトの名無しさん :2007/01/09(火) 21:07:56
December 2006 DirectX SDK
DirectShow関係で何か変わってます?

139 名前:デフォルトの名無しさん :2007/01/10(水) 00:15:22
VMRってWin2KではDirectX9.0およびビデオカードがサポートしていればサポートするよ、
見たいな事言ってるけど実際Win2Kではどうですか?
ぶっちゃけウインドレスモードが欲しいだけなんですが。
オーバーレイとかDirect3Dで描画なんたらとかじゃなく


140 名前:デフォルトの名無しさん :2007/01/10(水) 07:56:14
【ネガティブ派遣根性チェック】

3つ以上、思い当たる点があればアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。

□派遣先の社員の意見にはたとえ間違っていても反対しない
□派遣先から「いつまでもここで仕事してくださいね」と言われるようになりたい
□自社に仕事を持ち帰れるように言われるとムカつく
□自社で仕事なんてできるわけがない
□派遣/受託の差異を指摘する人間はムカつく
□派遣先には仕事だけでなく自分のプライベートについても指示して欲しい
□自分の月額金額を知らない
□派遣先社員より自分の生涯収入が低いのは当然だ
□派遣先に尻尾を振り、いつまでも一緒に仕事をすることが大切だ
□今のプロジェクトが終わっても同じ派遣先に常駐したい


141 名前:デフォルトの名無しさん :2007/01/12(金) 02:18:08
ネガティブ派遣社員(σ´Д`)σゲッツ!!
正社員なんだが仕事の為なら派遣さんにも尻尾ふりますよ。寧ろ俺が最下層。

OctoberではVC6のサポートしていたんだが、December 2006 DirectX SDK は打ち切ったようだね。
「.dws」と言うプロジェクトファイルがなくなっとる

142 名前:デフォルトの名無しさん :2007/01/12(金) 02:48:15
正社員は「自分の仕事のため」に尻尾ふり

派遣は「切られないため」に尻尾ふり

143 名前:デフォルトの名無しさん :2007/01/15(月) 03:19:51
変換フィルタの自作しているんですけど、
上流フィルタの出力pinにたとえばVGAの解像度を優先接続して欲しいん
ですが、そんなことって可能でしょうか?

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/dnwmt/htm/grabbersample.asp
このページをみながら「EnumMediaType」と「GetMediaType」はオーバーライド
したんですが、
まだ接続しきっていないせいか上流フィルタの出力pinに解像度の情報が乗っていない。。

できないのかな?

144 名前:デフォルトの名無しさん :2007/01/15(月) 13:44:33
>>143
GetMediaType で解像度入れたメディアタイプを返せばいいんじゃない?

145 名前:デフォルトの名無しさん :2007/01/15(月) 16:31:10
>>144
回答ありがとうございます。
そのあたりを嗜好錯誤してかつできませんでした。
解像度を返すにはCMediaType->Formatのポインタが必要ですがそこが
空になっているんです。


146 名前:デフォルトの名無しさん :2007/01/15(月) 16:54:48
>>145
それは当たり前でソ。フォーマットタイプによってpbFormatの先の構造体のサイズは変化するんだから、
事前にアロケートしてもらうのは無理。>>145が自分で SetFormat & SetFormatType してあげないと。

147 名前:デフォルトの名無しさん :2007/01/15(月) 17:15:08
>>146
できました。
優先的に上流フィルタの解像度を選んでくれるようになりました。


148 名前:デフォルトの名無しさん :2007/01/17(水) 08:27:54
Direct3D9+VMR9 Renderlessモードでビデオ画像を表示しているのですが
60fpsで描画すると(SetTexture→DrawPrimitiveUP→Present)
フルスクリーンモードでDirectShowが固まってしまいます。(デコードが停止)
同じような問題に遭った方いらっしゃいますか?

フルスクリーンでもビデオに合わせて30fps程度に落としたり
(ソースは典型的な29.97fps)、ウィンドウモードにすると問題は無いんですけども・・・。
VGAは NVIDIA GeForce4MX , DirectX9 2006-feb
ドライバは ForceWare 93.71 (2006年11月2日) WHQL認定 です。

149 名前:デフォルトの名無しさん :2007/01/18(木) 01:45:21
RenderFileでディスク上のmp3が鳴らせる、というとこまでわかりました。
メモリ上のmp3を鳴らす場合、ソースフィルタをどうにかこうにか、
と言うことのようですが、それ以降さっぱりわかりません。
なにかいいサンプルがあったら教えてください。

150 名前:デフォルトの名無しさん :2007/01/18(木) 04:40:47
>>149
C:\Program Files\Microsoft Platform SDK\Samples\Multimedia\DirectShow\Filters\Async\MemFile
と、よく知らないのに返答してみる・・・

151 名前:デフォルトの名無しさん :2007/01/18(木) 10:57:19
>>149
まず標準的なPCにプレインストールされているMP3デコーダフィルタがある、と仮定すると
それが何なのかGraphEdtで調べる。
次にそのMP3デコードフィルタとつながるソースフィルタを自作する。
そしてソースフィルタがそのMP3デコーダフィルタに対してどのようなメディアタイプで接続できるのか調べる。
メディアタイプがわかったらそのメディアタイプにあった形式に、メモリ上のデータとやらを加工してMP3デコーダに渡す。
フィルタ作ったことが無いなら相当大変だよ。



152 名前:149 :2007/01/19(金) 03:05:59
レスありがとうございます。
サンプルも151もまるで理解できないのでとりあえずDirectShowを1から勉強してます。

153 名前:デフォルトの名無しさん :2007/01/19(金) 04:54:19
最終的にどういう条件で何がしたいのかを書いたほうがいいかもよ。
他の選択肢があるかもしれんし。。。

154 名前:デフォルトの名無しさん :2007/01/19(金) 23:55:04
MPEG3Layer-3デコーダ
これが標準にインストールされてるデコーダだよ。
このデコーダ通ったストリームがWAVEファイルみたいな生な音声ファイルになってるからそこに変換フィルタを自作してやればいいよ。

意外と簡単にいけるかもしれん…

155 名前:デフォルトの名無しさん :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のほうの時間がおかしいのですが、
そこをうまく扱えるような方法があったら教えてください。



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

カメラの後に「Smart Tee」繋いで、さらにフレビューピンに繋いだら?

157 名前:155 :2007/01/24(水) 17:57:20
ありがとうございます!
とりあえずそれでやってみます!

158 名前:155 :2007/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みたいな試行錯誤してます。

159 名前:デフォルトの名無しさん :2007/01/24(水) 20:47:14
>>158
previewピンからの出力にはタイムスタンプがつかないのがDirectShowのお約束です。

>いちいちGraphBuilderを解放してまた作るとうまくいくことはいくんですが、
QCAMのフィルタだけDisconnectして取り除いて作り直して挿入して接続するとか。

160 名前:デフォルトの名無しさん :2007/01/24(水) 20:58:38
そうそう。そのタイムスタンプを付けないのがプレビユーピンなんだ。

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

多分自分でスタンプ情報作ってやればよかったと思うけどソースが会社なんだ…
コンブライアンスが厳しい

161 名前:155 :2007/01/24(水) 22:07:33
>>159,>>160
ご返答ありがとうございます。
なるほど。
タイムスタンプが設定されていません。はPreviewPinより下流のFilterが発していたことがわかっていませんでした。(恐らくFileWriter?)
>キャプチャピンに繋いだ方は画像が流れて来なくなる以前に5秒再生してたら5秒間固まる。
まさにそのとおりです。
>多分自分でスタンプ情報作ってやればよかったと思うけどソースが会社なんだ…
>コンブライアンスが厳しい
っということは諦めるかタイムスタンプを自分で打つfilterを作るかでしょうか・・キビシイですね
とりあえず>>159さんの
>QCAMのフィルタだけDisconnectして取り除いて作り直して挿入して接続するとか。
をやってみます。


162 名前:デフォルトの名無しさん :2007/01/24(水) 23:03:55
外で携帯打つと手がかじかんでまともに文入力できてないな俺w
フレビューピン、コンブライアンスワラタ


163 名前:155 :2007/01/25(木) 08:21:37
現在、問題がどういうわけか再現しなくなって直ってしまったので嬉しいような複雑な気分です。
たぶん(としかいえないのがつらいのですが)Qcam10.5をインストールした後に直ったと思われるので、
Qcam側の原因が自動的に解決されたのだろうと解釈しています・・
いろいろと本当にありがとうございました。

164 名前:155 :2007/01/25(木) 08:23:22
>>162
携帯だったのですね
感謝してます

165 名前:162 :2007/01/25(木) 18:45:16
最新のカメラドライバを入れる事でこの問題が解決されるのですね。
どうもありがとう。自分も試してみますm(__)m

166 名前:デフォルトの名無しさん :2007/01/26(金) 20:48:07
DirectSHOWと直接は関係ない質問かと思いますが、教えてください。

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

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

みなさんはどのように画像の加工をしているのでしょうか?
やっぱりオーバーレイとかですか?

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




168 名前:デフォルトの名無しさん :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);

169 名前:デフォルトの名無しさん :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によるデバッグ(?)で確認しましたが、
最後のファイル書き込み部分がつながりません。
なにかヒントをいただけたらよいのですがどうでしょうか・・



170 名前:169 :2007/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);
こんな感じでやっております。

171 名前:169 :2007/02/05(月) 21:45:12
自己レスです。
sinkSetFilter.SetFileName(sinkFileName, null);
にしたらできました。
なんでやろ

172 名前:デフォルトの名無しさん :2007/02/06(火) 19:24:44
DirectShowのフィルタプロジェクトを作成できるアドインか何か、
むかしここかどこかに貼ってあった気がするんだけど、
誰か知りませんか?

173 名前:デフォルトの名無しさん :2007/02/07(水) 12:21:04
>>172
「拡張ストアド プロシージャーDLL」
これで作っちゃだめなの?
自分はいつもこれで作って、
〇「proc.c」を削除
〇「stdafx.c」にStreamヘッダを追加
〇追加インクルード
〇モジュール定義
〇ライブラリ追加
をしていた。これがめんどいです?

174 名前:デフォルトの名無しさん :2007/02/07(水) 13:28:32
>>69
 有り難うございます。
 あちらで聞いた方が良かったですか。でも、今から同種の質問を飛ばすとマルチですし。
やはり、October 2004かsummer 2003ですか。試してみます。

私もVC6やめたいところですが、色々としがらみと要望がありまして。
未だにVC6の需要があるので困ります。

175 名前:174 :2007/02/07(水) 13:30:27
すみません、DirectX初心者質問スレ宛を誤爆しました。

176 名前:デフォルトの名無しさん :2007/02/07(水) 15:53:05
>>173
ありがとうございます。めんどいとかじゃなくて
そのやり方を知りませんでした。
参考になりました。

177 名前:デフォルトの名無しさん :2007/02/07(水) 16:14:12
と思ったけど、2005には拡張ストアド〜がありませんでした。
Sampleを改造することにします。

178 名前:デフォルトの名無しさん :2007/02/07(水) 16:17:44
さがしてみたらここにありましたがVC6用でした。
http://hammer.prohosting.com/~arabo/DirectMediaWz.shtml

179 名前:デフォルトの名無しさん :2007/02/07(水) 19:02:10
え〜2005無料版でもほとんど一緒なのあるよ
ぶっちゃけDLL作るプロジェクトならなんでも可

まぁ結局新規プロジェクトでフィルタ作れるようになってもサンプル改造に落ち着くんだけど

180 名前:デフォルトの名無しさん :2007/02/08(木) 08:58:22
DirectShow使う開発で一番多く使われているプログラム言語ってVC2003かな?
VC6…DirectXサポート切れていて最新の盛り込みできない
VC2005無料版…リソースエディタがないため扱いづらい
VC2005…普及してる?
C#…これ自体存在が微妙
VB…本格的にやるには不向き
他…資料がなさすぎね??


181 名前:デフォルトの名無しさん :2007/02/08(木) 11:44:35
>>180
VC2005無料版はいろいろ難関がありそうだよね。
ただVC2003のプロジェクト(非DirectShow)をコンバートしただけなのに
PlatformSDKのセッティングとか初めてだと面食らう。

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

近いうちにVC2005導入予定だけど、普及の問題は別として開発しやすいのかな?

182 名前:デフォルトの名無しさん :2007/02/09(金) 00:09:39
プログラムからビデオキャプチャを行わせることに挑戦しています。
プレビューで使われる画像サイズやフレームレートをプログラムから
指定する方法は無いでしょうか。

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

IPropertySetStorageで色々設定できるダイアログが表示されるが
これって使う人の立場で考えると
製品によってダイアログが違うので説明が大変だし
変にいじって品質を落としたりする可能性があって嫌なんだが
これしかないのでしょうか。


183 名前:デフォルトの名無しさん :2007/02/09(金) 01:31:30
>>182
自分でカメラの出力pinに対して要求だせばいいよ
MSDNのヘルプみるよろし


184 名前:デフォルトの名無しさん :2007/02/09(金) 02:20:04
>>183
プレビューが
[キャプチャ]->[レンダラ]
という接続なので要求の出し方わかりません


185 名前:183 :2007/02/09(金) 08:20:34
×カメラ
〇キャプチャー

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

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

私はフィルタ内制作ばかりやっているのでフィルタグラフ用の具体的な関数名までわかりませんが、「Free Mail」と言うSNSサイトにくれば過去ログに貴方と同じ質問の回答があります


186 名前:デフォルトの名無しさん :2007/02/09(金) 13:29:55
>>182
IAMStreamConfig

187 名前:デフォルトの名無しさん :2007/02/09(金) 14:00:20
私は流れ設定です

188 名前:デフォルトの名無しさん :2007/02/09(金) 19:51:15
流れ設定ってなんですか?

189 名前:デフォルトの名無しさん :2007/02/10(土) 01:59:59
IAMNewAboutDirectShow


190 名前:デフォルトの名無しさん :2007/02/11(日) 02:17:48
YUVで映像が流れてるとき「IMediaSample」には
どんな形で入ってるんですか?
RGBTRIPLEしか構造体ワカランス(´・ω・`)

191 名前:デフォルトの名無しさん :2007/02/11(日) 23:20:45
YUVにも色々あるわけだが

192 名前:デフォルトの名無しさん :2007/02/12(月) 00:04:10
>>191
はい。IYUV、I420の2つでお願いします。
どちらもU値とV値が四分の一に圧縮されていてMediaSubTypeは違っていても中身は同じフォーマットだと思います。

193 名前:デフォルトの名無しさん :2007/02/12(月) 01:29:29
質問の意味が良くわからないが、IMediaSampleからデータにアクセスするには
IMediaSample::GetPointer(), IMediaSample::GetActualDataLength()というメンバ関数を通してバッファにアクセスできる。
ただし幅や高さなどの情報はAM_MEDIA_TYPEという構造体に収められていて、
これはIMediaSampleからは限定的な用途でしか取得できない。
その用途とはメディアタイプがダイナミックに変化したことをダウンストリームに伝えるという用途である。
そのため、IMediaSampleにはGetMediaTypeという気の利いた名前のメンバ関数があるが、
この関数を通してAM_MEDIA_TYPEが取得できるのはメディアタイプがダイナミックに変化した瞬間だけであり、
取得できるのは変化した後のメディアタイプである。
常に今流れているサンプルのAM_MEDIA_TYPEが取得することはできない。





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

最初にYプレーン
次に縦横がそれぞれ1/2に縮小されたU
次に縦横がそれぞれ1/2に縮小されたV
となっているようです。


195 名前:デフォルトの名無しさん :2007/02/12(月) 06:07:34
MSDNのドキュメントに普通にある

196 名前:デフォルトの名無しさん :2007/02/14(水) 01:56:31
SONYが設備投資を縮小だってね。
なにやってるんだかよくわからんよ。
このままだとVAIO部門も潰されるんじゃないか?
潰されたとしてNECあたりが買い取ってくれるといいけどね。

197 名前:デフォルトの名無しさん :2007/02/14(水) 22:02:18
>>196
誤爆(^ω^)おつ

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

>>194
そう自分もググッたんでそれは大丈夫。IYUVは一画素にYに8bit、UVに2bitの計12bit使うほーまっと

198 名前:デフォルトの名無しさん :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と言ってるだけ。

199 名前:デフォルトの名無しさん :2007/02/14(水) 23:42:16
>>198
ありがとう了解それがわからんかったです。


200 名前:194 :2007/02/15(木) 08:07:41
>>197
なんだよプレーンの意味がわかってないのかよ


201 名前:デフォルトの名無しさん :2007/02/15(木) 08:14:54
うん。ビットマップみたいにピクセル毎に並んでるかと思ってた。


202 名前:デフォルトの名無しさん :2007/02/17(土) 18:32:41
DMOというのでフィルタを既に作ったんだけどさ
これって何かいまいちだね。

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

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

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

データの出力が能動的じゃなくて受動的なのもなんか作りにくいな。
DirectShowって難しい。

203 名前:デフォルトの名無しさん :2007/02/17(土) 18:35:23
DMOだけどさ
カテゴリにオーディオエンコーダってのを指定しているんだけど
接続できるか問い合わせされるときビデオ関係が含まれていやがんの。

別に問題ないけどさ。

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



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

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

プレビューがデフォルトで640x480になって高負荷になり
画像サイズ変更はプレビュー(レンダラ接続)前じゃないと変更できない
という不便さから解放されました。

206 名前:デフォルトの名無しさん :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カメラについてのサンプルプログラムは、いくつか見つかりました。

よろしくお願いします。

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

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

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

スレ違いでしたら、誘導していただけますと助かります。
よろしくお願いします。

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

209 名前:デフォルトの名無しさん :2007/02/25(日) 01:49:42
>>208
お返事ありがとうございます。

livecaptureっていうフリーのすごいソフトありますが、
どうやって複数のネットワークカメラに、対応しているのか疑問でしたが、
メーカーさんが公開しているマニュアルを見て、プログラミングしてるのかもしれないですね。
通信の仕方をメーカーさんが、公開してないとだめなんですね。ふむふむ。。

210 名前:デフォルトの名無しさん :2007/02/25(日) 14:22:29
専用のカメラを使ってるね。その手のカメラは買えば当然遠隔操作のコマンドとかマニュアルが付いてくるはず。



211 名前:デフォルトの名無しさん :2007/02/26(月) 10:33:36
>>210
>当然遠隔操作のコマンド
付いてくるけど画像ストリームの仕様は無いのよ
とりあえずメーカーに問い合わせてみる


212 名前:デフォルトの名無しさん :2007/02/26(月) 18:16:38
っ自分で解析

213 名前:デフォルトの名無しさん :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個あるタイプ)もヘッダに見つかりません。

これはカスタムで書くしかないんでしょうか。

214 名前:デフォルトの名無しさん :2007/02/27(火) 13:54:19
IKsPropertyとかなんかそんな名前のインタフェイスで出来ると思う。

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

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

〜これから学ぶべきと思うこと〜
C++、COM、自作フィルタの作成と登録の方法

216 名前:デフォルトの名無しさん :2007/03/01(木) 07:21:37
俺も似たような事やってる…
概念理解が勉強の中心になると思う。ガンガレ〜

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

基本はBMP画像のぱらぱら漫画を加工する事になりますので。

217 名前:215 :2007/03/01(木) 14:07:11
>>216
ありがとうございます。
BMPについてはWin32APIでいじり倒してきたのでいけると思います。
DirectShowについてはその仕様と情報の少なさに辟易していますが、
地道にがんばろうと思います。

218 名前:デフォルトの名無しさん :2007/03/01(木) 17:23:44
>>215
学ぶべきことがわかってるのはすばらしい!

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

「これで動くけど、なんでだろー?」って形で勉強するといいかも。

219 名前:デフォルトの名無しさん :2007/03/01(木) 21:52:11
簡単なサンプル作ってあげよか?インプレイスフィルタとトランスフォームどっちの変換フィルタ使ったらいいか調べるだけでも最初は一苦労だろ

220 名前:デフォルトの名無しさん :2007/03/01(木) 22:30:27
SDKのサンプルが一番いいよ

221 名前:デフォルトの名無しさん :2007/03/01(木) 22:44:15
そりゃサンプルで自分も勉強したけど、映像の処理なら「コントラスト」、「RGB」この2つから入ると思う。
この2つを最初にみたとき何が最低限実装が必要なメソッドかわからんかった。
そんな意味でのもっとシンプルなサンプル

222 名前:215 :2007/03/01(木) 23:19:46
>>218
ありがとうございます。
そうすることにします。
>>219
助かります!
是非お願いします!

223 名前:デフォルトの名無しさん :2007/03/02(金) 00:06:52
>>222
ひとまず、君の使ってる環境を教えてくれ。
自分はVC6+DX8SDK、VC2003+DX9(オウガスト)
の2つの環境でやっとる

224 名前:215 :2007/03/02(金) 00:12:39
>>223
了解です。
VC++2005Express + PlatformSDK + DirectX SDK (June 2006)

225 名前:デフォルトの名無しさん :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

226 名前:デフォルトの名無しさん :2007/03/02(金) 02:37:07
>>255
わかったよ。確かにそれみりゃわかるね。
甘やかすのは無用。勉強させろと無言のプレッシャーを感じる…。

227 名前:215 :2007/03/02(金) 03:03:29
>>225
二つ目のサイト以外は既に目を通したものばかりですが、それでも難しいと思いました。
キャプチャの出力解像度を変えることすらできませんでした・・・。
とりあえずC++から地道にべんきょーします。

228 名前:デフォルトの名無しさん :2007/03/02(金) 04:17:44
あとアセンブラの知識が必要になることもあるな

229 名前:デフォルトの名無しさん :2007/03/02(金) 08:49:03
マジすか?アセンブラワカンネ。
そしてここはsage進行なんですね。マイナーだからageてました

230 名前:デフォルトの名無しさん :2007/03/02(金) 08:53:36
DirectShowの本見ると「この本はC++を3年以上やってる方を対象に書いてます」みたいな事が書いてありますね。
C++経験者でないときついのか。

231 名前:デフォルトの名無しさん :2007/03/02(金) 15:09:51
>>227
入門や概説を一通り読んだら、リファレンスを全部読むのを薦めます。

232 名前:213 :2007/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のえらーコードが返ります。

233 名前:デフォルトの名無しさん :2007/03/02(金) 21:25:17
DirectShowは最初わかんないことだらけだったな。
今でもわかんないこと多いけど。
サンプルと手助けがないとつらいね。

234 名前:デフォルトの名無しさん :2007/03/02(金) 22:02:35
>>232
勘で書いてるんだけど、IKsTopologyInfo:, CreateNodeInstanceでノードを作って、
ノードの方から IKsProperty を QueryInterface で取得して、IKsPropertySet::Setで
プロパティをセットするんじゃないだろうか。


235 名前:デフォルトの名無しさん :2007/03/02(金) 23:55:00
>>233
DirectShowは設計がマズイと思う。
フィルタグラフマネージャは自前でスレッドをもってユーザスレッドストリームスレッドとの切り離しをすべきだ。
いつの間にかメインスレッドから呼び出されていたりしてデッドロックとか多い。



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

237 名前:215 :2007/03/03(土) 23:03:00
>>231
ありがとうございます。
そうしてみます。

C++の入門書を一通り読みましたが、新しいことがいっぱいで疲れました・・・。
次はMSDNのリファレンスを読みます。
早くキャプチャソフト作りたいです。

238 名前:デフォルトの名無しさん :2007/03/04(日) 00:56:51
>>234
切り離すモードと切り離さないモードがある。

239 名前:213 :2007/03/05(月) 22:24:32
>>234
DDKやPlatformSDKの情報からみて、まさに指摘されてるようなことなんじゃないかと
思って試してみてますが、IKsTopologyInfo::CreateNodeInstance自体がエラーになるんですよね。

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

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

自分のやり方が間違ってるかもとも思うんで、しばらく頭を冷やしてもう一度
試してみるつもりです。

240 名前:デフォルトの名無しさん :2007/03/05(月) 22:27:24
現在、キャプチャカードからのプレビューをモニタするソフトを作っておりまして、
キャプチャ(640×480出力)→ビデオレンダラ
というふうに繋いでいます。
ビデオレンダラでフルスクリーンにすると、4:3のアスペクト比を守りながら拡大してくれるのは
うれしいのですが、16:9ソースの表示にも対応するために、フルスクリーンの状態で
16:9にしたいです。
しかし、どうしてもできません。
描画されるビデオウィンドウはウィンドウズアプリのメインウィンドウに貼り付けているカタチです。
ソースは640×480を保ったまま、16:9にリサイズしてフルスクリーンにしたいです。
ご助言、よろしくお願いします。

241 名前:デフォルトの名無しさん :2007/03/05(月) 22:40:46
>>240
ビデオレンダラーから(フィルタグラフからでもいいのか?)
IVMRAspectRatioControl、IVMRAspectRatioControl9 や IVMRWindowlessControl を取得して、
SetAspectRatioModeでアスペクトレシオを無視するようにする。

レンダラのサイズは自前で16:9にしておく。

242 名前:デフォルトの名無しさん :2007/03/05(月) 22:57:06
変換フィルタを作成しているのですが、再生中にいきなりビデオのサイズが変わるような場合に、
再接続することなく対応したいのですが、レンダラへ新しい縦横サイズは教えてやれたのですが、
バッファサイズを変更できませんでした。
マニュアルには現在より大きなバッファサイズが必要な場合は、ReceiveConnectionを使えとありますが、
フィルタのどこにどのようなコードを追加すればよいのか分かりません。
デタラメな文章ですが、アドバイスありますでしょうか。。

243 名前:240 :2007/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」ボタンを押すことと等価な処理としては何が考えられるでしょうか?

244 名前:240 :2007/03/06(火) 01:37:56
ttp://msdn.microsoft.com/library/ja/directx9_c/directx/htm/usingwindowlessmodewiththevmr.asp?frame=true
ここのウィンドウレスモードの説明を見ていると、こちらのほうが良さそうですし、なんとか
ウィンドウレスモードで動くようにしてみます。

245 名前:デフォルトの名無しさん :2007/03/06(火) 15:01:49
>>243
古来より DirectShow でフルスクリーン再生をする際には、
レンダラをフルスクリーンモードにするのではなく
単に全画面のウィンドウで再生する方が好しということになっています。
後者はそれでしょう。

246 名前:240 :2007/03/06(火) 16:27:28
ウィンドウレスモードで解決しました!

>>245
なるほど、そういうことですか。

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

これに問題がありまして、この切り替えを8回繰り返す(4順する)と必ず画面が最後のフレームを
表示したまま固まってしまいます。
考えられる原因や対処法がありましたら、ご教授お願いします。

248 名前:デフォルトの名無しさん :2007/03/08(木) 02:22:27
どこがデッドロックしているか調べるといい

249 名前:213 :2007/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)で指定しないと駄目な模様です。

250 名前:247 :2007/03/08(木) 17:52:00
解決しました!
原因は二つ目のキャプチャデバイスをRenderStream()するときのみ、間に色空間変換フィルタが
挿入され、キャプチャフィルタを削除したときに色空間変換フィルタ、VMR9間のピンが持つ
アロケータにバッファがどんどん蓄積されていくためだったようです。
デバイスを切り替える度、VMR9との接続を切るようにすると、うまく動作するようになりました。


■過去ログ置き場に戻る■ 1- 次250 最新50
DAT2HTML 0.33f Converted.