DirectShowと戦うスレ Part 2

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
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入ってたり入ってなかったりするし。
1610: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でマネージされてくれるわけでもないし
じゃあ結局どの辺にご利益があるのかなあ
と言うことだとエスパー
5352: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のレンダラに絵を表示させる仕事をさせたいわけ?
できなくはないが簡単にはできない。
8179: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
を真似しました。
9693: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の総フレーム数は一致しているだろうか。
また、それぞれのフレームレートはどうなっているのかな?
その辺の具体的な数値があった方が状況を確認しやすいと思う。
11098:2006/12/12(火) 10:44:27
GraphEditでは
WMVファイル →WMAudioDecoderDMO          →AVIMux →FileWriter
       →WMVideoDecoderDMO →AVIDecompresser→
となっています

変換結果は
フレームレートは両方30fpsなのですが、
出力されたAVIのフレーム数は1723です(WMVのほうは調べ方がちょっとわからなかったです)
再生時間がWMV時点で28.7秒でAVIにすると57.4秒で丁度綺麗に2倍になる感じです
フレームの持続時間のほうはフレームレートの調整程度しか意識していませんでしたので
また少し自分でも調べてみようと思います。
11198: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;
11298: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 ファイルは
出来ないということも理解する必要があります。

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

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

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

やはりちょっとヘッダー部などをいじった程度だと無理でしたか
Directshowのフィルターがその辺の処理をやってくれるのではないかと
甘く見ていました
11598:2006/12/12(火) 13:17:20
あと、AVIDecompressorのあとにビデオレンダラにつなげるとその時点では
まともに再生されるのですが、AVIMuxでファイル保存できるようにするときに
タイムスタンプが抜かれてしまうのでしょうか?
116デフォルトの名無しさん:2006/12/12(火) 16:42:29
>>115
AVI 形式のファイルは、メディアフォーマットで指定された同一持続時間の
サンプルがずらーっと並ぶだけというようなフォーマット。
なので正しいフレームレートでかつ1フレームの欠落もないデータじゃないと
正常に再生できない。

変換元ファイルを走査して、真のフレームレートを計算してWMV側で落ちている
フレームも捏造して自分でmuxするとかやり方はあるような気がするけれども、
絵と音がずれないAVIファイルを作るのはとても難しいです。
11798: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
変換を自作したがいちピクセル単位でやると遅くてつかいものにならんかったよ。
そこで私は
趣味→オーブンしーぶい(ただだけど配布できない)仕事→あいぴーぴー(よっしゃでかえるレベル)
を使った。一個関数呼ぶだけだった
126122:2006/12/28(木) 02:18:06
>>123
変換式は見つかりました。でもSSE命令とか使いたいところです。
アセンブラ画像処理プログラミング って本買ってきたので頑張ります

>>125
OpenCVやIPPの場合、どんな関数使えばいいですか?
正にIplImageが欲しいです
127122: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ライセンスってことですが
128122:2006/12/28(木) 02:57:28
IPPの関数は見つかりました。しかしOpenCVのcvHoughLines2が使いたいので
OpenCVで変換する関数を是非教えて下さい
129122:2006/12/28(木) 09:22:06
>>123
アドバイスありがとうございます。
ソースフィルタはFile Source(Async)です。
とりあえず、空の変換フィルタ(CTransformFilter)を作成し、
ソース→空フィルタと接続して解析しようと思ったのですが、
「同じトランスポートをサポートしていない為、ピンを接続できません。0x80040266」
というエラーが起こり、接続することすらできません…
130121: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デコーダに渡す。
フィルタ作ったことが無いなら相当大変だよ。

152149: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」繋いで、さらにフレビューピンに繋いだら?
157155:2007/01/24(水) 17:57:20
ありがとうございます!
とりあえずそれでやってみます!
158155: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がタイムスタンプを初期化してないからだと思う。

多分自分でスタンプ情報作ってやればよかったと思うけどソースが会社なんだ…
コンブライアンスが厳しい
161155: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
フレビューピン、コンブライアンスワラタ
163155:2007/01/25(木) 08:21:37
現在、問題がどういうわけか再現しなくなって直ってしまったので嬉しいような複雑な気分です。
たぶん(としかいえないのがつらいのですが)Qcam10.5をインストールした後に直ったと思われるので、
Qcam側の原因が自動的に解決されたのだろうと解釈しています・・
いろいろと本当にありがとうございました。
164155:2007/01/25(木) 08:23:22
>>162
携帯だったのですね
感謝してます
165162: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によるデバッグ(?)で確認しましたが、
最後のファイル書き込み部分がつながりません。
なにかヒントをいただけたらよいのですがどうでしょうか・・

170169: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);
こんな感じでやっております。
171169: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の需要があるので困ります。
175174: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
プレビューが
[キャプチャ]->[レンダラ]
という接続なので要求の出し方わかりません
185183: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
ありがとう了解それがわからんかったです。
200194: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画像のぱらぱら漫画を加工する事になりますので。
217215: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つを最初にみたとき何が最低限実装が必要なメソッドかわからんかった。
そんな意味でのもっとシンプルなサンプル
222215:2007/03/01(木) 23:19:46
>>218
ありがとうございます。
そうすることにします。
>>219
助かります!
是非お願いします!
223デフォルトの名無しさん:2007/03/02(金) 00:06:52
>>222
ひとまず、君の使ってる環境を教えてくれ。
自分はVC6+DX8SDK、VC2003+DX9(オウガスト)
の2つの環境でやっとる
224215:2007/03/02(金) 00:12:39
>>223
了解です。
VC++2005Express + PlatformSDK + DirectX SDK (June 2006)
225デフォルトの名無しさん:2007/03/02(金) 00:25:29
226デフォルトの名無しさん:2007/03/02(金) 02:37:07
>>255
わかったよ。確かにそれみりゃわかるね。
甘やかすのは無用。勉強させろと無言のプレッシャーを感じる…。
227215: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
入門や概説を一通り読んだら、リファレンスを全部読むのを薦めます。
232213: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内で別スレッド立ててアロケータ確保すると
うまくやらないとアボーンする。。
237215:2007/03/03(土) 23:03:00
>>231
ありがとうございます。
そうしてみます。

C++の入門書を一通り読みましたが、新しいことがいっぱいで疲れました・・・。
次はMSDNのリファレンスを読みます。
早くキャプチャソフト作りたいです。
238デフォルトの名無しさん:2007/03/04(日) 00:56:51
>>234
切り離すモードと切り離さないモードがある。
239213: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を使えとありますが、
フィルタのどこにどのようなコードを追加すればよいのか分かりません。
デタラメな文章ですが、アドバイスありますでしょうか。。
243240: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」ボタンを押すことと等価な処理としては何が考えられるでしょうか?
244240: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 でフルスクリーン再生をする際には、
レンダラをフルスクリーンモードにするのではなく
単に全画面のウィンドウで再生する方が好しということになっています。
後者はそれでしょう。
246240: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
どこがデッドロックしているか調べるといい
249213: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)で指定しないと駄目な模様です。
250247:2007/03/08(木) 17:52:00
解決しました!
原因は二つ目のキャプチャデバイスをRenderStream()するときのみ、間に色空間変換フィルタが
挿入され、キャプチャフィルタを削除したときに色空間変換フィルタ、VMR9間のピンが持つ
アロケータにバッファがどんどん蓄積されていくためだったようです。
デバイスを切り替える度、VMR9との接続を切るようにすると、うまく動作するようになりました。
251デフォルトの名無しさん: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
252デフォルトの名無しさん:2007/03/09(金) 02:40:17
baseclasses.sln をダブルクリックして開いてビルドを実行するだけだろ。
253251:2007/03/09(金) 03:08:44
>>252
いえ、最近になって.slnや.dswのファイルが付属しなくなりまして、makefileがついているんです。
それで
ttp://www.shader.jp/xoops/html/modules/xfsection/article.php?articleid=17
このページと同じように進めてもcl.exeが見つからないようなことを示すエラーが出て、
それじゃあとcl.exeのあるフォルダを環境変数のPathに設定してやると今度はmspdb80.dllが
見つからないと言われて失敗します。
254デフォルトの名無しさん:2007/03/09(金) 04:01:11
さすがマイクロソフト
255デフォルトの名無しさん:2007/03/09(金) 04:16:23
俺の所の 2006 9月版には、baseclasses.slnがあるけどな。
お前の最近は2年前か?
256251:2007/03/09(金) 04:29:10
>>255
え!?そうなんですか!?
ttp://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en
ここのPSDK-x86.exeをダウンロードしてインストールしたのですが、違うのでしょうか?
>>255さんの入手経路を教えてください。
257デフォルトの名無しさん:2007/03/09(金) 05:18:47
258251:2007/03/09(金) 07:07:13
できました!!
ttp://ugd555.blog1.fc2.com/page-13.html
同じ症状を解決した方のページを見つけました。
最終的に別のフォルダから5つファイルを持ってこなければいけませんでした。
この問題に18時間費やしました・・・
259251:2007/03/09(金) 09:44:34
早速、いろいろなフィルタサンプルのビルドを試してみましたが、どれもPC内に存在しない
ライブラリファイルが無い、と言われどうしようもありません。
そういえば、VC2005EEでDirectShowフィルタを開発したという話を聞いたことがありません。
ちゃんとしたVCを買え、ということでFAでしょうか?
もしそうなら、観念して買いに行きます・・・
260デフォルトの名無しさん:2007/03/09(金) 09:45:26
EEどうかは関係ない気がする、2005だといろいろ不便
261デフォルトの名無しさん:2007/03/09(金) 16:37:13
いい加減最新のSDKダウンロードしろ。うざい。
262デフォルトの名無しさん:2007/03/09(金) 16:42:53
>>259
初心者スレにでも行け
DirectShowスレで語るべき内容ではないだろ
263デフォルトの名無しさん:2007/03/10(土) 01:13:37
どんな内容なら語ってもいいのですか?玄人の>>262さん。
264デフォルトの名無しさん:2007/03/10(土) 02:25:22
>>251>>263みたいな質問以外ですな
265デフォルトの名無しさん:2007/03/10(土) 05:35:57
キャプチャフィルタ→変換フィルタ→色空間変換フィルタ→VMR9
という構成の中の変換フィルタで、キャプチャフィルタからサンプルが1枚くる度に
サンプルに対し処理Aを実行→出力→表示
サンプルに対し処理Bを実行→出力→表示
というように2回の処理、出力を行いたい(フレームレートを倍化したい)のですが、
どうすればよいでしょうか?
なお、キャプチャ出力のフレームレートは上限に設定しています。
タイムスタンプをいじるだけではうまくいきませんでした。
IMemInputPin::Receiveを使うにしても、それを呼び出す頻度をどのようにすれば
合わせられるかが分からずできません。
266デフォルトの名無しさん:2007/03/10(土) 07:16:47
出力ピンのメディアタイプのレートを2倍に設定して、サンプルを1つ受け取ったら2つ出力すればいいのでは
267デフォルトの名無しさん:2007/03/10(土) 11:46:39
タイムスタンプは修正してやらないと駄目だろう。
仮にキャプチャフィルタが30f/secで投げてくるなら0.033...秒間隔のスタンプが設定されているだろうから
自分でつくる変換フィルタは2枚目に0.033.../2秒のタイムスタンプを足して設定してやる。
んで自分が出力ピンからDeliverするときに、自分で送りたい2枚分、下段の入力ピンReceiveを呼ぶ。
2回送信完了してから、上段にDeliverの結果を返す。
268デフォルトの名無しさん:2007/03/10(土) 17:49:27
http://pc11.2ch.net/test/read.cgi/tech/1168354839/
の658です。
たぶんこっちで質問したほうがいい気がしたので。

何度やっても同じところ(CopyMemory)で落ちます。
原因として思い当たる件があったらご教示願います。
269デフォルトの名無しさん:2007/03/10(土) 18:11:41
サイズチェックくらいしろ。
24bit以上のソースなら、BITMAPINFOHEADERだな。
270268:2007/03/10(土) 18:21:52
>>269
つまり、サイズが足りないということでしょうか?
271268:2007/03/10(土) 19:24:59
サンプルファイルを出力したところ、24bitであることは確認しました。
どこが悪いんでしょう?
272デフォルトの名無しさん:2007/03/10(土) 19:32:55
>>268

これか、
CopyMemory( &BitmapInfo.bmiHeader, &(pVideoHeader->bmiHeader), 
                sizeof(BITMAPINFOHEADER));

探すの面倒だから直リンして欲しいな。
http://pc11.2ch.net/test/read.cgi/tech/1168354839/658

コピー先と、コピーするサイズとか確認してみれば。

&BitmapInfo.bmiHeader が有効なメモリを指してる?
&(pVideoHeader->bmiHeader) が有効なメモリを指してる?
sizeof(BITMAPINFOHEADER) これはあっていると思うけどさ。
273268:2007/03/10(土) 19:37:59
&BitmapInfo.bmiHeader:1000E380
&(pVideoHeader->bmiHeader):30
むう?
274268:2007/03/10(土) 19:41:33
Bitmapinfoをローカルにすると
&BitmapInfo.bmiHeader:12F044
&(pVideoHeader->bmiHeader):30
&BitmapInfo.bmiHeaderが怪しいですね。
275268:2007/03/10(土) 19:42:42
で、怪しいのはわかったんですが対処方法がわかりませんorz
276デフォルトの名無しさん:2007/03/10(土) 19:49:11
何かおかしいときはリビルドすると直ったりするんだよ
277デフォルトの名無しさん:2007/03/10(土) 19:50:18
ヘッダに書いただけで動かなくなるとは思えないしさ!
278デフォルトの名無しさん:2007/03/10(土) 19:51:15
>>276
もう8回くらいリビルドしてますorz
手動でbmiHeaderを初期化したりしてもダメでした。
279デフォルトの名無しさん:2007/03/10(土) 20:06:49
初心者スレに戻りなはれ
280268:2007/03/10(土) 20:09:10
そうします。orz
281265:2007/03/10(土) 23:31:42
>>266
その方法を試すために、まず出力ピンのメディアタイプを取得しようとしたのですが、
原因不明のエラーが出ます。
何がまずいのでしょうか?

HRESULT (作成した変換フィルタクラス名)::Transform( IMediaSample *pIn , IMediaSample *pOut ){
    
    ・・・

    //出力ピンのメディアタイプを探す
    IEnumPins *pEnumPins;
    IPin *pPin;
    PIN_DIRECTION PinDirThis;
    AM_MEDIA_TYPE *pmt;

    this->EnumPins( &pEnumPins );
    pEnumPins->Reset();
    while( pEnumPins->Next( 1 , &pPin , NULL ) == S_OK ){
        pPin->QueryDirection( &PinDirThis );
        if ( PinDirThis == PINDIR_OUTPUT ){
            pPin->ConnectionMediaType( pmt ); ←定義されてないのに使ってるというようなエラー
        }
    }
    DeleteMediaType( pmt ); ←上と同じエラー

    ・・・

}
282265:2007/03/10(土) 23:36:19
>>267
タイムスタンプ修正は行えるのですが、下段の入力ピンのIMemInputPin::Receiveを
どのようにすれば呼び出せるのかが分かりません。
>>281で示したようなコードでIPinクラスは取得できるのですが、
ttp://msdn.microsoft.com/library/ja/jpdx8_c/ds/ref/class/CBaseInputPin.asp?frame=true#CBaseInputPin
ここを見ると、IMemInputPinはIPinの子クラスなので、それに実装されているReceiveメンバに
アクセスできません。
ご教授願います。
283デフォルトの名無しさん:2007/03/11(日) 00:38:34
トランスフォームフィルタのソースがベースクラスとして公開されてるんだから勉強するといいよ
CTransformFilter、CTransformInputPin、CTransformOutputPinね
入力サンプルがどう入ってきてどこで変換してどうやって出て行くのか
更にしたのベースクラスの知識も必要になるだろうけどさ

既に下段に接続してる相手のメディアタイプが欲しいなら
出力ピンのCurrentMediaTypeでいいだろ
284デフォルトの名無しさん:2007/03/11(日) 01:14:56
>>282
m_pOutput->Deliver するだけでOK
285265:2007/03/11(日) 03:49:55
>>283
ありがとうございます。
m_pOutput->CurrentMediaTypeでメディアタイプを取得し、pbFormat(VIDEOINFOHEADER)内の
AvgTimePerFrameを変更してやることでフレームレートの変更を試みてみました。
しかし、今まで通りの10000000/29.97[100ns]であれば下流のフィルタ(色空間変換フィルタ)に
繋がるのですが、倍の10000000/59.94[100ns]では接続できませんでした。
残念ながら対応していないようです。
286265:2007/03/11(日) 03:50:22
>>284
ありがとうございます。
一枚のサンプルに対し二度出力できるようになりました。
しかし、fpsがきれいに倍化する期間と倍にならない期間が移り変わってうなりのようになっています。
二度の出力中、一枚目のスタートと二枚目のエンドのタイムスタンプはいじっていないので、
そこでの同期は保障されていると思ったのですが・・・
どのようにすれば改善できるでしょうか?
一枚のサンプルに対して行う処理を以下に示しておきます。

//一枚目の処理
・・・
// 入力サンプルのタイムスタンプを取得する
pIn->GetTime( &TimeStart , &TimeEnd );
//エンドタイムを1/59.94[s]早める
TimeEnd -= 166833; //[100ns]
pOut->SetTime( &TimeStart , &TimeEnd );
//下流フィルタにDeliverする
m_pOutput->Deliver( pOut );

//二枚目の処理
・・・
// 入力サンプルのタイムスタンプを取得する
pIn->GetTime( &TimeStart , &TimeEnd );
//スタートタイムを1/59.94[s]遅くする
TimeStart += 166833;//[100ns]
pOut->SetTime( &TimeStart , &TimeEnd );
//下流フィルタにDeliverする
m_pOutput->Deliver( pOut );
287デフォルトの名無しさん:2007/03/11(日) 05:56:40
>>266 でも書かれているが、GetMediaType時にAvgTimePerFrameの時間を半分にして接続を完了させればいいんでね?

部分的コードなのでわからないが、サンプル使いまわしたりはしていないよね?
288265:2007/03/11(日) 09:37:13
>>287
試しに
AvgTimePerFrame /= 2;
としてみましたが、やはり受け付けませんでした。
AvgTimePerFrame /= 1;
だったら大丈夫です。
>サンプル使いまわしたりはしていないよね?
他の方が作られたサンプルを使いまわししてます。
ですが、Transformメソッドをいじるだけくらいのシンプルな変換フィルタでして、その処理部分に関しては
すべて書き換えています。
289デフォルトの名無しさん:2007/03/11(日) 11:18:23
タイムスタンプの変更は問題ないです。EndTimeが0で来る場合もあるのでチェックして下さい。

> Transformメソッドをいじるだけくらい
CTransformFilter::Receive内でもDeliverしてるからな。その辺り大丈夫だよね?

文面から察するに
OutputPin::CurrentMediaTypeでメディアタイプ取得できるってことはピンが繋がっている状態なのだが
一旦Pin接続解除した後にフレームレート倍のメディアタイプを色変換に提示(OutputPin::GetMediaTypeで設定)して
再接続を試みてるんだよね?
290265:2007/03/11(日) 11:56:35
>>289
>EndTimeが0で来る場合もあるのでチェックして下さい。
チェックしてみましたが、EndTimeが0で来る様子は見られませんでした。
>CTransformFilter::Receive内でもDeliverしてるからな。その辺り大丈夫だよね?
どうなんでしょう・・・影響があるかは判断しかねます・・・
メディアタイプ変更の件ですが、グラフエディタ上で接続が断たれた状態からピンを繋ごうとしたとき、
キャプチャフィルタのメディアタイプから変更しなかった場合は成功し、変更すると失敗する、というかんじです。

フレームレートの不安定ですが、もしかしたら処理負荷が大きいためかもしれません。
表示ウィンドウのサイズを大きくする(ネイティブサイズは同じ)とフレームレートが落ちていきます。
CPUの使用率は60〜70%ですが、VMR9側の問題でこのようなことになっているのかもしれません。

この負荷の原因として、変換フィルタとVMR9との間に挟まっている色空間変換フィルタが挙げられます。
キャプチャフィルタから直接VMR9に繋ぐときは介在せず、CPU負荷も小さいです。
ところが、同じメディアタイプを設定しているにも関わらず、変換フィルタを挟むと、その後に色空間変換フィルタ入ってきます。
キャプチャから直接VMR9の場合はシステムメモリは介さず、直接ビデオRAMに移す、というようなことでもしているから
こんなことになるのでしょうか?
もし変換フィルタから直接VMR9に繋げられるような方法がありましたら教えてください。
291268:2007/03/11(日) 16:50:34
別のソースを元にいろいろいじってたんですよ。
(そっちのソースはCopyMemoryで落ちないので)
で、そっちのBitmapInfoのbmiHeaderを調べてみたところ、他の値は想定の範囲内なんですが
BitmapInfo.bmiHeader.biCompression = 1685288548
とdでもない値が入っていて、どうやらこいつが原因だと判明。

これって何なんでしょ?
ぐぐったらdvsdとか出てきたんですがよくわかりません。
292268:2007/03/11(日) 16:54:12
ちなみに
BitmapInfo.bmiHeader.biCompression=BI_RGB;
なんてことをやると一応動くようにはなりました。
ただ取得できる値がおかしいので正確に動いてる感じではありませんが。
293268:2007/03/11(日) 17:04:27
取得部分は以下のような感じです。
void Cam::getImage()
{
HRESULT hr;

// ビットマップ ヘッダーから DIB を作成し、バッファへのポインタを獲得する。
hBitmap = CreateDIBSection(0, &BitmapInfo, DIB_RGB_COLORS, (void **)&buffer, NULL, 0);
firstDIB = FALSE;

// イメージをバッファにコピーする。
DIBBuffer = (long *)GlobalAlloc(GPTR,bufsize);

hr = pGrab->GetCurrentBuffer(DIBBuffer,NULL);

hr = pGrab->GetCurrentBuffer(DIBBuffer,(long *)buffer);

}

AVIを無理やりBITMAPにしているから無理が生じているような予感がちらほら。
294デフォルトの名無しさん:2007/03/11(日) 18:34:30
帰れといっただろ
295デフォルトの名無しさん:2007/03/11(日) 18:42:48
>>290
レンダラに直接接続したければ、すべてのフォーマットを出力で対応する必要がある。
まあでも32bitでだいたいの環境はいける。

接続できなければレンダラが対応していないのだろう。正しい接続の仕方ならばね・・・。
296268:2007/03/11(日) 20:31:37
>>294
向こうで聞くべき質問じゃないと思ったので・・・。orz
297デフォルトの名無しさん:2007/03/11(日) 20:32:01
FilterのサンプルにNullInplaceフィルタってのがあるんだけどさ
それをキャプチャデバイスとレンダラの間に入れてみてくれ。
やっぱり色空間変換フィルタが必要とされるか?されないか?
298デフォルトの名無しさん:2007/03/11(日) 20:35:02
dvsdはDVのSD形式。それがわかんねーなら帰れw
299265:2007/03/11(日) 21:09:48
>>297
自前のWindowsSDKにないのでDirectXのExtrasをダウンロードし、その中からNullInplaceフィルタを見つけたのですが、
ビルドすると、PC内に存在しないatlbase.hが無いと言われてしまいます。
無念です・・・
300デフォルトの名無しさん:2007/03/11(日) 21:44:59
> >CTransformFilter::Receive内でもDeliverしてるからな。その辺り大丈夫だよね?
> どうなんでしょう・・・影響があるかは判断しかねます・・・

どう実装してるかわからんけど、もしかしてTransformメソッドの中で2回Deliverしてる?
CTransformFilter::Receive良く読んで理解してるよね?
301デフォルトの名無しさん:2007/03/12(月) 08:02:05
俺もフレームレート変換フィルタを作って断念した者ですが、
上流フィルタからの映像が来る来ないに関わらず非同期でフレームレートを作るフィルタが出来なかったんだよな。
今悩んでいる子がここまでやるのなら全力でサポートするよ
302デフォルトの名無しさん:2007/03/12(月) 08:04:43
最近変換フィルタの話題がちょくちょく出ててうれしい。
303265:2007/03/12(月) 08:07:00
>>300
そうです、Transformメソッドの中で2回Deliverしてます。
サンプルの流れがいまいち理解できないです。
そこで今行っている処理の流れを分かる範囲でまとめてみました。

[キャプチャフィルタ]-[変換フィルタ(自作)]-[色空間変換フィルタ]-[VMR9]

[色空間変換フィルタ]の入力ピンからの[変換フィルタ]への呼び出し
CTransformFilter::Receive (CTransformFilter::InitializeOutputSampleを呼び出す)
 ↓
CTransformFilter::InitializeOutputSample (新しいサンプルを[キャプチャフィルタ]の出力ピンから取得する)
 ↓
CTransformFilter::Transform
  (サンプルの処理)
   ↓
  CBaseOutputPin::Deliver (IMemInputPin::Receiveを呼び出す) ←これを>>286のように2回呼び出しています
   ↓
  IMemInputPin::Receive ([変換フィルタ]の出力サンプルを取得する)
   ↓
  [色空間変換フィルタ]での処理
   ↓
  [VMR9]が付与されたタイムスタンプに従って画面に表示

疑問点
>>289さんの言う、CTransformFilter::Receive内でもDeliverしている、という記述がMSDNで見つけられませんでした。
 上記で言えばどの時点で発生するのでしょうか?
・最初のCTransformFilter::Receiveが呼び出されるタイミングが分かりません。
 サンプルが変換フィルタで処理されるサイクルはどのようになっているのでしょうか?
304265:2007/03/12(月) 10:06:54
この問題に関していろいろと試してみた結果を書いておきます。

・タイムスタンプがないプレビューピンからの映像に対して変換を行ったところ、同じうなり現象(>>284)が起きた。
・一枚のサンプルに対して二度の処理を行うが、片方の絵を真っ黒にしてみると、フレームが倍化していないときは
二枚目の絵のみが表示される状態であることが分かった。
・二度目のDeliverを外したところ、フレーム倍化の時間が若干延び、倍化していない期間においても
一枚目の絵と二枚目の絵が交互に表示された。
このとき、キャプチャーピンからの映像では倍化していない期間で絵が0.5秒ほどストップすることが頻繁に起こった。
プレビューピンからの映像ではこのストップ現象は起きない。
305265:2007/03/12(月) 10:08:49
すみません、
>>284じゃなくて>>286です。
306268:2007/03/12(月) 13:35:12
>>298
SD形式はいいんですが、これって普通にBITMAPINMFO構造体として取り出せないんでしょうか?
307265:2007/03/12(月) 17:31:09
特定の場合についてのみですが、フレームレートの倍化(30fps→60fps)ができました。
(同時にこの手法のダメさを裏付けるものでもありましたが・・・)
条件は
・キャプチャフィルタのプレビューピンに繋げる(よってタイムスタンプの設定は意味なし)
・二度目のDeliverを無くす(あるともたつきが起こる)
・画面表示をビデオのネイティブサイズである640×480に対し、約2倍以上にするとフレームレートのうなり現象が
無くなり約60fpsで一定となる。
このとき、CPUの使用率はサイズが大きくなるにつれて上がる。

これらの現象から導き出される結論として、
一度目のDeliverと二度目の(本来行われる)Deliverは連続ですぐに行われ、二度目のDeliverにより送信された
二枚目は一枚目で設定したタイムスタンプがあろうが無かろうが即座に描画される。
CPUの負荷が上がり、すぐに二度目のDeliverが処理できない場合、その間一枚目が表示されることとなり、この時間が
ちょうど1/60秒となるときキレイにフレームが倍化されることとなる。
描画サイズが小さいときはCPUに余裕がある期間が存在し、そのときは二枚目のみが表示される。(フレームが倍化されない)
ということが言えると思います。

よって、一度のTransformメソッドで二度のDeliverを用いる作戦はアウトということになりました・・・。
308デフォルトの名無しさん:2007/03/12(月) 18:47:41
何度も書かれているけど、接続状態がその倍のレートでないと、レンダラはそのfpsで処理してくれないと思うよ。つまり余計に送られてきたサンプルは捨てる。
出力メディアタイプと違うサンプルを出力しても、期待した通りに動かないよね。
あと処理が間に合わない時も、どこかのフィルタが捨てると思う。

一度CPU負荷がほとんど発生しないプロトタイプを作って実験して、処理遅れなのかそれとも別の問題なのか調べて見ては?接続の問題も解決を。

リアルタイムで処理したいんだよね?

それとDirectShowで「サンプル」といえば、IMediaSample2などのデータの事をしめします。
>>287 は、一度ダウンストリームに送信したサンプルをまた再利用するなよってこと。
309デフォルトの名無しさん:2007/03/12(月) 21:53:42
ビデオレンダラからの品質メッセージをNotifyで受け取ってQuality::Lateを見てみると良いよ。
これがマイナスだとレンダラに間に合って届いている。
プラスだと間に合ってないので到着したとたんにレンダリングされたりして
動きがギクシャクしたり捨てられてカクついたりする
310デフォルトの名無しさん:2007/03/12(月) 22:14:45
休日の夜中になっても頑張ってるから応援したくなるよ あんまり教えすぎはよくないんだけど

>303 サンプルの流れについて

まず上流(キャプチャデバイス)の出力ピンが、変換フィルタの入力ピンCTransformInputPin::Recieveにサンプルを渡す。
入力ピンRecieveはCTranscormFilter::Receiveを呼ぶ。んでTransformメソッドでサンプルを変換した後、
出力ピンから下流(色変換フィルタ)のRecieveを呼び出す(サンプルを渡す) という流れ

>289で「Deliverしてる」って表現したのはマズかったかな。要は下流にサンプルを渡すってことなんだ。
下流の入力ピンのReceiveを呼び出す(サンプルを渡す)。コレがDeliverの正体。
CBaseOutputPin::Deliverメソッドのソースを見てみるといいよ(Baseclassesのamfilter.cppな)

んでTransformフィルタなんだけど、出力ピンのDeliverメソッドは呼んでいないんだ
どうやって送信してるかというと、CTransformFilter::Receiveの中に次のコードがある

hr = m_pOutput->m_pInputPin->Receive(pOutSample);

これ。ここで送信してる。直訳(?)すると、自分の出力ピンに繋がってる入力ピンのReceiveに
Transoformメソッドで変更を加えたサンプルを渡す ってこと。

長いので続く
311デフォルトの名無しさん:2007/03/12(月) 22:48:26
303のカキコミについて説明していくよ

> CTransformFilter::InitializeOutputSample (新しいサンプルを[キャプチャフィルタ]の出力ピンから取得する)

InitializeOutputSampleは出力するサンプルの準備をするメソッドなんだ。
ここでは送信するサンプルのバッファをサンプルと結びつける(バッファ自体は出力ピンが確保してる)

HRESULT hr = m_pOutput->m_pAllocator->GetBuffer(

その後で、上流から受け取ったサンプルのプロパティ(各種フラグと言ったほうがわかりやすいか)や時間情報を
出力するサンプルに設定していく。これがInitializeOutputSampleの役割。
このことから、上流から受けたサンプルと、自分で送るサンプルは全くの別物であるということがわかる。
送信が済んだら、このサンプルをリリースすることでバッファの開放などが行われる
(CTransformFilter::Receiveの最後の方 pOutSample->Release(); )

ちなみに上流から受けたサンプルをダイレクトにそのまま下流に出力するのはCTransInPlaceFilterだ

つづく
312デフォルトの名無しさん:2007/03/12(月) 23:10:36
早い話、君は2回送ってるつもりでも、3回送っていると思われる
しかも3回目のサンプルの時間情報は上流から受けた時間そのもの
313デフォルトの名無しさん:2007/03/12(月) 23:13:13
Transformメソッドはサンプルの内容を変更するだけじゃないと ブー
そういう設計なんでこざいます だからここから送信したら ブーブー
TransformInputPin::Receiveをオーバーライドしないとアカンねん
314デフォルトの名無しさん:2007/03/12(月) 23:23:29
まちがえた TransformFilter::Receiveな 酒のんでるからすまんの

サンプルのタイムスタンプ見てレンダラが表示のタイミングを待ったり、時には捨てたりするアルよ
サンプルの不連続性(Discontinuity)とか同期ポイント(SyncPoint)を示すフラグの扱いとか
注意してくれよ キレイなフィルタを作りましょう。んじゃ頑張れ

315265:2007/03/12(月) 23:33:31
>>308
了解です。
>それとDirectShowで「サンプル」といえば、IMediaSample2などのデータの事をしめします。
そういうことでしたか・・・
失礼しました。
>>309
ありがとうございます。
調べてみます。
>>310-314
とても丁寧にありがとうございます。
がんばります。
316デフォルトの名無しさん:2007/03/14(水) 22:52:01
>>306
dvsdなんかではCreateDIBSectionに失敗しそうな気がするけど、それはないの?

あと、フィルタいじれるなら入力ピンのCheckMediaTypeでMEDIASUBTYPEの
RGB24かRGB32以外を弾くようにすれば、その辺不問にできるような気がするけど・・・。
317デフォルトの名無しさん:2007/03/15(木) 01:14:32
すみません。
DVDをAVIにして保存したいんですが、YUYをRGBに変換するフィルタとAVIを書くフィルタは自前で作るのですか?
色々やってみてダメだったらヒントください。
ちょっと頑張ってくる。
318268:2007/03/15(木) 14:03:14
>>316
はい、失敗します。orz
他の方法でやらなきゃいけないんでしょうか?
319デフォルトの名無しさん:2007/03/15(木) 14:11:19
>>318
(1) 普通のDIBを用意して、そこにDrawDibDrawで描く
(2) 入力ピンのフォーマットをRGB24/RGB32に限定して、フィルタグラフ側で変換してもらう
(3) 自分でDVをでコードする

1,2は実質的にはaviのというかvfwのdvコーデックが使われる。

「やらなきゃいけない」かどうかは自分で決めればいい。
やりたくないならやらなくていいんじゃない?
320268:2007/03/15(木) 16:40:18
>>319
うお、ありがとうございます!
ちょっくら試してみます!
321268:2007/03/15(木) 18:38:43
とりあえず(1)はDrawDibOpenの時点で落ちるので保留。
(2)を試してみます。

ttp://webcamxtra.sourceforge.net/
これを活用すればいけそうな気もしてるんですけどね・・・。
今までウェブカメラは自力で処理できていたのでどうにかしたいもんです。orz
322268:2007/03/15(木) 18:52:30
ん、DrawDibOpen動いた。
あとはDrawDibDrawの引数だけだと思うので、ちょっくら追ってみます。
323デフォルトの名無しさん:2007/03/15(木) 23:07:58
ICaptureGraphBuilderを利用してSetOutputFileNameやって、
DVD Navigaterのフィルタを取ってRenderStreamすればAVIにできると思ったのにダメでした。

DVDをAVIにして保存する方法って何かあるんでしょうか。
サンプルグラバつなげられれば保存できる気もするんだけどPINをつなげられない。
324デフォルトの名無しさん:2007/03/16(金) 00:54:44
ビデオ形式
ビデオ タイプについては、サンプル グラバは VIDEOINFOHEADER 形式を必要とします。VIDEOINFOHEADER2 や DVINFO などの
他の形式タイプを必要とするフィルタに接続することはできません。
このため、MPEG-2 や DV ビデオ、またはフィールド ベースの (インターレース)
ビデオとの互換性はありません。
http://www.microsoft.com/japan/msdn/directx/techart/grabbersample.aspx#limitationsofthedirectshowsamplegrabber

うぉー、絶望的なことかいてあった。orz....
サンプルグラバに繋がらないわけだ。
Overlay Mixer −> サンプルグラバ −>AVIMUX という流れができるか明日ためしてみる。
325268:2007/03/16(金) 16:53:10
DrawDibBeginがfalseを返す・・・。orz
というわけで他の方法試してみます。
326デフォルトの名無しさん:2007/03/16(金) 16:55:37
BeginとEndは実は要らない。
327268:2007/03/16(金) 17:12:04
>>319
> (3) 自分でDVをでコードする
って、サンプルとかないですよね・・・。orz
328326:2007/03/16(金) 17:19:30
>>326
ま、マジですか。
ちょっくら試してみます。
329368:2007/03/16(金) 17:20:05
あせって名前間違えた。orz
>>328は自分です。
330268:2007/03/16(金) 17:24:46
うーん、DrawDibDrawがやっぱりfalse。
何か記述が足りない気がしてきた。

サンプル探してるんですけど全然見つからないんですよね。orz
331デフォルトの名無しさん:2007/03/16(金) 21:58:23
>>330
サンプルグラバ使ってるんですよね?
SetMediaTypeでMEDIASUBTYPE_RGB24指定して
dvsdで流れてこないようにしたらどうですか?

あなたのレスをすべて追っかけてるわけじゃないんで、外してるかもしれませんが。
332デフォルトの名無しさん:2007/03/16(金) 23:26:24
散文だし小出しだし追いかける気になれない。
333デフォルトの名無しさん:2007/03/17(土) 01:06:17
OverlayMixerの後ろにサンプルグラバはつながらないと思うよ。
OverlayMixerはレンダラとつながる。そしてオーバーレイで自分が描画している。
後ろにつながっているビデオレンダラはメディアサンプルを受け取っておらず、
ウインドマネージャを提供しているに過ぎない。
つまりたとえつながってもサンプルを取ることはできない。

はず。
334デフォルトの名無しさん:2007/03/17(土) 01:23:46
>>333
はい。そうでした。全く繋がらなくて1日無駄にしました。
DVDをAVIにしなきゃ行けないんで作り方を模索中。
やるならOverlayの上流にあるDVD用デコーダフィルタですかね。
GraphEditでRendererとサウンドをぶった切ってASFライタを入れると
DVDをWMVにできたりします。
この方式で画質設定と開始位置と終了位置を設定して保存できればいいのかもしれない。

最後にWMVをAVIに変換して終了させるという最低の方法を選ぶ。
AVIMUXにつなぐ方法ありましたらヒントください。

最近のライブラリから外れたBaseClassのCtransなんたらで自作フィルタを作るしかないんですかねぇ。
それでYUYをRGB24とかに変換。

DVD Navigater -> 何かフィルタ -> Video Commplessor -> AVI MUX -> File Writer
という形で保存できればいいんですが。
335268:2007/03/17(土) 21:42:01
動きますた!(・∀・)
原因は>>316>>331あたりが正解だったようです。
ボスに言われてイチから書き直したらうまく動きました。

というわけで、本当にありがとうございました。
DirectShowと戦うことができたのはこのスレのおかげです。
336デフォルトの名無しさん:2007/03/17(土) 22:04:51
>>335
おめっとさん、その二つはいずれも私ですがw
実はDirectorのXtraに興味があってちょっと追いかけてました。
Xtraの描画周りって何を参考にしました?
キャプチャした画像を直接Director上で表示するのでしょうか?

ちょいスレ違いスマソ
337268:2007/03/18(日) 22:28:43
>>336
自分はDirector上での描画はやってないですね。
CreateDIBSectionで取得したピクセル毎のBGR値の差分を比較して使っています。

今回DVカメラを扱う上で参考にしたのは↓ですね。
http://wwwdoi.elec.nara-k.ac.jp/html/jisyu/dxm/cap2/index.html
処理部分コピペでもとりあえず動きます。
# コンソールも出せるみたいです。

Xtra開発者は海外の人ばっかりなので、日本人も増えてほしいもんです。
338336:2007/03/19(月) 21:42:14
>>337
なるほどどうもっす。
DirectShowのフィルタ書いてお茶を濁そうと思っていたのですが、
クライアントの意向によりXtraを直接弄る必要があり、
ちょいとハマってたところでした。

DirectShowも情報ない方だけど、Xtraはもっと険しい道だなこりゃ・・・。
339デフォルトの名無しさん:2007/03/21(水) 10:49:02
asfを再生しようとすると
DirectShow フィルタ グラフに存在しないピンに操作を実行しようとしました。
になって再生できません、対策はありませんか?
340デフォルトの名無しさん:2007/03/21(水) 20:05:39
どうやって再生しようとしてんの?それじゃ意味わからんよ。
341デフォルトの名無しさん:2007/03/21(水) 20:42:03
若いの オラが村では派遣労働の問題を口にしちゃなんねーだ
お前さんはまだわけぇから言いたいこともあるべぇ
だべな、派遣問題を口にするとバカにされたと思ってムキになって怒る者がおるでよぉ
てめぇでの責任で派遣やってる癖に派遣問題に触れると逆ギレするバカなんだけどよぉ
そんでもこの問題の指摘は駄目だっぺぇ
派遣のことは口にしちゃなんねぇ
この村みたいな民度ゼロの会社で現実忘れるためにはよ
北朝鮮とか宗教団体と一緒でよ、駄目なものを駄目と言ってはなんねえだべさ
タブーを口にしちゃいけねぇだ
342デフォルトの名無しさん:2007/03/25(日) 16:03:45
変換フィルタを作っているんですが、そのフィルタのコンストラクタでmallocを使って
メモリを確保し、デコンストラクタでfree()で解放するようにしているのですが、
アプリ側でRemoveFilter()をしても、デコンストラクタが起こらないのかメモリが解放されません。
どうすればデコンストラクタを起こすことができるでしょうか?
343342:2007/03/25(日) 16:05:53
↑すみません、デコンストラクタじゃなくてデストラクタです。
344デフォルトの名無しさん:2007/03/25(日) 16:30:43
RemoveFilterってグラフからフィルタを切り離すだけだろ
そりゃデストラクタは呼ばないんじゃねーの?
345342:2007/03/25(日) 18:09:19
>>344
そうみたいですね。
いろいろ考えたんですが、完全に削除できないのなら、そのまま残しておいて再利用しよう、という
方針で組んだところ、望む動作を実現できました。
いちいち削除する必要がなかっただけの話でした・・・。

ありがとうございました。
346デフォルトの名無しさん:2007/03/25(日) 21:29:18
Releaseが完全に行われていないだけだろ。参照のチェック汁。
347342:2007/03/25(日) 23:33:06
>>346
なるほど。
調べてみます。
348デフォルトの名無しさん:2007/03/26(月) 09:07:56
新規質問です。

ピン接続時のメディアタイプを調べたいのですが簡単に調べる方法がないため今回「メディアタイプチェックフィルタ」を作る事にしました。

質問1.調べるフィルタを誰か作ってませんか?

時間をかけず作りたい為、「TranceForm」をベースにしているのですが、このフィルタで入力ピンのみの構成のフィルタはできますか?(テンプレートのピン数を1本にしても2本になってしまいました何故…?)
349デフォルトの名無しさん:2007/03/26(月) 10:16:35
いくら出す?
350デフォルトの名無しさん:2007/03/26(月) 10:17:19
20円
351デフォルトの名無しさん:2007/03/26(月) 12:14:35
>>349
自分なら作るのに3〜4時間位かかってしまいそうなので、
時給1000円×4hまでならなんとか。。

でも誰か作っていそうなんでそれを使いたいです。
352デフォルトの名無しさん:2007/03/26(月) 12:53:47
>>348
Dumpフィルタベースじゃダメなんかいね?
あれは入力ピン1コだけど。
353デフォルトの名無しさん:2007/03/26(月) 13:07:03
IBaseFilter::EnumPins
IPin::ConnectionMediaType

それともこっちか
IPin::EnumMediaTypes

簡単だろ?

とりあえず、リファレンスくらい読め。
354デフォルトの名無しさん:2007/03/26(月) 22:49:48
TransformFilterならそのまんまCheckMediaTypeで全部拾えばよかばってん
355デフォルトの名無しさん:2007/03/26(月) 23:39:39
>>354
考え同じ。せっかくだから上位フィルタに優先接続して欲しいタイプも入れられるようにしようかなと検討しとるですばい。

IBaseFilter::EnumPins
これはピンごとに管理したい時につかうメソッドだよ。ピン1つでは実装いらないよ
IPin::ConnectionMediaType
これは再生途中にタイプ変更したい時に実装したほがよさそ
356デフォルトの名無しさん:2007/03/27(火) 00:10:35
突然思い出したんだけどsampleの中にnullnullフィルタだかなんだか
プロパティページで接続タイプ一式が表示されるやつがあったような ないよーな
357デフォルトの名無しさん:2007/03/27(火) 00:40:51
何か違うと思って調べてみたらNullInPlaceだったわ ごめんな
nullprop.cppのNullIPProperties::OnApplyChangesみるといいアルよ
358デフォルトの名無しさん:2007/03/27(火) 00:56:20
なるほどなるほど。
NullIPPropertiesはなかなか難しいことやってますねぇ。。。
理解しずらいや。。

取り敢えず。
上位フィルタとの接続された
フォーマットタイプ、
メディアタイプ、
メディアサブタイプ
をプロパティページで表示できる変換フィルタを作成できました。
フォーマットタイプが「VIDEO」だったら解像度とかフレームレートとか付加情報を
表示できるようにしてみるか。。

このフィルタ欲しい人いる?
まぁきっとだれかもっといいものを作っている人がいるかとは思うのですが
359デフォルトの名無しさん:2007/03/27(火) 01:23:35
ノシ
360デフォルトの名無しさん:2007/03/27(火) 01:30:21
了解。じゃあ
人に使ってもらうには汚すぎなんで
(改造しながら他のフィルタのデバッグしてるんで・・・)
週末にでも機能を絞り込んで
見やすくしてみます。

終わったら、
h ttp://ragesakai.web.fc2.com/
にWebpageもってるんであげてみます。
361デフォルトの名無しさん:2007/03/27(火) 11:29:14
ありがたいっす。マタリ待ちます。
362デフォルトの名無しさん:2007/03/28(水) 07:41:45
自分が知らないメディアタイプが結構あるね。
メディアタイプ一覧がわかるサイトさがさなきゃ

接続メディアタイプチェックフィルタでは、最悪知らないGUIDが出てきたら
そのまま貼っとくか…


363デフォルトの名無しさん:2007/03/28(水) 21:21:39
uuids.hでよかばってん
364デフォルトの名無しさん:2007/03/28(水) 21:41:53
九州男児さんありがとう
365デフォルトの名無しさん:2007/03/30(金) 01:03:46
AVIファイルの一部を切り出して 拡大縮小したAVIつくりたいんだけど
元AVI(640,480)でRECT(120,120,440,320)の範囲だけきりだして320x240のAVIにしたり
範囲を拡大して640x480にしたいんですが、サンプルグラバのコールバックつくって
中で処理しなきゃダメですかね?

366デフォルトの名無しさん:2007/03/30(金) 08:24:20
「中」ってどこを指してる?

自分なら映像切り抜きフィルタを作って解決するけどフィルタグラフ側でもできるよ。
フィルタグラフ側でAVIの切り抜きを行った時のサンプルグラバの制御は凄く大変そう…ってか自分には無理なレベル

367デフォルトの名無しさん:2007/03/30(金) 08:30:25
あ、切り抜きの手段としてグラバを使うのか。
グラバで取得した画像は元AVIと同じサイズなんね。なら出来…るかな?

だけどやっぱり、「切り抜き拡大縮小フィルタ」作るほうが簡単なのは間違いない。
368デフォルトの名無しさん:2007/03/30(金) 20:49:08
>>367 TransformFilterで切り抜けばよかばってん。
んで後ろにAviMux、FileWritterとつなげればよかよ。
369365:2007/03/30(金) 21:25:10
サンプルグラバのコールバック=「中」です。

TransformFilterって、ベースクラスのライブラリから自分で作るフィルタですか?
最初から用意されててAddFilterで追加できるなら使ってみたいかも。

370デフォルトの名無しさん:2007/03/30(金) 21:38:03
> TransformFilterって、ベースクラスのライブラリから自分で作るフィルタですか?
んだよ自分で作るんだよ Transformメソッドで好きにいじってよし

んで後ろにAviMuxが繋がる時にね、ビデオの縦横サイズはオリジナルサイズじゃなくて
自分が変更するサイズを提示するったい Muxは提示されたサイズをヘッダ情報に
書いてた気がするばってん
371デフォルトの名無しさん:2007/03/30(金) 22:23:31
IRenderEngine2とかで何とかなるんでしょうか。
DirectShowの編集サービスっての使えますか?
372デフォルトの名無しさん:2007/03/30(金) 22:37:06
質問に答えてくれた皆様ありがとうございました。
ちょっくらトランスフォームフィルタつくってみます。
コンプレッサの前にトランスフォームでサイズ変える処理いれてみます。
CreateDIBSectionでHBITMAPつくってストレッチビルドして試してみます。
373デフォルトの名無しさん:2007/03/31(土) 00:03:12
>>372
作り方は大正解◎。
コツを少々・・・
流す映像のサイズをかえちゃうと
設計が大変になるから
「切り出し」→「拡大」でもとのBMPサイズに合わせるようにすると
いいよ。
それとストレッチベルトを「CTransform::Transform」内でつかうんだけど
ストレッチベルトの関数1つで全体のCPU負荷が15%ぐらい上がってしまう。

もし気になるなら、画像処理ライブラリで置き換えするとよいよ


俺ここんとこ九州男児さんと考え方が似てる。。同じような職種&年齢なんだろうな。
374デフォルトの名無しさん:2007/03/31(土) 00:27:00
おいどんは昔printfをプリンテフと読んで笑われた苦い経験があるばってん
一応つっこんでおくけど、「ブリット」ですたい。
StretchBlt ストレッチブリット BitBlt ビットブリット
375デフォルトの名無しさん:2007/03/31(土) 00:37:23
>>374
ほへ〜。初めて知りました。
呼び方は「Blt」⇒「ベルト」と呼んでました。。
言い訳しまくると、自分組み込み系出身でwinアプリ作るの今年から初めた門で。
WinAPIを知らなさすぎる。。この機会に他の呼び方も覚えよう

今後直しますありり^^

そして、メディアタイプチェッカーも明日だらだらし終わったら修正に取り掛かるっす
376デフォルトの名無しさん:2007/03/31(土) 00:42:28
377デフォルトの名無しさん:2007/03/31(土) 00:46:01
>>373
なんか、映像のサイズ変えて保存したいって突然いわれたんで
変更しなきゃいかんのです。
切り出して切り出したサイズで保存なんですよ。

切り出して元の再隋拡大だったらサンプルグラバでおわったのに。

サンプルグラバでCreateDIBSectionかけてmediasampleからバッファとって
データ加工して代入。ここまでは出来てOKだった・・・
ストレッチビルトして正しく終わったのに・・orz...
378デフォルトの名無しさん:2007/03/31(土) 01:09:59
ぶりっとっていう呼び方なんかアレだよね。アレ。
DirectX8からPresent()になったのはホント良かったと思うよ。
379デフォルトの名無しさん:2007/03/31(土) 01:26:56
>>377
ごめん。。
内容的には以前自分が作った「解像度リサイズフィルタ」
これの仕組みがまんまメインになってくるんだが
教えてあげられない。。
自分で調べてくれ。
380デフォルトの名無しさん:2007/03/31(土) 01:57:15
>>379
できたから問題無し。
381デフォルトの名無しさん:2007/03/31(土) 02:28:31
TransformFilterを使わずにビデオソースの拡大縮小と切り出しする方法って無いのかな。
切り出しと拡大縮小ぐらい用意されてるような気がして探し回ってた時期があった。

382デフォルトの名無しさん:2007/03/31(土) 16:37:52
一口にビデオソースといってもRGBやらYUVやら色々あるけんね
拡大、縮小にも色々なアルゴリズムがあるったい 自分の好きなようにつくるのが一番よかよ
どうせつくるならそのへんプロパティページで色々指定できるとうれしいね
383デフォルトの名無しさん:2007/03/31(土) 22:24:58
ここもネガティブさんが沸いてるよ。
自分で調べれって話なら書く必要ないじゃん。
教えて上げられないレス増えるからネガティブさん消えてくれwwwwwwwwwww
384デフォルトの名無しさん:2007/03/31(土) 23:03:57
>>383
DirectShowやってる人の総人口が少ない。
そしてそれが理由なのかここのスレの回答側に立つ人も少ない。
このスレで役に立てばと思って結構回答をしているが、
何が難しいかわかるけど教えてあげられない状況だったので、
放置されるよりはいいと思って書き込みました。

(本スレ後半でageてるやつはほとんど自分)
>>383さんもそんなこと書き込んでないで回答側に回ってくれ
385デフォルトの名無しさん:2007/04/01(日) 00:08:34
まあ内容はともかく、少しでも盛り上がってくれるのは嬉しいわな。
その昔サンプルグラバを知らなかった自分は自前のフィルタ作っちゃったし、
話の流れで知ることもそれなりに多い・・・。かな?
386デフォルトの名無しさん:2007/04/01(日) 03:12:34
>>363
uuid.hではすべてのメディアタイプは乗ってない。
「MEDIASUBTYPE_I420」
が入っていなかった。
387C++:2007/04/01(日) 08:46:54
 C++は今最も優れているプログラミング言語だ。C++さえあればなんでも出来る。CGI一つにしたって、今はPerlなんて使わなくても全部C++で出来る。そんなC++を使わないでどうする。
388デフォルトの名無しさん:2007/04/01(日) 13:44:39
「全て」のメディアタイプって概念をどう捉えるかだな
まずはDirectX SDKのindlude、DirectShowのBaseclasses ここのソースで定義されてるものを
押さえておけば良いんじゃないの?
極端な話、guidgen使って自分で独自のMediaType作れちゃうわけだし。
389デフォルトの名無しさん:2007/04/01(日) 22:43:15
MEDIASUBTYPE_I420ってGUIDとしては存在するかもしれないけどどっかのメーカーが勝手に作っただけじゃないの?
DirectShowのオフィシャルな定義としてはMEDIASUBTYPE_IYUVじゃないのか。
390デフォルトの名無しさん:2007/04/01(日) 23:22:10
そういや自分もmplayerの公開されているソースを見て
普通にMEDIASUBTYPE_I420という定義があるものと思い込み、
いざ実装してみたらものの見事に未定義だった、ということがあったなあ。

IYUVとI420は同じフォーマットのようなので、
私もMEDIASUBTYPE_IYUVを使ってますが・・・。
391デフォルトの名無しさん:2007/04/02(月) 09:52:04
拡張可能なばっかりにかえって不毛になってるのか

やれやれ
392デフォルトの名無しさん:2007/04/02(月) 11:49:43
ホントにDirectShowって資料少ないのね。VfW勉強した時も思ったけど
こういう動画処理インターフェースってプログラムとして人気ないのかな?
393デフォルトの名無しさん:2007/04/02(月) 13:56:56
資料は少ないなりに充実してると思うけど・・・
漏れにはACLの方がワケワカメだよ。
394デフォルトの名無しさん:2007/04/02(月) 14:27:52
動画処理に興味をもつほど自由に弄れる動画素材を持ってる人が少ない、
という事情もあるのではないか。

後は仕事になるかどうかとか。
395デフォルトの名無しさん:2007/04/03(火) 20:48:20
+  三ミヽ、⊂⊃
 +  三ミ |∧η∧
  /⌒\ (,,・Д・)<ただいまんこ〜オレも便乗して質問だぞ。
 + 川川 l l/つ つ━☆ トランスフォーマーとかいうのをつかって
     〜(  / CTransformFilter::DecideBufferSizeここでメモリを確保する所までたどり着いたぞ。
      (/"U 俺も拡大縮小をやりたくて書き込みするぞ。オマンコクロスだぞ。
       C言語は7年目だぞ。切実だぞ。
396デフォルトの名無しさん:2007/04/03(火) 22:27:40
>>395
俺は3年目だけど苦労したができたぞ。
で、何がしりたいんだぼけぇ
397デフォルトの名無しさん:2007/04/03(火) 22:32:34
・質問のただしいしかた悪いしかた
【いい例】
ぽまえら!おしえやがれぃい。
QVGAをVGAにリサイズしようと思うんだがDecideBufferSizeというめそで
115200byteしかとれねええんじゃUZEEEEEE!!
これを230400byteとれるようにする方法を教えやがれ

【悪い例】
いつも大変このスレッドを読ませていただき参考にさせてもらっております。
今回拡大縮小をやりたいのですがどのようにしたらいいかわかりません。
C++、MFCはできます。
また自分は過去XXXということをやっておりました。
大変恐縮ですがなにとぞご指導をよろしくお願いいたします

398デフォルトの名無しさん:2007/04/03(火) 22:37:54
まちがえた〜
×115200
○230400

×230400
○460800
用は質問の観点を絞り込んでくるかどうかの差だからな
399デフォルトの名無しさん:2007/04/03(火) 23:59:22
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<>>396 ポンドルウォーリアを特殊召喚する方法がしりたいぞ。
  ヽ    |フ ナニがしたいのか忘れたぞ!
   /_ _| AVIを半分の解像度にして保存したいんだぞ!これが目的だぞ。
        逆もあるぞ。オパンツ丸見え!
>>397 うんこちんこまんこ?キョカカカ!あばーあばばー!
参考にさせてもらったぞ。面倒だから、ゴゾブログで質問に答えてくれればそれでいいぞ。
オマンコクロッサー!
400デフォルトの名無しさん:2007/04/04(水) 00:59:12
・・・>>397で極端に書いたのに意味を理解しとらんのでヌルーする
401デフォルトの名無しさん:2007/04/04(水) 01:28:29
メディアタイプチェックフィルタ
作ったぞ

実は裏で機能をいろいろ盛り込んでみたが、
普通の使い方だけしてくれ。

http://zetubou.mine.nu/itoshiki/upload.cgi
っ【 [zetubou6474.bin] メディアチェックフィルタ 96 application/octet-stream 2007年04/04(水)01:25
これをリネーム
⇒0Mediachk.ax
それをregsvr32で登録
402デフォルトの名無しさん:2007/04/04(水) 01:52:35
ここはム板だ
403デフォルトの名無しさん:2007/04/04(水) 08:59:19
ゴゾブログのプロフ欄の写真の子カワイイ。
写真と引き換えならオニーサンがAVI半分にするフィルタ作ろう。(ただしソースはやれないがな)
404デフォルトの名無しさん:2007/04/04(水) 14:50:04
405デフォルトの名無しさん:2007/04/04(水) 16:48:36
>>404
このムーンライトフィルタってさ、カメラがI420の時は接続すらしてくれないんだね。

解像度もメディアタイプも変更してくれるいいフィルタだと思ったんだけど残念
406359:2007/04/04(水) 17:35:35
>>401(>>360の人?)
ありがとう、ダウンロードしてみました。
個人的には結構重宝しそうな感じです。
407デフォルトの名無しさん:2007/04/04(水) 18:23:20
>>360=>>401
です。

ちゃんと動きましたか?
バグを見つけたら速やかに報告よろ。

時間見つけ次第ちゃんとウェブページに反映しとくです。
感謝されるのに生き甲斐を感じた。ありり
408デフォルトの名無しさん:2007/04/04(水) 19:27:31
CBaseVideoRendererでフィルタを作っていて、一時停止中に画面の再描画を
行うためGetCurrentSample()でサンプルを得ています。
サンプルの取得は成功しているのですが、このあとに再生するとDoRenderSample()が
呼ばれなくなって固まってしまいます。

どうしてでしょうか?
409デフォルトの名無しさん:2007/04/04(水) 20:04:25
>>408
Releaseし忘れっぽい
410デフォルトの名無しさん:2007/04/04(水) 21:07:23
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<ただいまんこ〜拡大縮小できたぞ。BokkingFilterの完成だぞ。
  ヽ    |フ ビデオのサイズが変わらなかったのはフィルタ接続後にサイズ変えてたからだぞ。
   /_ _|
CheckTransformでサイズを変更したぞ。
変更したサイズからRGB24で必要なバッファサイズを計算して保存だぞ。
ストレエッチDIBitmapだぞ。それに対してソースからストレッチDIBitsして
完成したぞ。

そして完成した後に次の問題が出たぞ。
時間指定して3分の動画で1分目から2分目を抽出したいんだが
ControlStreamにS_OK帰ってきてもダメポだぞ。

AVI再圧縮で時間指定して抜き出すテクを知ってたら教えて欲しいぞ。オマンコクロスだぞ。切実だぞ。
411デフォルトの名無しさん:2007/04/04(水) 21:12:04
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<あと、AVI MuxフィルタをキャプチャグラバからFindInterフェラして
  ヽ    |フ IAMStreamControlを生み出してStartAtとStopAtする方法を作ったんだが
   /_ _|  ム圧縮AVIなら何とか成功してWMVとかコーデック使うと画像が表示されんぞ。
あと、保存してない間も無駄に待たされて酷い目にあったぞ。
誰かオレがナニをすべきか教えて欲しいぞ。
412デフォルトの名無しさん:2007/04/04(水) 21:36:48
ControlStream(&PIN_CATEGORY_CAPTURE,ぬるぽ,ぬるぽ,開始時間,終了時間、0,0);
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<キャプチャビルダのコントロールストリームはこんな具合になってるぞ。
  ヽ    |フ オマンコクロスだぞ。ソースを持って変えれないので具体的に説明できんぞ。
   /_ _|
413408:2007/04/04(水) 22:46:10
ありがとうございます。
まさにそれでした。SDKのヘルプに書いてありましたね
414デフォルトの名無しさん:2007/04/04(水) 23:23:04
415414:2007/04/04(水) 23:23:49
416デフォルトの名無しさん:2007/04/04(水) 23:35:12
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<>>415 それも考えたんだぞ。大人の都合ってヤツでダメなんだぞ。
  ヽ    |フ くやしいぞ。オマンコクロスファイヤーハリケーンだぞ。
   /_ _| 明日、ためしに作ってみるぞ。
417デフォルトの名無しさん:2007/04/04(水) 23:45:11
いいから↑はほっといてやれ。
418359:2007/04/04(水) 23:57:28
>>407
今のところ問題なさそうですよ。
ただ、スレの流れを見ると私以外で使ってみた人いないのかな?w

もう少し使ってみて気がついたことがあったら報告しますね。
419デフォルトの名無しさん:2007/04/05(木) 00:03:51
>>418
>私以外使ってる人いない…
(´・ω・`)ショボーン


420デフォルトの名無しさん:2007/04/05(木) 21:34:17
おまえら便利なフィルタの一覧サイト作ろうぜ!
あと、××の製品かうと着いてくるフィルタは…とか語ろう
421デフォルトの名無しさん:2007/04/06(金) 11:53:29
http://pc11.2ch.net/test/read.cgi/avi/1030190329/
・・・とはいえ、思いっきり過疎ってるスレだし>>419のニーズには合わんかな。


ところで質問です。
AddSourceFilterで追加したファイルソースの
出力ピンのメディアタイプを指定する方法はないでしょうか?

あるファイルを指定したとき、ただRender()しただけでは期待しているフィルタに
繋がらない(ファイルソースのメディアタイプがGUID_NULLになっている)ので
強制的に指定してみたいのですが・・・。
422デフォルトの名無しさん:2007/04/06(金) 12:41:37
>>421=>>359さん??
質問は>>419に聞いてるのかな?
だったら応えます。

上流フィルタがカメラとかの入力デバイスの場合は「フィルタのピンプロパティ」から出力タイプを変更できるものがほとんどです。

仮に「動画」などのファイルであれば変換フィルタを噛ます事で変更は出来ますが新たに付けてやることは出来ません。

新規にフィルタを作成すればメディアタイプを付加しる物を作れるよ。
他の方法はわかりません
423デフォルトの名無しさん:2007/04/06(金) 13:13:09
>>422
> >>421=>>359さん??
うわー、なんで分かるの?w

> 新規にフィルタを作成すればメディアタイプを付加しる物を作れるよ。
> 他の方法はわかりません
やっぱりそれしかなさそうですね。
AsyncRdrサンプル辺りをベースに1つ作ってみます。
424デフォルトの名無しさん:2007/04/07(土) 01:07:30
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<無圧縮タイプのAVIなら時間切り出しできたぞ。
  ヽ    |フ ただ、無駄に時間がかかるぞ。切り出すまでフィルタにデータが流れて処理してるんだぞ。
   /_ _| ポンドルウォーリア特殊召喚だぞ!ゴルァ!
425デフォルトの名無しさん:2007/04/08(日) 10:32:36
>レンダラは知らないけど、画面の上側にプレーヤを持っていくと少し(体感しないけど)
>速くなるらしい。なんかPresent(?)の戻りが早くなるとか言ってた。

これ本当?
426デフォルトの名無しさん:2007/04/08(日) 11:42:57
>>425
画面描写しないぶんタイムスタンプに忠実になるだけかと。。
>>424の話とは全然違う話
427デフォルトの名無しさん:2007/04/08(日) 17:03:02
Presentの戻りって何?
プリロールかな?としても意味通じないし…
予測ツカナス
428デフォルトの名無しさん:2007/04/08(日) 17:45:38
IDirect3DDevice9::Present()の話だな。
429デフォルトの名無しさん:2007/04/09(月) 21:41:47
 初心者です。SDKサンプルで分からない点があるのですが、お教え頂けないでしょうか。

 プログラム動作としては、3つのmp3ファイルをタイマーで順繰りに再生するだけです。※1
 この中でソースフィルタを変更してグラフを再構成する部分で分からない点があります。

流れ
 1.新しいソースフィルタをグラフに追加する。
 2.古いソースフィルタをグラフから削除する。
 3.新しいソースフィルタの出力ピンからRenderする。


2の部分の詳細は以下のようになっています。

 A.グラフ内のフィルタを列挙する。
 B.列挙された全フィルタについて

     a.一旦グラフから削除する
     b.古いソースフィルタでなければグラフに追加する

疑問点
 b.の部分がある意味がわかりません。自分としては、グラフ内の全フィルタを削除して、新しい
ソースフィルタを追加して、Renderすれば簡単に思えるんですが...
 
 どうかよろしくお願いします。

※1 ソースはSDK_Path\Samples\C++\DirectShow\Players\BGMusicです。
430デフォルトの名無しさん:2007/04/09(月) 22:16:14
SwapSourceFilterのメソッドのこと?
431デフォルトの名無しさん:2007/04/09(月) 23:29:52
>>429
Render は重いから。
432デフォルトの名無しさん:2007/04/10(火) 00:46:05
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<>>429 サウンドってのは、レンドルァすると全部のcodecを試すんだぞ。
  ヽ    |フ だから、全て消して再構築すると連続再生とかできんぞ。
   /_ _| アイマスの魔法をかけて!から、とかちつくちての連続技の間に途切れるって事だぞ。
433デフォルトの名無しさん:2007/04/10(火) 01:13:25
>>432
やべぇ見直した。。
434デフォルトの名無しさん:2007/04/10(火) 01:55:46
ありがとうございます。
なるほど、それで以前使ったフィルタは残してたんですねφ

ところでその時、つながっていないフィルタがグラフ上に散在している状態ですよね。

その状態でRenderしたら、全Codecを試さず、散在しているフィルタを繋げてくれるんですか?
それともRenderを使わず、ピンを繋ぐ方法が別にあるのでしょうか?

この板のレベルに達するまで勉強して、出直してきます。(時間かかりそう...)
435デフォルトの名無しさん:2007/04/10(火) 07:21:49
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<>>434 朝勃ち中だが答えるぞ。
  ヽ    |フ レンダーすっと、フィルタが追加されている物から試すんだぞ。
   /_ _| そのため、レンダーする前にvmr9のフィルタとかを入れておくとただのビデオレンダーじゃなくなったりするぞ。
      だから、先に自分で作ったフィルタを入れておくと正しく繋がったりするぞ。
もちろん、Renderを使わずにグラフビルダのほうでConnectすることができるぞ。
IPinってのをフィルタから抜き出して接続できるみたいなんだぞ。
使った事無いからうまんちんまんだぞ。
436デフォルトの名無しさん:2007/04/10(火) 07:39:07
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<なんか、間違ってるかもしれんが許してほしいマンコ!んじゃ為替予想書いてくるぞ。
  ヽ    |フ
   /_ _|
437デフォルトの名無しさん:2007/04/10(火) 12:02:08
すみません、質問いいですか?
今、DirectShowでUSBカメラからサンプルグラバでBMPをキャプチャするプログラムを作っています。
コールバックを使用してキャプチャをしようとしているのですが、
SetOneShotを使って1フレームだけキャプチャすることは出来ないのでしょうか?
ためしにSetOneShot(TRUE)としてみても、コールバックされ続けてしまいます。
438デフォルトの名無しさん:2007/04/10(火) 17:56:39
出力ピンがオーディオとビデオの2つある、Splitterフィルタを作成しています。
フィルタのGetMediaTypeでは、ピンによって2通りの設定が必要と思っています。
(オーディオの方の出力ピンからGetMediaTypeが呼ばれた場合はオーディオの値をセット、
ビデオの出力ピンからGetMediaTypeが呼ばれた場合はビデオの値をセットというように。)
しかし、GetMediaTypeでは、現在どちらの出力ピンから呼ばれているのか判別できないのですが、
どうしたら良いでしょうか。

出力ピンのクラスは同じものを使っているのですが、オーディオ用のピンクラス、ビデオ用の
ピンクラスと別に作成しなければならないのでしょうか?
439デフォルトの名無しさん:2007/04/10(火) 19:30:13
>>438
自分がどっちのピンかを区別して処理を変えればいいじゃん。
440デフォルトの名無しさん:2007/04/10(火) 21:10:34
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<>>437 ただいまんこー!ドピュンコしたあとに、コールバックを外せばOKだぞ。
  ヽ    |フ コールバックをセットしたままだと永遠にデータが流れるぞ。
   /_ _| オレだったらSampleCBのあるクラスに BOOL m_Ochinpoいれて
データを流したくない時はfalseいれて SampleCBのなかでreturn S_OKしちゃうぞ。
オマンコクロッサー!
441デフォルトの名無しさん:2007/04/10(火) 21:13:06
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<>>438 IPin淫乱フェラにあるQueryPinInfoで解決できる気もするぞ。
  ヽ    |フ 俺も調べないと分らんぞ。スマソだぞ。力になれんぞ。
   /_ _|
442デフォルトの名無しさん:2007/04/10(火) 22:06:54
VBプログラマにVisual C++を教えるスレ★ Part25
443デフォルトの名無しさん:2007/04/11(水) 00:10:36
>>441タソ
フィルタ内部の話だからQueryはちがうとおもうぞ。
自分も>>439の意見に賛成です。
@純粋仮想メソッドGetPinを実装してピン番号を取得
AGetMediaTypeにてまず@を呼び出す。
Bピン番号が「1」ならビデオだから・・・メディアタイプ「Video」を要求
Cピン番号が「2」ならAudioだから・・・・メディアタイプ「PCMAudio」を要求
iPositionにて要求するものをそれぞれ数個書いてやればいいかな。。
444デフォルトの名無しさん:2007/04/11(水) 00:49:17
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<>>443 オレはトランスフォーマーフィルタで1対1の戦いしかやったこと無かったぞ。
  ヽ    |フ これでピンが複数あるフィルタも手だせそうだぞ。
   /_ _|
445デフォルトの名無しさん:2007/04/11(水) 00:50:19
>>444
コンボイの謎を2週くらいクリアしとけ
446438:2007/04/11(水) 14:38:35
返事ありがとうございます。

>>439
僕はどっちのピンか区別できなくてコマッてます…

>>443
GetPinはピン番号を指定して、その番号のピンを取得するのだと思うのですが。
それだとピンの区別はできなくないですか?

実際には、フィルタはm_pOutputAudioとm_pOutputVideoの二つの出力ピンを持ってます。GetMediaTypeの中で、CBasePin::Name()でピンIDを取得して、判断しようかと思いましたが、結局ピンの指定によって取得値が変わってしまいます。
m_pOutputAudio->Name() とすればAudioが返るし、
m_pOutputVideo->Name() とすればVideoが返るので、
結局どちらのピンかわかりません。(両方が存在するので当たり前ですが)
※m_pOutputAudio,m_pOutputVideoはフィルタ作成時に作られます。

どうしたらよいですかね…
447デフォルトの名無しさん:2007/04/11(水) 14:59:29
>>446
if (pOutputAudio == this) {
 //オーディオピンの処理
} else {
 //それ以外
}
448448:2007/04/11(水) 17:09:38
>>447
参考にします。

フィルタのGetMediaTypeでピンを判別するから良くなかったみたいです。
フィルタのGetMediaTypeは、出力ピンのGetMediaTypeからコールされるので、
出力ピンのGetMediaTypeでどっちのピンか判断し、それを記憶しておくことにしました。
CSplitterOutputPin::GetMediaType()
{
if(0==lstrcmpW(this->m_pName, L"Audio")){
//フィルタのメンバ変数にオーディオだと記憶させる。
m_pSplitterFilter->m_bOutputPinAudio=true;
}
else{
//フィルタのメンバ変数にビデオだと記憶させる。
m_pSplitterFilter->m_bOutputPinAudio=false;
}
return m_pSplitterFilter->GetMediaType();
}

↑のようにして、フィルタのGetMediaTypeでは、m_bOutputPinAudioを見て、
オーディオ、ビデオの設定をするようにしました。
一応接続はこれで上手くいきました。何かとても簡単な質問をしてしまった気がしますが…
449デフォルトの名無しさん:2007/04/18(水) 22:36:27
1500円の2割引はいくら?
時速80km/hで走る車が1時間何キロ走る?

・・・ポカーン
450デフォルトの名無しさん:2007/04/19(木) 00:29:28
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<1500円の2割引きは計算不能だぞ。俺の脳が再起不能(リタイア)したぞ。
  ヽ    |フ 時速80kmでオレは走れないので1時間も車を見張れないぞ!
   /_ _| 果てしなく遠くが答えだぞ。
451デフォルトの名無しさん:2007/04/19(木) 06:23:08
都合でDirectshowを使い始めることになりました初心者です。
Webカメラで取った映像を扱いたいので、SDKにあるAMCapを参考に機能を探しているのですが

キャプチャした動画をaviではなくmpeg1等で圧縮して吐き出したいのですが
フィルタを何処の関数で挟めばよいのでしょう。
あと、映像のガンマや彩度等がプロパティで調整できてしまいますが、これはなんのフィルタを使用しているのでしょうか?

初心者質問すいません。
452デフォルトの名無しさん:2007/04/19(木) 07:35:23
>>451

プロパティはソース見りゃわかるんじゃない。
以下推測
色調節のフィルタが存在するのではなくて
キャプチャデバイスやそのピンのプロパティじゃないのか。
Webカメラのデバイスドライバが変わればその機能も変わる。

MPEG-1エンコーダって標準装備か?
俺持ってない。存在しないフィルターは使えんよな。
453デフォルトの名無しさん:2007/04/19(木) 07:54:41
沖縄県の方へ(命に関わる注意事項です)

沖縄県での選挙ですが、どうか民主党だけは避けてください。県民の生命に関わる可能性があります。
民主党の最大の公約は一国二制度(※)ですが、一度「一国二制度 沖縄」等で検索をお願いします。
この際、民主党のHPで調べても良いです。以下の注釈↓と矛盾することは書いてないはずですから…

※一国二制度
 簡単に言えば沖縄を中国と日本の共有物にし、そこに3000万人の中国人を入植させます。
 (つまり沖縄人口の 96% を中国人にして、実質、沖縄を中国人の居住地とします。)
 さらに「自主」の名の下、沖縄で有事が起きても自衛隊は干渉できません。
 3000万人の中国人が、少数派となった130万人の日本人に何をしても、です。
 そして中国人の反日感情の強さは、ほとんどの日本人の理解を超えるものです。

今回の選挙で民主党が勝った場合、「自主」「発展」を連呼しつつ段階的に進めていくことになります。
自主と言っても、自主を認めるのが「住人の96%が中国人となった」後だということに気をつけてください。
発展と言っても、新沖縄の少数派となった「少数民族日本人」の発展ではないことに気をつけてください。
454451:2007/04/19(木) 14:09:38
>>452
えっと、回答ありがとうございます。
トライ&エラーしながら死んでおります。

>色調節のフィルタが存在するのではなくて
>キャプチャデバイスやそのピンのプロパティじゃないのか。
...確かに、自宅で違うWebカメラで試したときは、設定ダイアログの内容がぜんぜん違っていましたね。

>MPEG-1エンコーダって標準装備か?
もう一度探しなおしたデコーダーだけで、エンコーダーはありませんでした。死んできます。
aviだと保存するにも重いから、実用的なサイズに直して自動保存しておいてって言われたんですが、asfかモーションJPEGかDVか、しか使えないのかな?

まぁ、いくらか頑張ってみます。
455デフォルトの名無しさん:2007/04/19(木) 21:04:09
TMPEGEnc買っちゃいなYO!
456デフォルトの名無しさん:2007/04/19(木) 23:22:24
>>455
GRAPHEDTがあれば買わなくてもいいな俺は。

>>454
MPEG4のコーディック2なら標準装備であるよ。

GraphEdtで↓な構成を書いてみるよろし
「WebCam」→「MPG4Codec2」→「AUXMix」→「FileWriter」

んで「WebCam」のPinプロパティを開いてみる

自分の思った通りに出来る場合
⇒そのままコーディング

自分の思った通り出来ない場合
⇒出来る方法を模索

をやっといた方がはやい
457454:2007/04/20(金) 10:39:55
どうもです、回答ありがとうございます。
一応あの後がんばった結果、DV形式とモーションjpegでは圧縮に成功しました
「うーん、なんかサイズ大きいね。asfで圧縮できない?」
といわれたわけで、メディアフォーマットSDKを読んで泣いています。
小さければ文句言われないのでmpeg4の方が楽かもしれません。
なんか進歩日記みたいになってすいませんが...。
458デフォルトの名無しさん:2007/04/20(金) 20:55:50
>>457
御礼を言うのは大変素晴らしいが、どこまで書いたことを理解できたのか
解るように(回答が的外れでなかったか知りたい)
内容についても一言触れて欲しかったな

と、会社では立場が最下層回答者の愚痴。
459デフォルトの名無しさん:2007/04/20(金) 21:39:00
最後志貴の方、速度で無い中、対戦お疲れ様でした。
飯食うので、この辺で。
460デフォルトの名無しさん:2007/04/20(金) 22:14:15
あ、はい。もうなんか恥ずかしいですがこの際だから正直に言います。

>GraphEdtで↓な構成を書いてみるよろし
>「WebCam」→「MPG4Codec2」→「AUXMix」→「FileWriter」
ここらへんから実は分かっていません。
GraphEdtは分かるのですが、圧縮用のcodecをどう呼び出せばいいのか…
directshow標準のDVだと
CoCreateInstance( CLSID_DVVideoEnc, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pDvFilter);
と書いたら作れたんだけど、標準外のものはクラスIDを何処で知れば良いんだと悩んでおりました。
そこで摘んだのでasfでの圧縮を模索したのですが、なかなか動くコードにならないで今日が過ぎていきました
461デフォルトの名無しさん:2007/04/20(金) 22:51:49
>>460
ふむ。成る程。
GraphEdtでのフィルタ登録の操作の仕方なのかそれをコーティングするときの方法なのかわからんです。

Clsid(クラスIDの事ね)がわからないと言ってるから↓↓がわからんのでは??

>自分の思った通りに出来る場合 ⇒そのままコーディング

ClsidはGraphedtでフィルタ登録する時に表示されてるよ。

それとも「Graphedt.exe」のアプリを「フィルタグラフ」(コーティング上の概念)と勘違いしてるのかなぁ…
462デフォルトの名無しさん:2007/04/20(金) 23:07:45
asfはWM ASF ライターを登録して入力ピンにつないでやるだけだから
圧縮コーデックの列挙が必要なavi再圧縮に比べたらよっぽど簡単だよ。
463460:2007/04/21(土) 06:14:41
これは直にソース出してみた方が良さそうなので。
以下asfの書き出しの部分です。(短くするためにエラー処理省略です

IBaseFilter *pAsfFilter;
hr=CoCreateInstance(CLSID_WMAsfWriter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pAsfFilter);
hr = gcap.pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, L"cccc.asf", &pAsfFilter, &gcap.pSink);
hr=gcap.pFg->AddFilter( pAsfFilter, L"asf filter" );
pAsfFilter->Release();
hr = gcap.pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, gcap.pVCap, NULL, pAsfFilter );

このコードだとファイルの書き出しはしてくれるんだけど、何故か無圧縮aviが出力される。何ででしょうね…

> ClsidはGraphedtでフィルタ登録する時に表示されてるよ。
Gapheditでフィルタ選択したときに出るDisplayNameの、 {ランダムな文字} の間の部分って事ですね。
多分理解しました。

464デフォルトの名無しさん:2007/04/21(土) 12:37:04
MEDIASUBTYPE_Aviだからじゃねーの?
465デフォルトの名無しさん:2007/04/21(土) 13:49:11
>>463
ちゃんとMSDNでリファレンス見てから書いたほうがいいよ。
CoCreateInstanceでCLSID_WMAsfWriter作らなくても
SetOutputFileNameが作ってpAsfFilterに入れてくれる。
http://msdn2.microsoft.com/en-us/library/ms779904.aspx
http://msdn2.microsoft.com/en-us/library/ms784861.aspx
466460:2007/04/23(月) 04:44:00
お返事が送れて申し訳有りません。
一応頂いたアドバイスからちまちまと頑張っております。

>>465
hr=CoCreateInstance(CLSID_WMAsfWriter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pAsfFilter);
hr = gcap.pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, L"cccc.asf", &pAsfFilter, &gcap.pSink);

上2行からCoCreateInstance関数でのインターフェースの取得をやめて、メディアサブタイプをMEDIASUBTYPE_Asfに改めたのですが、何故かエラー。
どこかまだ問題があるのかも知れません。
というわけで、他のcodecに逃げる方に切り替えて、Graphedit.exeを弄りながらクラスIDを探したのですが書いたグラフをGRFファイルで書き出して、無理矢理テキストエディタで開いたら、それらしいクラスIDがあったので
キャプチャカード -> ffdshow -> File Writer
とフィルタを繋いだ所、無事に書き出しに成功しました。
サイズ的には納得してもらえそうな所にまぁ、落ち着きました。
フォーマットがXViDですが、あはは…。

> >>454
> MPEG4のコーディック2なら標準装備であるよ。
そこなのですが
・MPG4Codec2
・AUXMix
の2つのフィルタがちょっと見たりませんので上の様に逃げています(汗
探し方が足りないのかな?

とりあえず、相手に見せてみます。ありがとうございました。
まだ格闘しなければいけないところがあるので、ほとほと困ったらまた来るかもしれません。
467デフォルトの名無しさん:2007/04/25(水) 16:01:46
以前に出力ピンが2つある場合の出力ピンの区別のことで質問させてもらったのですが、
スプリッタの2つの出力ピンからデータを出力するようにしました。
が、再生すると何も表示されません(音も映像も)。
一方の出力ピンだけ接続し、もう一方の出力ピンは未接続の状態にすると再生はできます。
しかし、オーディオ、ビデオ両方を同時に再生しようとすると、どちらも
再生されなくなります。
原因は何が考えられるでしょうか。
468デフォルトの名無しさん:2007/04/25(水) 16:15:00
それはただのバグっぽいぞ・・・
各ピン(のインタフェイス)は別々のスレッドから呼ばれる可能性があることを
ちゃんと考慮した作りになっているか、デッドロック等はないか、など考えてみるべき。

あと「再生されません」ではなく、グラフのステートが再生状態になるのかならないのか、
なる場合には停止で止まるのか止まらないのかなど、プログラマらしい情報の出し方を
469467:2007/04/25(水) 19:34:56
>468
もともと1つの出力ピンのソースに、無理やりもう1つの出力ピンを
追加したのが問題かもしれません。
基本的にm_pOutput(元々あった出力ピン)が出てくるところに、
もう1つのピンの処理を追加したような感じです。

>あと「再生されません」ではなく、グラフのステートが再生状態になるのかならないのか、
>なる場合には停止で止まるのか止まらないのかなど、プログラマらしい情報の出し方を
すみません、情報不足でした。GraphEditで確認しているのですが、
再生ボタンを押した後、再生状態にはなっているようです。
しかし、停止ボタンを押すとフリーズし,
The graph was unable to complete pause within 10 seconds.〜
という警告がでる状況です。
470デフォルトの名無しさん:2007/04/25(水) 19:37:18
deliver で送るプッシュ型のピンですよね。
2つある場合はそれぞれ別のスレッドで動く必要がありますが、
そのあたりは問題ありませんか?
471467:2007/04/25(水) 20:27:13
>>470
deliverは使ってませんが、内容は一緒です。
プッシュ型です。
具体的にはフィルタのReceiveでは、下記のようにしてます。

if(m_bOutputSampleAudio)
{
// オーディオならオーディオピンから出力
if(m_pOutput->IsConnected())
return m_pOutput->m_pInputPin->Receive(pSample);
}
else
{ // ビデオならビデオピンから出力する
if(m_pOutputVideo->IsConnected())
return m_pOutputVideo->m_pInputPin->Receive(pSample);
}

1つのスレッドで動かしているような気がします。
スレッドを別々に持つとは、オーディオピンがストップしたとしても、
ビデオピンは関係なく出力できる、みたいな感じですよね。
どう実装すればいいのか…
472デフォルトの名無しさん:2007/04/25(水) 21:15:13
ビデオレンダラにつながっているピンのReceiveが時間調整のためにブロックすると、
オーディオレンダラにつながっているピンにもデータが来なくなるので、
時間が進まなくなって永遠にブロックするという動作。

出力ピンをCSourceStream から派生させて実装するのが base classes 的には常道。
パースしたビデオ、オーディオのデータをそれぞれのピンの中の Queue (自分で作ること)
に入れておいて、FillBuffer で Queue にあるデータをもとにメディアサンプルを作る。

個人的にはスプリッタを作るなら、ソースフィルタのサンプルコードをもとにして
出力ピンと入力ピンを追加するのが簡単だと思う。
473デフォルトの名無しさん:2007/05/08(火) 16:19:57
質問です、Direct3Dで、ゲーム中のテクスチャに動画ファイルの映像の
ビットマップを入れ、音声もゲームのカメラ位置に従って右の方にあれば
右寄りの位置から聞こえてくるようにしたいのですが、

とりあえず入門にあるようなSampleGrabberを使う方法ではなく
RendererFilterを継承するのが正解なのだろう、というところまでは
わかったのですが、フィルタを継承して自前で書くのにstreams.hとやらが
ありませんでした。Windows2000ではWindowsSDKがインストールできないので
迂回策を探しています(ちょっと前のPlatformSDKには入ってませんでした・・)。

Windows2000上でフィルタを継承するようなコードを書いてる方は、
どのようにやっているのでしょうか?
他にも「別にRendererFilterを継承しなくてももっといいやり方がある」とか
ツッコミがあればお願いします。
474473:2007/05/08(火) 16:25:19
すみません、間違えてさげてしまったΣ
ついでに訂正・・・
×streams.hとやらがありませんでした。
○streams.hとやらが必要みたいですが、ありませんでした。

何がやりたいかわかりやすく書くと、
ゲームの中のテレビに任意の動画を流したい、ということです。
475デフォルトの名無しさん:2007/05/08(火) 18:11:28
>>473
D3Dのテクスチャに動画をレンダリングするのは、
SDKのサンプルにそのものずばりのがある。

DirectShow 関連のSDK が利用できないのであれば、
動画ファイルをWMVなりAVIで用意して、AVI関連APIや
Windows Media Format SDKでデコードすれば良いと思う。
476473:2007/05/08(火) 18:42:40
回答ありがとうございます!
>WMVなりAVIで用意して、AVI関連APIやWindows Media Format SDKでデコード
なるほど!動画関連のAPIに詳しくなかったので盲点でした。
その辺はこれから調べようと思うんですが、一つ質問させてください。

>SDKのサンプルにそのものずばりのがある。
これなんですが、WindowsSDKのことでしょうか?
最初DirectXSDKのサンプルかと思ったのですが見当たらなかったので・・・
477デフォルトの名無しさん:2007/05/08(火) 19:01:25
>これなんですが、WindowsSDKのことでしょうか?

そうです。
Windows 2000 だと Windows server 2003 SP1 Platform SDK を利用することになります。
SDK の導入あたりから書かれたページを見つけたので読んでみてはいかがでしょうか。
ttp://www.shader.jp/xoops/html/modules/xfsection/article.php?articleid=17
478デフォルトの名無しさん:2007/05/10(木) 01:38:59
DirectShowに足突っ込んで間もないのですが、質問です。
VMR9を使って動画の再生を行おうとしているのですが、動画の
元サイズとアスペクト比を取得しようと
IVMRWindowlessControl9::GetNativeVideoSizeを使っているのですが、
このメソッドのセットする値が期待した値になりません。

long x, y;
long aspx, aspy;
HRESULT hr = pVMRWindowlessControl9->GetNativeVideoSize(&x, &y, &aspx, &aspy);

このコードで720×480のmpeg2ファイルを読み込むと期待としては
x = 720
y = 480
aspx = 4
aspy = 3

こんな感じになると思っていたのですが、実際は

x = 720
y = 540
aspx = 720
aspy = 540

となってしまいます。元々のサイズとアスペクト比を取得したいのですが、
これではできません。他の方法があるのでしょうか?

ちなみに、IBasicVideo2を使うとちゃんとできるんですよね。他の機能を実装
するためにVMR9を使わざるを得ないのですが・・・
479デフォルトの名無しさん:2007/05/16(水) 14:14:00
どうもすいません。

Webカメラから取った動画を保存できるようにプログラムを書いたのですが、そこまで完成したのを見せたところ。
「こんどはコレ再生して、再生時間を表示できるようにできないかな?」
と言われてしまいましたが、正直何を使って実現すれば良いかどうかから思い当たるところがありません。
そのインターフェースを使えばよいかどうかだけでも、教えていただけないでしょうか…。
IAMDroppedFramesあたりかな、とも思ったのですがいまいち思ったように動いてくれていません。
480479:2007/05/16(水) 14:43:41
すいません。
先ほど、話をしなおしたのですが。私の勘違いがあって。
「Webカメラから取った動画」に「現在の時間」を残せないか?という要求でした。
具体的には動画の何処かの隅っこに、現在時間を画像として書き込んでしまうようなものを想像していたみたいです。
質問するのではなく、自前でフィルタを書くべきみたいですね。すいませんでした。
481デフォルトの名無しさん:2007/05/16(水) 17:19:42
でも正確なキャプチャ時刻を得るのは難しいよな。
誤差が33ms以内とか
482デフォルトの名無しさん:2007/05/17(木) 00:56:53
あぁ。僕もそんな要望きたからやった。
単に秒まで出すだけならたやすい。
インプレイスフィルタが1番楽。次点は資料がたくさんあるトランスフォームフィルタ。
1・TranceFormメソッドをオーバーライド
2・IMediaSampleからDIBポインタをとる
3・DIB→デバイスコンテキストに変換
4・WinAPIのTextOutで文字書く
5・デバイスコンテキスト→DIB変換
たったこれだけでおk
483460:2007/05/20(日) 19:49:18
ごめんなさい。弱音を吐きます。
結構頑張ったけど、2,3のステップの所のコードが作れません。
484デフォルトの名無しさん:2007/05/21(月) 05:05:45
時間でいいなら、必要な文字の画像を準備して、合成するだけでいいんじゃね?
厳密なアルファブレンドだと処理が重いから、切り抜き程度でいいと思う。
485デフォルトの名無しさん:2007/05/21(月) 08:39:41
CreateDIBSectionとかググれ
486デフォルトの名無しさん:2007/05/21(月) 15:14:30
>>483
客の要求仕様に基づいてプログラムを作ってるならしようがないけど、もしかすると
>>460 が作業する工数 >>>>>>> 撮影時に時計を一緒に写す手間」じゃないか?

もしそうなら道楽で予算を無駄遣いしてることになるから、正直適当なとこでやめて
本業に精を出した方がいいような気がする・・・
487483:2007/05/21(月) 17:40:41
みなさん、ありがとうございます。

>>484
うん、最初にそんな感じのことを思いついて、ドット絵の様な汚い文字を無理やり表示させてみました。
どうしても気持ち悪いので、なんとかしたいですが、後回しかも…。

>>484
ヒントありがとうございます。
後日完成を目指すです。
488デフォルトの名無しさん:2007/05/21(月) 21:30:57
フィルタを作成しているのですが、リリースモードでビルドした場合に、そのフ
ィルタを使用すると強制終了が起こってしまいます。
コンパイルエラーは出ません。
デバッグモードでビルドした場合は、問題は起こりません。
強制終了が起こる場所は、おそらくmallocをしているところだと思います。
正確にはmallocを使用している関数で落ちるのですが、その関数の内部は見えま
せん。
デバッグとリリースで、mallocが使えないことってあるのでしょうか。
489デフォルトの名無しさん:2007/05/21(月) 21:47:43
>デバッグとリリースで、mallocが使えないことってあるのでしょうか。
ありません。
490デフォルトの名無しさん:2007/05/22(火) 03:24:02
GrapEditをホストにして普通にデバッガで追ってみれば?
491488:2007/05/23(水) 00:27:49
何かよくわかりませんが、msvcrt.libをリンクしないようにしたら上手く行きました。
どうもありがとうございました。
492デフォルトの名無しさん:2007/05/23(水) 08:32:54
>>460
フィルタを作るのが最善の解決方法かどうかまだ悩んでいるようだけど自分はそれが1番楽な方法だと思う。
俺はヒントというかフィルタの作り方手順を書いたものだが、手順2、3のどこがわからんのか明確化してくれ。
手順3については>>485で調べられると思うけど
493483:2007/05/24(木) 10:22:39
>>492
どうも、お手間をおかけして申し訳ありません。
インプレイスフィルタということで、SDKサンプルのEZrgb24を基本に作っておりました。
フィルタのTansform関数で、引数としてIMediaSampleを受けりますが
これを
・DIB形式に変換
・それをデバイスコンテキストの代入
のところで躓いておりました。

一応やっつけ実装で納得はしてもらったのですが、自分で恥ずかしいので、後で直したいというのが正直なところです。
若輩者で申し訳ありません。
494デフォルトの名無しさん:2007/05/24(木) 21:37:23
いや、俺も若輩ものだから…。楽なのはソースを渡して解析して貰う事なんだがな
それすら今は体力的に自信ない
495デフォルトの名無しさん:2007/05/25(金) 02:39:17
ちょっといいことを教えてあげよう。
EZrgb24ってさインプレイスフィルタじゃないお( ・ω・)∩
違いはね。何のフィルタクラスを継承してるかで決まるんだ
ちなみに「EZrgb24」は「CTransformFilter」を継承してるお
496デフォルトの名無しさん:2007/05/25(金) 03:59:41
WinAPIのDIBってボトムアップ形式のみでなかった?
497デフォルトの名無しさん:2007/05/25(金) 08:12:46
ボトルアップってどういう意味?
座標原点の話しかな。DIBは他画像形式に比べると上下逆さまだけど、変換時にY座標をマイナス値を指定すればどうとでもなる
498デフォルトの名無しさん:2007/05/25(金) 08:34:21
ボトムアップなら単語そのままの意味だが
ボトルアップは飲み終わったボトルを投げ上げるという意味だな
499デフォルトの名無しさん:2007/05/25(金) 18:04:09
なるほど〜私はてっきりボトルを飲み干す事かとおもたよぉ〜

で、、意地悪しないでDIBのボトムアップを教えてくれ
500デフォルトの名無しさん:2007/05/25(金) 23:13:53
>>497でほざいていることがまさにボトムアップ

つーかキーワードがこれだけでてんのに自力で検索くらいしようとは思わんのかね
501デフォルトの名無しさん:2007/05/25(金) 23:26:22
ただ単にBITMAPの話じゃん 画像いじるなら基礎の基礎
502デフォルトの名無しさん:2007/05/26(土) 12:58:18
自作ソースフィルタってどうやってフィルタグラフに追加するんですか?
IGraphBuilder::AddSourceFilterを使ってもデフォルトのソースフィルタが呼ばれるし、
普通のフィルタ同様に、
CoCreateInstance&AddFilterすると、ソースフィルタに読み込むファイル名が指定できません。
503デフォルトの名無しさん:2007/05/26(土) 20:01:49
>>500
>>496の聞きたいことの意味がわからんかっただけで
俺は知ってるからおk。

今日はPCだからしらべてみたけど、ボトムアップという表現
はあんまり使われてないぞ??
■Google調べ 「DIB ボトムアップ」検索結果
っミ【114件】
504デフォルトの名無しさん:2007/05/26(土) 20:27:02
DirectShow スレということで、本家のDirectShowカテゴリ内のページ。

トップダウンとボトムアップの、メモリ上のピクセルの並びの違いについてごくごく簡単に説明している

Top-Down vs. Bottom-Up DIBs
ttp://msdn2.microsoft.com/en-us/library/ms787796.aspx

サンプル画像のセンスの無さには相変わらず笑わせてくれる。
505デフォルトの名無しさん:2007/05/26(土) 21:27:48
ありがとう。本家MSDNが使ってる言葉なのか
今後使っていくよ。
まぁBITMAPの仕様の話であって
あんまりDirectShowとは関係ないとこで使うことになりそうだけど
506デフォルトの名無しさん:2007/05/26(土) 21:32:32
>>502
ごめんボトムアップに気を取られていた
自作フィルタを登録する方法はコマンドラインから
「regsvr32 ぱす&自作フィルタ.ax」でレジストリ登録が必要です。

その後「Graphedt」でフィルタグラフに登録できることを確認するんだよ
それでもできなかったらまた質問しましょう
507502:2007/05/27(日) 02:21:11
>>506
すいません、説明不足でしたが、レジストリ登録、GraphEditでの確認は出来ています。
ただアプリケーションから自作ソースフィルタを使ってファイルを読み込む方法がわかりません。
GraphEditで追加したときは、読み込むファイルを聞いてくるのですが、アプリからソースフィルタを追加しても、ファイルを聞いてこないのです。
508デフォルトの名無しさん:2007/05/27(日) 04:22:30
なるほど。
窓枠の提供はどこがやるの?って事だと認識しました。
自作ソースフィルタを「GraphEdit」で開いた場合、
ファイル選択ウィンドウはディスクトップ画面のド真ん中に出ますか?

もし真ん中に出ない場合、「hWnd」をデスクトップから取っていないことになります。
アプリケーションから渡してやる(=ファイル選択ウィンドウを作って選択結果をフィルタに渡すような設計)
にしてやる必要があるかと思います。

自作ソースフィルタのファイル選択ダイアログを出す部分のソースを晒せば解決できると思いますよ
509デフォルトの名無しさん:2007/05/27(日) 04:26:48
ソースフィルタはIFileSourceFilterインターフェースを持ってるでしょ。
AddFilterした後でそれを呼び出して(QueryInterface)、Loadメソッドを
実行してやるんだよ。
でも、そんな基本的な所でつまずいてるのにソースフィルタ自作とかよく出来たな。
510デフォルトの名無しさん:2007/05/27(日) 12:31:49
手っ取り早くソース晒せといいたい
511502:2007/05/28(月) 12:17:00
>>508,509,510
回答ありがとうございます。

>>509
まさにそれでした!ありがとうございました。
無知ですいません。
512デフォルトの名無しさん:2007/05/28(月) 18:24:46
簡易動画編集のようなことをやるために、複数の動画ファイルを連結して1つのファイルにエンコードしようとしています。
いまのところ、ファイルごとに構築した再生用のフィルタグラフから静止画を取り込みまくって
録画用のフィルタグラフに流し込むやり方を考えているのですが、
こういうバカっぽいやりかたでなく、もっとエレガントな方法はないもんでしょうか。
513デフォルトの名無しさん:2007/05/28(月) 23:44:50
この辺を使ってビデオ再生やってます。
IGraphBuilder
IMediaControl
IMediaEventEx
IVideoWindow
IBasicVideo
ビデオ再生自体は問題ないのですが、サウンドデバイスが複数
あった場合に、音声の出力先を指定するにはどうしたら良いで
しょうか?

現状、Windowsの標準のサウンドデバイスのみ音が出ます。
よろしくお願い致します。
514デフォルトの名無しさん:2007/05/29(火) 00:38:22
DirectShowを使わない
515デフォルトの名無しさん:2007/05/29(火) 03:07:01
ええええええ
まじっすかあああ?
DirectShowって使えねーなぁ!!
ゴミじゃん。M$てめえやる気あんのか?殺すぞ
516デフォルトの名無しさん:2007/05/29(火) 06:00:31
>>515
真偽の程が全く不明な一文にそこまで熱くなれるのもすげえな
517473:2007/05/29(火) 14:57:28
かなり亀レスですみません、あまり作る暇なくて
少しずつやっていたんですが、出来ました。
教えていただいた
ttp://www.shader.jp/xoops/html/modules/xfsection/article.php?articleid=17
↑ここと、あとはここのサンプルソース↓
ttp://www.greenwood.co.jp/~k-aki/article/directshow_movie/directshow_movie.html
を見ながらやって作れました。
(下のURLのサンプルソースは、多分GraphEditで使えるようなDLLとして作るものではなく、
ほぼCBaseRendererを継承してメソッド書いてるだけだったのでわかりやすかったです)
色々ありがとうございました。次は音を取得するのに挑戦しまつ ヽ( `・ω・)ノ
518デフォルトの名無しさん:2007/06/01(金) 16:33:46
test
519デフォルトの名無しさん:2007/06/01(金) 17:49:21
DirectShow編集サービスでWMV9のAVIファイル作ろうとしてるんだけど、
エンコードパラメータの設定がうまくできません。
IAMVfwCompressDialogsで出したダイアログだと、変更が反映されないし。
かといってWMV9フィルタの出力ピンからIAMStreamConfigをqueryしてGetFormatするとエラーになります。
AviUtilだとうまくやっているみたいなんですが、やり方が間違ってるんでしょうか・・・
520デフォルトの名無しさん:2007/06/10(日) 04:56:19
           __
         /:::::::::::::`ヽ_    _
  n      /::::::::::::::::::::::::::l   l L_
,─' ヽ_    _|::::::::::::::::::::::::/)  /   _彡__
三_  ヽ、 l/::::::::::::::::::::::::ヽ / ∠, - 、:::::::\
    `丶、 `/::::ノT` ^ 'l´l:::::|´ /(・|・)) |::::::::::::ヽ
      `ヽW ̄     ̄W /ヽ、_●_/ \::::::::l
        `1  l ヽ  /'´`\_|__三、ヽ::::|
         l  /    / |  __       | l:::l
         l      |__\(  ヽ-'"´)  //:/
         /  ,    |::::::::::ヽニ二二ニ_∠_'/__
         |  l    /つ 、/(〒) ヽ::::::::::::::::::

521デフォルトの名無しさん:2007/06/10(日) 23:23:28
すいませんが教えてください。
この↓を参考にしてMFCで動画再生アプリを作っているのですが、
ttp://www.geekpage.jp/programming/directshow/setnotifywindow.php
DirectShowで動画再生しているウインドウが、別のウインドウの陰に隠れてから
手前に表示されたときなどに再描画されません。
再描画するにはどうすればいいですか?
522デフォルトの名無しさん:2007/06/10(日) 23:34:50
ビデオウインドの親ウインドでWM_ERASEBKGNDをDefaultWindowProcに渡さない。
523デフォルトの名無しさん:2007/06/10(日) 23:50:53
>>522
できました。ありがとうございます
524デフォルトの名無しさん:2007/06/11(月) 22:13:25
まさかだが、>>520 は DirectShow にかけたネタなのか?
525デフォルトの名無しさん:2007/06/11(月) 22:36:29
どらえもんだとおもいます
526デフォルトの名無しさん:2007/06/11(月) 22:43:54
直見せというか、モロダシ?
527デフォルトの名無しさん:2007/06/12(火) 07:31:58
ドラえもんShoWです。
スマンむしゃくしゃしてやった。
今は反省してる
528デフォルトの名無しさん:2007/06/12(火) 10:11:14
静ちゃん・・・
529デフォルトの名無しさん:2007/06/12(火) 21:39:31
静ちゃんは原作名だよね。
原作も途中からアニメに合わせて「しずかちゃん」になってる。

最近にふにふ動画やようつべを見てるんだけどフレームレート変更フィルタ作れば「速聞」みたいなサービス作れるかな
530デフォルトの名無しさん:2007/06/12(火) 21:49:48
最近ようつべてw
いつの人間だよ
531デフォルトの名無しさん:2007/06/14(木) 01:02:27
新しいほうがいいにきまってる
:::::::::::::::::::::::::::::    ,.-ヽ
::::::::::::::::::::::   ____,;' ,;- i                         へ、     /;へ\
::::::::::::::::::   ,;;'"  i i ・i;                       // _l::|___l::|_ヽ:ヽ
:::::::::::::::  ,;'":;;,,,,,, ;!, `'''i;          / ̄ ̄ ̄ ̄\,,     |l/−、 −、:::::::::::::::`::|
:::::::::::  ,/'"   '''',,,,''''--i        /       __ヽ    /::::::|  ・|・  | 、::::::::::::::\
:::::::::  ;/  .,,,,,,,,,,,,,,,,,   ;i'⌒i;       |       |   |、   /::/ `-●−′ \:::::::::::ヽ
:::::::  i;"     ___,,,,,,,  `i".       |       ∩─| |  ,|/ ── |  ──   ヽ:::::::::|
::::::: i;    ,,;'""" `';,,,  "`i;      |      ∪  `l   |. ── |  ──   .|::::::::|
::::::: |  ''''''i ,,,,,,,,,,  `'--''''"       ヽ __/  _.ノ    | ── |  ──     |:::::_l__
::::::: |.    i'"   ";               |――― 、".      ヽ (__|____  /::::| 新 |
::::::: |;    `-、.,;''"             /  ̄ ̄ ̄ ̄^ヽ∞=、  \           /:::,/| 品 |
::::::::  i;     `'-----j          | |      |  |っ:::::)  l━━(t)━━━━┥ |___|
532デフォルトの名無しさん:2007/06/16(土) 00:31:23
Platform SDK インストールしたけど、GraphEdit入ってなかった
533デフォルトの名無しさん:2007/06/16(土) 06:58:35
>>532
C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Bin\graphedt.exe
534デフォルトの名無しさん:2007/06/16(土) 14:14:45
カメラって暗くなると露光を変化させるためにフレームレートがころころかわるやん?
フレームレートを一定にするフィルタを作った人いる?
535デフォルトの名無しさん:2007/06/16(土) 15:54:38
>>533
あ、あった。さんきゅー
スタートメニューにショートカット作ってよねー
536デフォルトの名無しさん:2007/06/16(土) 16:27:00
フレームレートがころころ変わる??
537デフォルトの名無しさん:2007/06/17(日) 00:43:24
>>536
うん。そのカメラの最低露光付近で以下を調べる
「カメラ」-「レンダラ」
の接続で「レンダラ」のプロパティ「品質」タブ
平均フレーム率が明るさで変化するのがわかるよ
538デフォルトの名無しさん:2007/06/17(日) 00:51:45
操作説明する前に何の設定をしている場面なのかを言ってくれ
我々はエスパーじゃないんでね
539デフォルトの名無しさん:2007/06/17(日) 02:49:07
確かにそういうカメラもあったような気がする。
っていうか安物のカメラは結構フレームレートいい加減だったりする

540デフォルトの名無しさん:2007/06/17(日) 02:58:43
>>537
「そのカメラ」ってどのカメラよ?
541デフォルトの名無しさん:2007/06/17(日) 03:47:55
つかカメラやらタブやら、話が唐突すぎるし悪文だしで理解不能
542デフォルトの名無しさん:2007/06/17(日) 08:57:09
プロパティ「品質」タブってグラフエディットでの話か?
だとしたらあれはソースそのもののフレームレートではないよ?
俺ならよくわからん糞カメラだけのためのフィルタなど作る気にはなれないな
543デフォルトの名無しさん:2007/06/17(日) 16:58:49
まあ作ってやってもいいが、ここから先はビジネスになるよ
544デフォルトの名無しさん:2007/06/17(日) 17:22:39
たぶんグラフエディットのことだろうね。

ところでソースそのもののフレームレートじゃないっていうのはどういうこと?
レンダラが捨てるって事?
545デフォルトの名無しさん:2007/06/17(日) 18:00:33
>>543
まじで?たのむ っI

>>544
ソースフィルタが一定間隔に絵を出してこなくなるということだよ
レンダラが捨てるわけではないみたい
546デフォルトの名無しさん:2007/06/17(日) 18:32:00
>>545

>ソースフィルタが一定間隔に絵を出してこなくなるということだよ
>レンダラが捨てるわけではないみたい
つまりソースフィルタが実際に出力しているフレームレートだよね。
それが明るさで変動するね、って話だったと思うんだけど。
547デフォルトの名無しさん:2007/06/17(日) 19:12:30
>>546
うん。その話です。

私は「フレームレートを一定にするフィルタを作った人はいますか?」
という質問をした者なんですが、
暗いときに光を映す場合、フィルムに光を取り込む時間を長めに
取ってやる必要があります。ちゃんとした画像を取り込むのと
シャッタースピードはトレードオフ関係になるのかと思います。

一般的なカメラは上記を自動で行っているので周囲の明るさが変化すると
フレームレートがころころ変わっていく・・・と思っています。
これを時系列処理が必要なフィルタに通した場合問題がおきるので、
フレームレートを一定にするフィルタが必要なのでは?と考えています

どなたか作成した人はいらっしゃいませんか?
548デフォルトの名無しさん:2007/06/17(日) 19:21:29
>>544
メディアタイプとしてののフレームレートってことだとおもう。
レンダラのレートはレンダラが表示できてるレートってことじゃね?
デコーダがうんこだったりPCすぺっくがうんこだと激低かと
549デフォルトの名無しさん:2007/06/17(日) 19:26:05
カメラって何だ?デジカメ?かむコーダ?
記録するフォーマットは何よ?グラフ構成は?DirectShow経験有り?
出すべき情報が出てない感じ。
550デフォルトの名無しさん:2007/06/17(日) 19:36:52
>>549
カメラ・・・USBカメラ(Qcam)を想定していただければいいです
記録フォーマット・・・なし。記録してもしなくてもよし。
グラフ構成・・・ソースフィルタのみ。
        ただ、見るために「ソース」-「レンダラ」でお願いします
Directshow経験・・・およそ3ヶ月。画像関係の変換フィルタ作成ならわかるくらい

>>548
PCスペックが悪くてフレーム落ちすることはこの際無いという前提でお願いします

>>538->>548
「ソースフィルタのフレームレートが外光によって変化すること」
に話の争点がいっていますが、できれば
「フレームレートを一定にする変換フィルタ」についての事を話したいです。

551デフォルトの名無しさん:2007/06/17(日) 19:48:10
そのカメラが本当に正しい絵を取るために露光時間を調節しているのかどうかは不明だが
本来なら正しいレートでがんばって出すべきだと思う(この辺はMSがどう設計しているのかによるが。)
で、そのメーカのソースフィルタがそう実装されてないから後ろでなんとかしましょう、ってことですね?
(Qcamって路地クールのやつでしょ。あれはなんかキャプチャした絵を解析しているっぽいから感光待ちじゃないような希ガス)


どっちかっていうとそのカメラのソースフィルタの性能の問題、あるいはバグに近いので
そもそも、それを正しくするフィルタの需要って無い気がする
自分もそういうフィルタはしらない。

でも一般化して「レートを一定にする中間フィルタ」という意味では需要もあるかもしれないね。

552デフォルトの名無しさん:2007/06/17(日) 19:51:12
タイムスタンプチェックしてバッファしておいた前回映像を投げてやれば良いような気もするが
グラフ構成ソースフィルタのみ??ダウンストリームが無いのに変換フィルタ??
うーん 何がしたいのかますますわかんねーな…

[ソース]-[レンダラ]はダイレクトで繋がるの?メディアタイプはRGB?
本来期待されるべきフレームレートはいくつですか?
ソースが吐き出すタイムスタンプ確認してみた?てんでバラバラの間隔だったのかな
553デフォルトの名無しさん:2007/06/17(日) 20:24:27
>>552
ご回答ありがとうございます。
「タイムスタンプにて・・・の件」
DirectShowのフィルタ同士の動きはイベントドリブンです。
なので、スレッドを立てて別レートで処理するシステムを考えました
>「ソースフィルタ」-ここ6fps-「レート安定フィルタ」-ここ15fps-〜
私のコーディング技術の問題でレート安定フィルタ以降のアロケータを6fps以上で
使うとロックしてしまいうまくいきません。

>[ソース]-[レンダラ]はダイレクトで繋がるの?
繋がりますが私の想定する使い方とは若干違います。
カメラのフレームレートを争点にしていたのでこれを出しました。
本来使いたいのは
「ソース」-「時系列処理が必要なフィルタ」-「レンダラ」
です。

>メディアタイプはRGB?
なんでもいいです。私の作ったフィルタは「RGB24」「RGB555」「RGB565」「IYUV」
「I420」のいづれかを想定して設計しております。

>本来期待されるべきフレームレートはいくつですか?
固定されていれば何でも。あえて決めるとすれば15fpsでよいです
6fpsのカメラであれば同じ画像を2.5回程度下流ストリームに投げるものでいいです

>ソースが吐き出すタイムスタンプ確認してみた?てんでバラバラの間隔だったのかな
う〜ん。どのカメラでやったか定かではないのですがQcamかbuffaloのカメラでは
バラバラでした。自分でも少々不確定なので試していないということでお願いします
554デフォルトの名無しさん:2007/06/18(月) 16:38:27
ちょっと前のFPS倍化の話と同じじゃん。
つーか、サンプルのレートばらばらでも動くように作れよ。
555デフォルトの名無しさん:2007/06/18(月) 22:19:44
VMR9でのデインターレースについて調べてるんですが、デインターレース
について何も設定しなければ、デフォルトの設定でデインターレースが有効
なってるんでしょうか?
テストプログラムで調べてるんですが、VIDEOINFOHEADER2のdwInterlaceFlags
が必ず0になってるんで、デインターレースの設定のしようがないんですが・・・
556デフォルトの名無しさん:2007/06/19(火) 14:35:18
>>555
>VIDEOINFOHEADER2 の dwInterlaceFlags が必ず0になってるんで

「なってるんで」ってのは意味不明だな。0 ならインターレース解除は行われない。
まともな MPEG2 デコーダーでインターレース物のファイルをデコードすれば
適当な値が入るはず。
557555:2007/06/19(火) 16:38:40
>>556
そのメディアが確実にインターレースであると確認する方法がないんですよ。
(見た目ではインターレース縞は確認できるけど)
今、手元にあるDVD数種からVOBをそのままコピーして拡張子をmpgに変えて
テストしてるんですが、InterVideo、Mainconcept、ffdshowどれも0でセット
されてますね。InterVideoはデコーダがインターレース解除じているように
見えますけど。

558デフォルトの名無しさん:2007/06/19(火) 17:10:25
ffmpeg でのビデオの設定で、インターレース解除はオフに(チェックを外す)、
出力で「オーバーレイミキサーを使用する」「ハードウェアインターレース解除」をオンに、と設定してみて。
559555:2007/06/19(火) 18:07:20
>>558
ありがとうございます。ffdshowでそのような設定にしたところ、
dwInterlaceFlagsに0以外が設定され、VMR9初期状態のデインターレスモード
がGUID_NULLから変化しました。何も設定しなくても、インターレース
ストリームが繋がればデインターレースが有効になっていることが確認でき
ました。「ハードウェアインターレース解除」をオンにするっていうのは
レンダラーにインターレースストリームであることを通知するって意味
だったのね。(わかりにくい)
560デフォルトの名無しさん:2007/06/19(火) 23:32:28
ハードウエアインターレース解除をONってのは
ハードウエアでデインタレースするって意味だが。
あとオーバーレイミキサを使用したらVMR9はつながらないということはない?
561555:2007/06/20(水) 00:51:24
>>560
VMR9に繋がってますねぇ。まあ、ffdshowのその設定のとこのバルーンヘルプを
見ると、VIDEOINFOHEADER2ヘッダを使用するかどうかって設定らしいので、
VMRと繋がるかどうかは関係ないんじゃないかな。
あと、ハードウエアインターレース解除をONにしないとdwInterlaceFlagsに0
を入れてくるので、VMRにハードウェアデインターレースさせるって意味みたいね。

562デフォルトの名無しさん:2007/06/20(水) 01:44:55
フリーMLの方にも同じ質問してない?あっちにも途中経過報告よろ。
563555:2007/06/20(水) 02:45:26
>>562
あい、あっちにも報告します。

その後、ひとつ確認ミスがあったので、報告を。
InterVideoは自前でデインターレースしているのではなく、VMR9のデインター
レースを有効にしているようです。InterVideoはなぜかデバッグモードでアプリ
を起動すると、接続を拒否するようです。(デバッグトレースを見られるのが
いやなのかな)それで、InterVideoが繋がってるつもりで、実はMaincncept
が繋がっていたという落ちでした(^_^;)
564デフォルトの名無しさん:2007/06/22(金) 00:45:35
qedit.hとvmr9.hは同居できないかもな。
vmr7.hとvmr9.hは同居できない。なぜなら前者はDirectX7に基づいていて、後者はDirectX9にもとづく。
そしてDirectX7と9は定義の一部が被るので一緒に使えない。
qeditもおそらく同じだろ。

と、さりげなくレスしてみる。
565デフォルトの名無しさん:2007/06/22(金) 14:12:31
>>564
vmr9.h (+その他もろもろ)がインクルードされた後に、

#define _D3DRMOBJ_H_
#define __D3DRM_H__
#include <Qedit.h>

でOK。
566デフォルトの名無しさん:2007/06/24(日) 17:48:41
カメラで画像を取り込みながら、画像処理をしたいのですが、
これはDirectShowを使えば可能なのでしょうか?
具体的にいうとカメラから取り込んだ画像は、リアルタイムで画面に描画しながら、
ある間隔でその画像を取得して画像処理を行いたいです。
また、サンプルなどがあれば教えていただきたいです。
567デフォルトの名無しさん:2007/06/24(日) 17:57:54
可能だYO!サンプルはたくさんあるYO!調べろYO!
568デフォルトの名無しさん:2007/06/25(月) 12:04:22
まず、GraphEditで
カメラ−画像変換フィルタ−VideoRenderer
と繋いであげるといいと思うよ。
画像変換のフィルタは標準では入っていないので、SDK付属のサンプルをビルドしてOSに登録してあげてください。
個人的にはEZrgb24フィルタがお勧め。
VideoRendererはDirectShowフィルタとして標準で入っているので、探してください。
569デフォルトの名無しさん:2007/06/25(月) 22:59:28
フィルタを開発するのに、ある時間の映像を静止画として、メモリに保存しておいて
その画像と現在の画像の差分を出力したいのですが、メモリ上にコピーを保存するコードが分からないのですが
似た様な事を昔やった方や、やり方分かる方いらっしゃらないでしょうか?
570デフォルトの名無しさん:2007/06/25(月) 23:05:00
単に必要な分だけバッファ確保すればいいんちゃうの?
571デフォルトの名無しさん:2007/06/26(火) 00:53:20

 EZrgb24 フィルタを改造して映像に文字を表示するフィルタを作りたいんですが,
どのような手順を踏めばいいのでしょうか?

CEZrgb24::Transform(IMediaSample *pMediaSample) 関数を改造して,

1) CreateDIBSection() で DIB 作成
2) TextOut() で表示

で試したんですが,文字が表示されませんでした….

AM_MEDIA_TYPE* pType = &m_pInput->CurrentMediaType();
VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *) pType->pbFormat;

HDC hDC    = GetDC(NULL);
HDC hdcMem = CreateCompatibleDC( hDC ); // メモリDC を作成
ReleaseDC( NULL, hDC );

void* lpRGB;
HBITMAP hDIB = CreateDIBSection( hdcMem, (BITMAPINFO*)&(pvi->bmiHeader),
                        DIB_RGB_COLORS, &lpRGB, NULL, 0);
// hDIB は NULL ではありませんでした.

このように pvi->bmiHeader から DIB を作成しているんですが,ここが間違っているんでしょうか?

572デフォルトの名無しさん:2007/06/26(火) 04:21:27

 すいません,どうやら非常に恥ずかしい間違いをしていたようです….
このやり方が標準的なのかは分かりませんが,以下のコードで無事表示できました.


int nPicels = pvi->bmiHeader.biHeight*pvi->bmiHeader.biWidth;
int nDataSize = nPicels*pvi->bmiHeader.biBitCount/8;

void* lpRGB;
HBITMAP hDIB = CreateDIBSection( 0, (BITMAPINFO*)&(pvi->bmiHeader),
                       DIB_RGB_COLORS, &lpRGB, NULL, 0);
if(hDIB && lpRGB)
{
  memcpy(lpRGB, pData, nDataSize );// DIB array を映像で初期化

  HDC hdcMem = CreateCompatibleDC( 0 ); // メモリDC を作成
  HBITMAP hOldBMP = (HBITMAP)SelectObject(hdcMem, hDIB); // メモリDC にビットマップを選択

  char szText[256] = "Test string";
  TextOut( hdcMem, 0, 0, szText, strlen(szText));

  SelectObject( hdcMem, hOldBMP);
  DeleteDC( hdcMem ); // メモリDC 削除

  memcpy( pData, lpRGB, nDataSize );//BMP を書き戻す.
  DeleteObject( hDIB );
}
573デフォルトの名無しさん:2007/06/26(火) 19:11:56
Transform(IMediaSample *pMediaSample)

pMediaSample->GetSize();

pMediaSample->GetActualDataLength();
を実行して、メディアのデータサイズを取ったら、どちらも0が返ってきたのですが
これって、何かの使用ですか?
574デフォルトの名無しさん:2007/06/28(木) 10:27:55

 DirectShow のサンプルをみてると JIF, LIF マクロがよく使用されてますが,
機能や使用目的はわかるんですが,これは何の略なんですか?
 どうにも気になるんで御教示下さい.
575デフォルトの名無しさん:2007/06/28(木) 11:47:29
Jump If Failed
Leave If Failed
576デフォルトの名無しさん:2007/06/28(木) 16:02:20
>>575
げ、これマジなの??
577574:2007/06/28(木) 17:09:12

>>575
 有難う御座います.一応ググってみたら LIF の方は Log-If-Failed のようですね.
何はともあれ助かりました.
578デフォルトの名無しさん:2007/06/28(木) 17:11:13
>>577
なら書き込む前にググれよ・・・
それってすげーたち悪いぞ
579デフォルトの名無しさん:2007/06/28(木) 17:13:43
代わりにググってくれ、という書き込みだったのに
ググってくれなかったから、しかたなく自分でググリました、とさ
580デフォルトの名無しさん:2007/06/28(木) 17:16:27
( ´_ゝ`)フーン
581574:2007/06/28(木) 17:52:42

失礼,JIF, LIF macro でググっても関係無いページばかりヒットしてしまい,
わからなかったので質問しました.
582デフォルトの名無しさん:2007/06/28(木) 18:23:23
失礼、すまんかった
583デフォルトの名無しさん:2007/06/28(木) 21:20:37
Return-If-Failed、てのがあっても良いような
584デフォルトの名無しさん:2007/06/28(木) 22:07:33
DirectShowのサンプルではこんなの使ってるな。

#define FAIL_RET(x) do { if( FAILED( hr = ( x ) ) ) \
return hr; } while(0)
585デフォルトの名無しさん:2007/06/28(木) 22:11:06
>>584
やっぱりあるのか・・FAIL_RETか

つかそのマクロの使い方はあれだな、VC6の時のforみたいだな
586デフォルトの名無しさん:2007/06/29(金) 11:51:22
DirectShowでBGMを、DirectSoundで効果音を出そうとしています。
DirectSound側で、IID_IDirectSoundNotifyを用いると、ターゲットのリンク時に
関数が重複しるぞ、ゴルァと言われてしまいます。

リンクしているのは以下のライブラリ
dsound.lib dxguid.lib uuid.lib strmiids.lib

dxguid.libを抜けば、IID_IDirectSoundNotifyのみ見つからないという状態に
なるので、これを使わないコードにすれば良いという話もあるのですが、うまく
共存させる方法はないでしょうか。ご教授お願いします。
587デフォルトの名無しさん:2007/06/30(土) 09:29:53

CComPtr を std::vector に入れても大丈夫?

std::vector< CComPtr<IMoniker> > vtIMonikerArray;

というふうに使いたいんだけど,std::auto_ptr をいれるときのような問題はありますか?
588デフォルトの名無しさん:2007/06/30(土) 19:15:08
>>587
少なくともauto_ptrのような問題が起きることはない
安心して突っ込みたまえ
589587:2007/06/30(土) 21:11:13

>>588
 ありがとう,やってみます.
590デフォルトの名無しさん:2007/07/05(木) 09:35:54
再生レートを設定できるようスプリッタにIMediaSeekingを実装したのですが、
実際にアプリから使用してみると、SetRate(8.0)のように高いレートを設定すると
エラー0x8004025cが返ってきます。
スプリッタ内部のSetRateでは、レートの制限をつけていないのですが、
どうしてかわかりますでしょうか?


591デフォルトの名無しさん:2007/07/05(木) 12:35:20
たぶんオーディオレンダラだな。
592デフォルトの名無しさん:2007/07/05(木) 22:31:42
現在、プログラムを全画面モードで動作させ、そこからムービーを再生(全画面)しようと
しているんですが、なぜかムービーウィンドウがトップにならず、
プログラムウィンドウの裏にまわったりして、きちんと再生されません。
VideoWindowはトップにくるように命令を入れてるんですが、きちんと機能していないみたい。
どなたかご指導お願いします。

// 自前のウィンドウにムービーを再生する
pVideoWindow->put_Owner((OAHWND)m_hwnd);
pVideoWindow->put_WindowStyle(WS_CHILD|WS_CLIPSIBLINGS);
pVideoWindow->SetWindowPosition(0,0,800,600);
pVideoWindow->SetWindowForeground(OATRUE);
pVideoWindow->put_Visible(OATRUE);
// ストリームの再生(グラフの実行)
hRslt = pMdaCtrl->Run();
pMediaEvent->WaitForCompletion(15000, &eventCode);
593590:2007/07/06(金) 09:52:06
>>591

オーディオレンダラをフィルタグラフから外すと成功しました。
ありがとうございました。
しかし、いちいち外したり、接続したりするのは面倒ですね。。
594デフォルトの名無しさん:2007/07/06(金) 12:21:01
>>592
何再生してもそうなる?
ビデオデコーダにDivX本家使うと、再生開始時に何かにアクティブ
ウインドウ奪われちゃうって経験はあるけど。
595594:2007/07/06(金) 12:35:38
>>592
それよく見たら、全画面表示するにはメインウインドウの子
じゃできないような。親をNULLにしたらいいんじゃない?
596デフォルトの名無しさん:2007/07/07(土) 01:13:03
DirectShowで画像を回転させるフィルタでいいのない?
逆さ向けてビデオとってしまったんだorz
597デフォルトの名無しさん:2007/07/07(土) 04:03:29
>>596
ワロタ
てかその修正をフィルタに任せるなよw

動画編集ソフトで回転させるとか
動画を反転回転できるプレイヤー使うとかあるだろ
598592:2007/07/07(土) 18:37:34
>>549>>595 ご返事ありがとうございます。

>>594
再生しているmovieは特別なコーデックを必要としないので、違う原因かと思います。

>>595
親をNULLで再生すると、再生時にメインWIndowが最小化してしまい、全画面モードが
通常画面に戻ってしまいます。(movieは左上で再生)

もうすこし詳しく症状を説明すると、まったく再生しないわけではなくて
成功・失敗をランダムで繰り返します。
成功すれば、メイン画面の前にVideoWindowが出て、普通に再生。
失敗すると、メイン画面の裏にVideoWindowがいるようで、音だけ再生。
このような感じになります。

色々とネット検索したところ、VideoWindowを再描画することで回避可能と見つけたのですが、
組んだところうまくいきません。(症状は同じ)

HWND hChild = GetWindow(m_hwnd,GW_CHILD);
InvalidateRect(hChild,NULL,true);

うーん・・・
599デフォルトの名無しさん:2007/07/07(土) 19:58:50
それは、親ウインドのバックグラウンド再描画で映像ウインドが消されてしまうからじゃないかな。
親ウインドのWM_ERASEBKGNDをDefaultWindowProcに渡さないようにして試してみな。

case WM_ERASEBKGND:
return 0;
でOK
600デフォルトの名無しさん:2007/07/08(日) 13:54:57
>>599ご返事ありがとうございます。

入れてみましたが、現状変わらずです。
元々WaitForCompletionで処理を止めている状態ならウィンドウメッセージが
ムービー再生中に取れることも無いので、SetNotifyWindowでイベント登録
に切り替えてみましたが、やはり同じ状態です。
WaitForCompletionで再生しても裏に回った状態になるので、
WM_ERASEBKGNDを無視しても、同じ症状になるのだと思います。
再生中に定期的にInvalidateRectをVideoWindowに送ってもみましたが、
やはり裏の時は裏で再生されます。

うーむ、もう少し調べてみます。
601デフォルトの名無しさん:2007/07/08(日) 14:11:52
親ウインドは何?
ダイアログ?それともダイアログに貼り付けたCStatic?
602デフォルトの名無しさん:2007/07/08(日) 15:00:15
>>601
以下のスタイルで画面切り替え時にSetWindowLongしたものです。

WS_POPUP | WS_SYSMENU | WS_VISIBLE | WS_BORDER
603デフォルトの名無しさん:2007/07/08(日) 19:36:06
WMPみたいな全画面をやりたいなら、普通にStayOnTopで画面いっぱいのサイズにするだけでおk。
604デフォルトの名無しさん:2007/07/08(日) 20:01:24
>>602ご返事ありがとうございます。

以下のような方法でVideoWindowにTOPMOSTを指定しましたが、
どちらも結果は変わらず、表に出たり裏に回ったりします。

1.
pVideoWindow->put_WindowStyleEx(WS_EX_TOPMOST);

2.
HWND hChild = GetWindow(m_hwnd,GW_CHILD);
::SetWindowPos(m_hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

うーん。
605デフォルトの名無しさん:2007/07/08(日) 20:24:33
ふとスレ見直したんだけど、ownerじゃなくてparentでないのか?
窓の設定が間違っている予感。
606デフォルトの名無しさん:2007/07/08(日) 20:35:11
もうDirectShow関係なくね?
607デフォルトの名無しさん:2007/07/08(日) 20:47:08
>>605ご返事ありがとうございます。

すいません、それは具体的にどのようにすればよいでしょうか?
608デフォルトの名無しさん:2007/07/08(日) 21:17:56
Owner指定なしで、最大化はできんの?
609デフォルトの名無しさん:2007/07/08(日) 21:57:40
>>608
Owner指定無しだと、元の全画面ウィンドウからVideoWindowに移る際に
全画面モードが解除されます。(Movieは左上で再生)
これは、put_FullScreenMode()を実行しでも同じような動作になります。

通常画面からput_FullScreenModeをつかえば全画面でムービー再生してくれるのですが、
全画面モードから使うと、逆に全画面が解除されるようです。
うーん。
610599:2007/07/08(日) 22:11:45
ウインド関係がよくわからない。

ビデオウインドの親ウインドは何?
このウインドを仮にhParentとすると、
hParentウインドに親はいるのか?(or最初からWS_POPUP?)とか
hParentウインドのスタイルにWS_CLIPCHILDRENは設定されているのか?とか
hParentウインド自身は全画面サイズに引き伸ばされ、且つTopに表示されているの?とか
hParentウインドのWM_ERASEBKGNDをちゃんと無視しているの?とか
put_Ownerするタイミングとか

そういうことが知りたい。

611592:2007/07/08(日) 22:36:34
>ビデオウインドの親ウインドは何?
CreateWindowしたWindowが親です。

>このウインドを仮にhParentとすると、
>hParentウインドに親はいるのか?(or最初からWS_POPUP?)とか
画面切り替え時にWS_POPUPとしています。

>hParentウインドのスタイルにWS_CLIPCHILDRENは設定されているのか?とか
指定していませんでしたが、元々メッセージ処理するつもりではなく、movie再生終了まで
処理停止するプログラムです。

pMediaEvent->WaitForCompletion(15000, &eventCode); // 15秒経過するかmovie再生が停止するまで待つ

また、入れてメッセージ処理をするようにしましたが改善されませんでした。

>hParentウインド自身は全画面サイズに引き伸ばされ、且つTopに表示されているの?とか
はい、全画面でTOPです。

>hParentウインドのWM_ERASEBKGNDをちゃんと無視しているの?とか
これも前に書きましたが入れても改善されませんでした。

>put_Ownerするタイミングとか
基本は>>592のソースですが、put_Visibleの直前まで、1行ずつ移動させても改善しませんでした。
また、その前にはVideoWindowの取得になるので移動できません。

こんな感じてす。何か判りますでしょうか。
612599:2007/07/08(日) 23:12:43
この手の問題は大抵は、ビデオレンダラが描画したあとに親ウインドが背景をリフレッシュすることで発生する。
タイミングによってはリフレッシュが先に発生し、あとからビデオレンダラの再描画が行われ、表示される場合もある。
したがって親ウインドがある場合、親ウインドのWM_PAINTの描画処理をクリップして、且つERASEBKGNDをさせなければならない。
WS_CLIPCHILDRENやWM_ERASEBKGNDの処理を確実にしなければ効果がない。

ビデオレンダラの親ウインドにWS_CLIPCHILDRENをいれてみたらどうなる?

もしダメならほかの理由かもね。
613592:2007/07/08(日) 23:36:52
>>612
>したがって親ウインドがある場合、親ウインドのWM_PAINTの描画処理をクリップして、且つERASEBKGNDをさせなければならない。
>WS_CLIPCHILDRENやWM_ERASEBKGNDの処理を確実にしなければ効果がない。
WM_PAINTのクリップ、WM_ERASEBKGNDをDefに流さない、WS_CLIPCHILDRENを入れる。
全てやってみたんですが、やはりダメでした。

>ビデオレンダラの親ウインドにWS_CLIPCHILDRENをいれてみたらどうなる?
上でも描きましたが、入れてみても症状は変わらずです。

そもそもWaitForCompletionで、再生終了まで待つ処理でも症状がでるんですよね。
で、再生終了をイベント取得に切り替えて、PAINT処理を切ったりしてもやはり同じくだめでした。

うーん、タイミング問題だとは自分も思うんですが・・・。
もう少し調べてみます。
614592:2007/07/09(月) 12:22:04
皆さん色々と助言をありがとうございます。
すこし原因らしきものが見えましたのでご報告します。

メインWindowの描画にDirect3Dを使用しているんですが、

全画面モードで
メイン画面の描画を一切やらない → 100%ムービー再生に成功
一度だけDirect3Dでサーフェイスのクリア → 表と裏のランダム再生
一度だけDirect3Dでメイン画面を描画 → 表と裏のランダム再生

どうやらDirect3Dのフロントバッファが問題を起こすようです。
引き続き対策を調べて見ます。
615592:2007/07/09(月) 14:40:31
結局、スマートな方法が見つからず、ムービー再生時には
IDIRECT3DDEVICE9のリセットをおこなってから再生するようにした所
うまくいくようになりました。
おさわがせいたしました。
貴重なご意見をいただき、ありがとうございました。
616デフォルトの名無しさん:2007/07/10(火) 00:26:34
なぜそんな重要なことを。。
617デフォルトの名無しさん:2007/07/10(火) 00:31:05
Direct3Dということはゲームのムービーでしょうか?
618デフォルトの名無しさん:2007/07/10(火) 10:40:38
聞いてどうすんの
619デフォルトの名無しさん:2007/07/10(火) 14:01:52
#include <qedit.h>

#include <d3d9.h>
を一緒にするとエラーが出るんです。

順番変えてもエラーでます

対応策ってありますか?
620デフォルトの名無しさん:2007/07/10(火) 14:16:28
環境とエラー内容は?
621デフォルトの名無しさん:2007/07/10(火) 14:28:13
環境は、
VC2003で
Microsoft DirectX 9.0 SDK Update (December 2004)
だと思います。

#include <d3d9.h>
#include <d3dx9.h>
#include <dshow.h>
#include <qedit.h>
と書くと
c:\DXSDK\Include\d3drmobj.h(46): warning C4005: 'WIN_TYPES' : マクロが再定義されました。
c:\DXSDK\Include\d3drmobj.h(274): error C2061: 構文エラー : 識別子 'LPDIRECT3D'
・・・
等が出ます。

#include <dshow.h>
#include <qedit.h>
#include <d3d9.h>
#include <d3dx9.h>
と書くと

c:\DXSDK\Include\d3dx9math.inl(1924): error C2039: 'm' : 'D3DXMATRIX' のメンバではありません。
c:\DXSDK\Include\d3dx9math.h(310) : 'D3DXMATRIX' の宣言を確認してください。
c:\DXSDK\Include\d3dx9math.inl(769): error C2065: 'm' : 定義されていない識別子です。
c:\DXSDK\Include\d3dx9math.inl(775): error C3861: 'm': 識別子は、引数依存の照合を使用しても見つかりません。
・・・

等が出ます。
622デフォルトの名無しさん:2007/07/10(火) 14:51:17
>>621
d3drm〜ってファイル名から明らかだが
qeditがDirectX7を使ってるからだろ?
一つのコンパイルパスにおいて複数のバージョンのDirectXは同居できない。

>>564-565 にズバリな事が書いているような気がするんだが、これは試したの?
623デフォルトの名無しさん:2007/07/10(火) 14:53:34
ああ、違うバージョンのDirectX自体が同居できない訳ではないな。
ちょっと訂正
624619:2007/07/10(火) 14:56:28
>>565
で通りました。
ありがとうございます><
625デフォルトの名無しさん:2007/07/10(火) 15:08:21
現行スレを検索することくらい、答える側にやらせないで自分でやれよ…ったく
626デフォルトの名無しさん:2007/07/10(火) 16:02:52
うわ
627デフォルトの名無しさん:2007/07/10(火) 16:42:41
まいったねこりゃ
628デフォルトの名無しさん:2007/07/10(火) 22:27:39
まぁいいじゃん。過去ログにまさかズバリがあるとは思わないだろう。
ここ過疎気味だし。
629デフォルトの名無しさん:2007/07/11(水) 06:48:47
YUVの4:2:2→4:4:4補間するDShowフィルタってあるんでしょうか?
630デフォルトの名無しさん:2007/07/11(水) 07:02:28
ない
631629:2007/07/11(水) 07:35:29
>>630
ありがとうございました!
632デフォルトの名無しさん:2007/07/11(水) 23:00:21
YUV422→444作れ。簡単だ。それが嫌なら500円くれたらやる。
633デフォルトの名無しさん:2007/07/12(木) 02:13:15
すいません、オーディオ、ビデオの2つの出力ピンのあるスプリッタを作成してるのですが、
2つの出力ピンともレンダラと繋いで、オーディオのみのファイルを再生すると、音声が流れません。
スプリッタのビデオ出力ピンを未接続にし、オーディオ出力ピンのみをレンダラと繋ぐと音声は再生されます。
ピンから出力データが無い場合に、そのピンを接続するのはいけないのでしょうか?
何とか、ビデオピンも繋いで、オーディオのみのファイルの再生をしたいのですが、
どうしたらよいでしょう?



634デフォルトの名無しさん:2007/07/13(金) 02:01:04
PlatformSDK WindowsServer2003 R2をインストールしました
ドキュメントにはサンプルのTextOutがさもあるように書いてあるんですが
どこにあるかわかりません。
どこにあります?

そのほかのサンプルもなんか無いんですが。。
635デフォルトの名無しさん:2007/07/13(金) 16:06:44
それは古いSDKをとってこないと無いはず(DXSDKまで遡らないと無いものもあり)。
636デフォルトの名無しさん:2007/07/14(土) 00:34:35
あ、そうなんだ。ありがとう。
ちょっくら探してきます。
637デフォルトの名無しさん:2007/07/15(日) 19:51:58
幼女と老婆を酷使する番組w
638デフォルトの名無しさん:2007/07/15(日) 19:52:58

間違えた。無視して
639デフォルトの名無しさん:2007/07/15(日) 22:03:20
だが断る
640デフォルトの名無しさん:2007/07/17(火) 18:48:32
DirectShowはょぅじょとばばぁを酷使しますね。

フィルタをシェアウエアで出したいんだがいいとこある?
641デフォルトの名無しさん:2007/07/18(水) 00:19:37
どんなフィルタ?
642デフォルトの名無しさん:2007/07/18(水) 12:24:38
たとえば
>>401の拡張したやつ
顔を検出するやつ
動物体を検知するやつ
あとはサンプルグラバのこったやつ
643デフォルトの名無しさん:2007/07/18(水) 13:49:33
パターン認識のフィルタならどっかになかったっけ?フリーで。
644デフォルトの名無しさん:2007/07/18(水) 22:06:45
javaで顔認識で心霊写真チェッカーみたいなのがあったけどね。
645デフォルトの名無しさん:2007/07/18(水) 22:32:22
windows2000で最新のPlatformSDK入れたヤツ居る?
BaseClassesをnmakeしようとすると
makefile(53) : fatal error U1083: ターゲット マクロ '' が展開されません。
って出るんだけど・・・。
646デフォルトの名無しさん:2007/07/19(木) 13:38:03
複数のBMPから、AVIを作りたいなーと思って調べていたのですが、
DirectShowのフィルタを自作しなければできないのでしょうか??
647デフォルトの名無しさん:2007/07/19(木) 22:14:14
別にヘッダさえ付けてやればできる(俺はそうした)
使った方があとあとシステムにしやすいから作ったら??
648デフォルトの名無しさん:2007/07/19(木) 22:19:26
ちなみに自分ならBMPファイルを連続で読み出しメディアサンプルに乗せるだけのソースフィルタを作る。
2週間程度時間があればね〜☆

時間なければヘッダを直にバイナリにかく。
649デフォルトの名無しさん:2007/07/19(木) 22:49:12
今ビデオ見てて気づいたけどさ
ド、ド、ドリフの大爆笑〜♪  というところ
ダ、ダ、ダイレク、ダイレクトショウ〜♪  に聞こえるよな
650デフォルトの名無しさん:2007/07/19(木) 23:12:20
いや、それはない
651デフォルトの名無しさん:2007/07/20(金) 22:00:27
ありがとうございます!勉強してみます!
652デフォルトの名無しさん:2007/07/20(金) 22:24:49
がんがれ〜RIFFチャンクは先頭に付けてLISTチャンクはBMPの生画像の間に付けるんだぞ〜。
後動画によっては上下さかさまに気をつけて〜。(たぶん問題ないけど)
653デフォルトの名無しさん:2007/07/20(金) 22:33:19
>>649
クソワロタ.うん聞こえる。ダ、ダ、ダイレク、ダイレクショウ〜♪
654デフォルトの名無しさん:2007/07/22(日) 00:23:16
ないない
655デフォルトの名無しさん:2007/07/22(日) 02:58:50
すいません。質問です。
動画を一律30FPSにするDirectShowのフィルターってどう作ればいいですか?
方法が思い浮かばないので・・・ヒント教えてください
656デフォルトの名無しさん:2007/07/22(日) 09:48:17
タイムスタンプいじるとか
657デフォルトの名無しさん:2007/07/22(日) 19:41:18
作れたら私にも使わせてください
658デフォルトの名無しさん:2007/07/23(月) 00:55:08
質問です。
2つの映像入力を何らかの形で合成し
1つの出力として吐き出すフィルタを作成しています。

最終的に、出力ピンに繋がった入力ピンのReceive()に
合成結果であるIMediaSampleを渡せば良いというのはわかるのですが、
映像の同期がうまくとれません。
(同期というかそれぞれの入力から1フレームずつ取得して出力したい)

どのようにすればよいでしょうか?
659デフォルトの名無しさん:2007/07/23(月) 07:56:53
【派遣ネガティブ根性チェック】

3つ以上、チェックがつけばアナタの性格はひん曲がっており、
ネガティブ負け組派遣人生を歩んでいます。

□派遣先正社員の作った糞開発ツールはたとえ腐っててもマンセーして使う
□派遣先の人事権のある社員の意見はたとえ間違っていてもマンセーする
□仕様とは正社員から口伝されるものだ
□耳で聞いた仕様を正確に覚えていないのは自分の責任だ
□昼食は必ず派遣先の社員と行くべきだ
□自分の仕事で問題が発生しても解決するのは派遣の仕事ではない
□派遣先から「いつまでもここで仕事してくださいね(安い金でw)」と言われて嬉しい
□自社で仕事なんてできるわけがない
□派遣労働の問題点の話題が出ると感情剥き出しにして反論する
□派遣労働の問題を指摘する人は嫌いだ
□派遣先には仕事だけでなくプライベートについてもグイグイ引っ張って欲しい
□奢ってくれる派遣先正社員を尊敬する
□自分の月額金額を知らないのは当然だ、単金を聞いてはいけない
□派遣先正社員より自分の生涯収入が低いのは当然だ
□チビは派遣先にかわいがってもらいやすいから派遣には有利だ
660デフォルトの名無しさん:2007/07/23(月) 21:04:26
>>658 入力Aと入力B、両方受信を確認してから合成、出力すればいいだけの話じゃないの?
入力ソースがライブ(プッシュ)だったりする?
661658:2007/07/24(火) 10:24:31
>>660
AddSourceFilterでハードディスク上のムービーファイルを扱う場合って
どっちになるんですかね?
プッシュモデルにするかプルモデルにするかは
やっぱりソースフィルタに依存します?
662デフォルトの名無しさん:2007/07/24(火) 21:32:14
>>661
ハードディスク上のムービーファイルなら通常プルモデル。
パーサー(スプリッタ)がデータを引っ張り出して後ろに流します。
んで入力2系統あるらしいけど、両方ともハードディスク上のムービーファイルなの?
ファイル形式はなんですかね?
663デフォルトの名無しさん:2007/07/25(水) 17:12:59

AMCap を参考にプログラムを作っています.

OleCreatePropertyFrame() でビデオキャプチャピンのダイアログを表示できますが,

ttp://pukapuka.sakura.ne.jp/cgi-bin/upload/puka/img-box/1185348928740.jpg

 上記の 「色空間/圧縮」,「出力サイズ」をダイアログからではなく,プログラム上から制御
したいのですが,どのようにすれば可能でしょうか?
 具体的には,これらの値の列挙,現在の値の取得・変更を行いたいと思っています.

 参考になるページ等もありましたら御教示下さい.
664デフォルトの名無しさん:2007/07/25(水) 17:21:17
キャプチャピンのIAMStreamConfig で設定する。
Connect する前にね。
665663:2007/07/25(水) 21:56:05
>>664 有難う御座います.おかげさまで以下のようにして取得と変更が出来ました.

 CComPtr<IAMStreamConfig> pAMStreamConfig;
 hr = pCaptureGraphBuilder2->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
                              pVideoDeviceFilter, IID_IAMStreamConfig,
                              (void **)&pAMStreamConfig);
 if( SUCCEEDED(hr) )
 {
   AM_MEDIA_TYPE* pMediaType;
   pAMStreamConfig->GetFormat( &pMediaType ); // 現在の設定を取得

   pMediaType->subtype = MEDIASUBTYPE_YUY2;// YUY2 に変更

   VIDEOINFOHEADER* pVideoInfoHeader = (VIDEOINFOHEADER*)pMediaType->pbFormat;
   pVideoInfoHeader->bmiHeader.biWidth = 640; // 640 wide
   pVideoInfoHeader->bmiHeader.biHeight = 480; // 480 height に変更

   pAMStreamConfig->SetFormat( pMediaType );//設定を反映

   DeleteMediaType( pMediaType );
 }


 列挙も pAMStreamConfig->GetNumberOfCapabilities() と GetStreamCaps() で実現できそうです.
有難う御座いました.
666658:2007/07/27(金) 15:52:03
>>662
>両方ともハードディスク上のムービーファイルなの?
>ファイル形式はなんですかね?

とりあえずは両方ともハードディスク上のもので
ファイル形式はAVIでやってます。
667デフォルトの名無しさん:2007/07/31(火) 15:19:35
枯れてる内容かもしれないんだけど・・・

ttp://wwwdoi.elec.nara-k.ac.jp/html/jisyu/dxm/ds/index.html
ここのlist702サンプルを実行して、mpgファイルなんかだと問題なく静止画取り込みができるんだけど、
とあるDivX6エンコードのaviファイルで実行すると、GetConnectedMediaType()で取ったAM_MEDIA_TYPEの
pbFormatがNULLになってしまい、ビデオ情報が取れないみたいなんですが一体どういう原因が考えられるんでしょうか。
ファイル自体はMediaPlayerで再生できています。
668667:2007/07/31(火) 15:46:23
補足です。

DivXファイルだとISampleGrabberCBでのコールバックの指定も無視されてしまうようです。
キャプチャされないように何かロックされてる?
669デフォルトの名無しさん:2007/07/31(火) 17:13:25
まずフィルタグラフ全体がどうなっているか調べると良い。
あとpbFormat以外のメジャータイプとサブタイプを見たほうがいい。
もしかするとDivX6はパーサーとデコーダがセットで使用されていて、
パーサーとデコーダは互いを知っているのでpbFormatなんか使わないっていう実装かもしれん。
そこにサンプルグラバがパーサーとデコーダの間に挟まれば、ありうる。
670667:2007/07/31(火) 17:32:37
>>669
ありがとうございます。
さらに調べてみたら、どうもDivXはRGB24への自動変換をサポートしていなかったり結構中途半端な模様。
で、レンダラまで自前実装してやるとキャプチャできる(SDK付属サンプルのWindowlessなら動く)ようなので、
そっちをベースにした実装にしたいと思います。
671デフォルトの名無しさん:2007/07/31(火) 20:55:11
フィルタの中でビットマップをリサイズするようにしたらすごく遅くなった
コマ落ちばっかりです
なんか早くする方法はありませんか?
672デフォルトの名無しさん:2007/07/31(火) 23:18:45
リサイズ処理を見直す
673デフォルトの名無しさん:2007/08/01(水) 22:13:09
どうやってリサイズしてるんだ?

普通にCで書いて間に合わないんなら、SIMD命令使え。
それでも間に合わないんならPCをパワーアップ。
674デフォルトの名無しさん:2007/08/01(水) 22:25:01
ロジックが悪い。
675デフォルトの名無しさん:2007/08/01(水) 22:40:55
すいません。質問です。
CTransformFilterの中で今の時間を取得することはできますでしょうか?
シークするとTransformに渡ってくるIMediaSampleのGetTimeやGetMediaTimeの時間が0に戻ってしまって、今の時間がわからなくなってしまいます・・・

それからCTransformFilterから動画の長さ(再生時間の合計)を知る方法ってありますか
676デフォルトの名無しさん:2007/08/02(木) 09:54:52
今の時間・・・?エスパーすると聞きたいことは「動画スタートしてからの時間」だとは思いますが、現在時刻の取得は下記のようにできます。
SYSTEMTIME st;
GetLocalTime( &st );
こんな感じ。

CTransformFilterから動画の長さをとることはできますが、フィルタ設計上
カメラもつなげる想定で作るべきっぽいから書いていいんだろうか
677デフォルトの名無しさん:2007/08/03(金) 01:26:18
動画スタートしてからの時間でした。すいません
教えてください〜
678デフォルトの名無しさん:2007/08/03(金) 03:13:20
動画であれば投げてきたフレーム枚数をカウントしてやって
それをfpsで割るのが「動画スタートからの時間」を得るのには最適だと
思うよ。変にタイマを使ったりすると動画のレートが変わった時点で
使えなくなっちゃうから。わからんならコードをどっかにうpするよ

んで動画の長さを得るのは、ソースフィルタから変換フィルタに渡してやるような
つくりにするのはどうでしょうか?
679デフォルトの名無しさん:2007/08/03(金) 19:35:31
DirectX SDKのドキュメント探したけど
"シーク可能ストリームでは、メディア タイムは常にストリームの開始タイムから相対的になる。"
とあるからGetMediaTimeはシークしても時間は0にならないみたい。
さっき試してみたけどそうなっていました。
680デフォルトの名無しさん:2007/08/04(土) 01:05:41
>>678-679
ありがとうございます
試してみます
681デフォルトの名無しさん:2007/08/06(月) 23:28:44
IAMCameraControl::GetRange()でCameraControl_Exposureの範囲を調べたのですが、
手持ちのWebカメラでは0〜100や0〜130といった値が返ってきました。
http://msdn2.microsoft.com/en-us/library/ms779747.aspx
によると、2^0 = 1sec〜2^130secといった、大きな値に相当してしまいますが、
単位はあてにできないのでしょうか?
せめて+1する毎にexposure timeが二倍になってほしいのですが、
何か方法があったら教えてほしいです。
682デフォルトの名無しさん:2007/08/07(火) 00:48:42
Webカメラに露光時間なんて設定可能なの?
露光時間って、写真の撮影で、弱い光でも感光版が感光できるようにシャッタースピードを遅くするとかのあれだよな?
683デフォルトの名無しさん:2007/08/07(火) 00:54:49
キャプチャをするのに

pCaptureGraphBuilder2->SetOutputFileName( &MEDIASUBTYPE_Avi , L"test.avi" , &pFileOut , &pSink );
pCaptureGraphBuilder2->RenderStream( &PIN_CATEGORY_CAPTURE , NULL , pDeviceFilter , NULL , pFileOut );

というようなグラフ構築を行ったのですが、何回かテストしてtest.aviを上書きするとき、
上書き前の容量より小さいと、ファイルのプロパティに表示される容量が上書き前のまま
になります。(上書き前より大きいと更新されます)
再生してみると、正しくキャプチャされているのですが、この容量表示の問題はどのように
すれば解消できるでしょうか?
(表示上だけでなく、実際に無駄な容量が付加されているのかも?)
684デフォルトの名無しさん:2007/08/07(火) 14:30:46
>>683
DeleteFile
685683:2007/08/07(火) 21:00:18
>>684
上書きは基本的にしないようにするもの、ということですね。
ありがとうございました。
686デフォルトの名無しさん:2007/08/08(水) 05:39:26
領域確保しとくとキャプチャの時パフォーマンスが良くなる効能があると言っておこう。
削除の場合は実際にエントリが書き換えられるので、サイズを0にするのも有り。
RIFF解析して自前でサイズ調整するのも意外と簡単だよ。一番外側のチャンクだけ計算するだけで済むしな。
687683:2007/08/09(木) 00:58:47
>>686
そういう方法もあるんですね。
ありがとうございます。
688デフォルトの名無しさん:2007/08/09(木) 07:52:41
3:2プルダウンを行うDirectShowフィルタってあるんでしょうか?
689デフォルトの名無しさん:2007/08/09(木) 21:37:52
サンプル元に作っちゃえば早くね?
690デフォルトの名無しさん:2007/08/09(木) 22:26:35
>>688
世界中のソフトハウス探せばどっかにあると思う。
691688:2007/08/09(木) 23:30:48
なるほど。
簡単に手に入れられるなら作る必要もないと思ったのですが、作る価値はありそうですね。
やってみます。
ありがとうございました。
692デフォルトの名無しさん:2007/08/11(土) 10:56:07
Nullレンダラが作れなくて困っています。
GraphEditではあるのですが、アプリでインスタンスを作成できません。

CoCreateInstance( CLSID_NullRenderer , NULL , CLSCTX_INPROC_SERVER , IID_IBaseFilter , ( void** )&pNull );

このように書いたところ、ビルド時にCLSID_NullRendererが定義されていない、と言われます。
調べてみると、qedit.hにあるようなので、includeしたところ、今後はdxtrans.hがないと言われました。
でも、このヘッダファイルはPC内にはありませんでした。

どのようにすれば作成できるでしょうか?
693デフォルトの名無しさん:2007/08/11(土) 13:10:14
>>692
そのファイル名で検索すると幾つか情報が見つかるんだが・・・

俺のPCにはDirectX SDKの中に普通に入ってた。
つかDirectXSDKとPlatformSDKはいつのを使ってるかくらいは書いたほうがいいと思うぞ。
694692:2007/08/11(土) 14:06:01
>>693
Windows SDKのバージョンは最新だと思います。
DirectX SDKはインストールしていませんでした。
最新版のJune 2007を入れたら、それに入っていました。
VC++でインクルードパスを指定したのですが、それでもコンパイルはエラーになります。
エラーの内容は、DirectX SDKのIncludeフォルダにあるd3drmobj.hというファイル内に
構文エラーがある、というものがたくさん。
あと、
To compile qedit.h you must install the DirectX 9 SDK, to obtain the dxtrans.h header.
というエラーメッセージも。
695デフォルトの名無しさん:2007/08/11(土) 14:31:58
FLVファイルのシークでIMediaSeeking::SetPositions()を使うとフリーズしてしまいます。

必ず発生するというわけではないのですが、高確率で発生します。
スプリッタにflvsplit.dllを使用した時のみこの現象がおきます。
WMPやMPCでは普通にシークできているので、コーディングの問題だと思うのですが...
思い当たる点として、WMPやMPCと違う部分はISampleGrabberを咬ませていることぐらいです。
(シーク時にSetBufferSamples(FALSE)を指定しても変化無しでした)

原因が分かる方はいませんでしょうか。
696デフォルトの名無しさん:2007/08/11(土) 14:34:08
>>694
なんか言ってることが
>>564-565 とか
>>621-623 あたりと全く同じに聞こえるんだが、これは試したの?ちゃんとレスを検索してる?
697695:2007/08/11(土) 14:34:19
>>695に追加
フリーズと言ってもCPU使用率が0%なので、処理をしているわけでは無いみたいです。
698692:2007/08/11(土) 15:47:32
>>696
すみません、そのレスは見てませんでした。
早速、試しましたけど、ダメでした。
699デフォルトの名無しさん:2007/08/11(土) 16:01:43
ダメって何だよ
>>565ためしても>>621みたいなのが出るってこと?
700デフォルトの名無しさん:2007/08/11(土) 16:57:43
>>698
GUID CLSID_NullRenderer = {0xc1f400a4, 0x3f08, 0x11d3, {0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37}};
701デフォルトの名無しさん:2007/08/11(土) 17:28:22
>>698

レスがそうさくしてめんどいのであまり読んでないが、
NULLレンダラのCLSIDが定義されているヘッダを読み込んだら
こんどはDirectXのヘッダが見つからないって言われたんだろ?

最新のPlatformSDKでDirectShowを使うには同時にDirectXSDKをインストールする必要がある。
もう試した?

>>700
のようにソースにじかに定義しても動くだろうが、PlatformSDKとDirectXSDKをインストールするのが正しい解決方法。
702デフォルトの名無しさん:2007/08/11(土) 17:41:03
>>701
>>693 >>694読めよ・・・ 指摘されてどっちもインストールした、って書いてんだろ

あと「レスがそうさく」、って何? 「錯綜」(さくそう)って言いたいのかな?
レス読まずに余計なレスすると余計にレスがそうさくするよ?
まずは日本語を勉強して、レスをちゃんと読むことから訓練しましょう。
703デフォルトの名無しさん:2007/08/11(土) 18:26:35
まぁまて。間違った情報で答えてる訳でもなし、がんがって回答してくれようとしてる>>701さんせめちゃらめぇぇ。

704デフォルトの名無しさん:2007/08/11(土) 18:41:20

質問者はスレを全く検索せずに質問
回答者はレスを全く読まずに回答、しかも日本語が不自由

これはひどい
705デフォルトの名無しさん:2007/08/11(土) 19:07:55


     ',::::j ==ュ  r== 〈::::::j
     fヾ}.., __ i i..__    l:イ  めんどい!
     lと', ゚ ̄ ,l l  ゚̄   ,リぅ!
     ヽ-ヘ .,_ ,ィ''。_。ヽ、_,. /_ン'   レスがそうさくしてめんどい!
        ', /  _   }  ,'
        l、{  |__〉 /!


706デフォルトの名無しさん:2007/08/11(土) 21:06:39
フィルタの作成と開放についてなんですが、
基本的には

CoCreateInstance( ・・・ );
pGraphBuilder->AddFilter( ・・・ );
・・・
pCaptureGraphBuilder2->RemoveFilter( ・・・ );
pFilter->Release();

という流れですが、以下のようにリリース前に再度作成、追加するのはマズいでしょうか?

CoCreateInstance( ・・・ );
pGraphBuilder->AddFilter( ・・・ );
・・・
pCaptureGraphBuilder2->RemoveFilter( ・・・ );
・・・
CoCreateInstance( ・・・ );
pGraphBuilder->AddFilter( ・・・ );
・・・
pCaptureGraphBuilder2->RemoveFilter( ・・・ );
pFilter->Release();
707デフォルトの名無しさん:2007/08/12(日) 21:50:14
pFilterってフィルタグラフの事じゃないの?
だとしたら基本的に下なんじゃない?
ソースフィルタだけを入れ変えたい時など、わざわざフィルタグラフごと新規で作り直したりはしないよ。
708706:2007/08/12(日) 22:10:24
>>707
すみません、pFilterというのはIBaseFilter型DirectShowフィルタの例です。
おっしゃる通り、キャプチャデバイスフィルタなどを入れ替えるときに下の手順を踏んでいます。
問題ないようであれば良かったです。
ありがとうございました。
709デフォルトの名無しさん:2007/08/12(日) 23:11:46
CComPtr 使ってみれ
710706:2007/08/13(月) 11:15:01
>>709
これは便利ですね。
ありがとうございます。
711デフォルトの名無しさん:2007/08/15(水) 00:41:29
SetOutputFileName()メソッドとRenderStream()でキャプチャデバイスからの映像データを
AVIファイルに保存するようにしました。
キャプタを実行 → グラフ停止 → ファイルライタに繋がるピンを切断
と進めるた時点では保存したAVIファイルは再生できるのですが、上記流れの後、グラフを再生
すると、AVIファイルが使用中となり再生できなくなります。
アプリを閉じれば再生は可能ですが、アプリ使用中においても再生できるようにするには
どのようにすればよいでしょうか?
なお、ファイルライタはRelease()で参照カウントのデクリメントを行っています。
よろしくお願いします。
712692:2007/08/16(木) 08:08:47
>>700
これでできました。
ありがとうございました!
713デフォルトの名無しさん:2007/08/16(木) 17:57:09
Webカメラの映像を録画する単純なプログラムを作っているのですが
・キー入力があるまでプレビューを表示
・キー入力があると録画を開始
上記を行うために、録画前にStop()→キャプチャピンを繋ぐ→Run()としてるですが
Webカメラの露光やホワイトバランスなどの自動設定が初期化されるので
プレビューの状態からStop()せずに録画を行う方法はありますか?
714デフォルトの名無しさん:2007/08/21(火) 11:40:44
コンポジット入力から映像を取得したいんだけど
DirectShowで取得できるハード知らない?
io dataのGV-MVP/TZが手元にあるんだけど、なんか無理そうなんだ
715デフォルトの名無しさん:2007/08/21(火) 14:27:46
>>713
キャプチャピンの先にFileWriterか何かつないでるんかな。
SampleGrabberやTeeを挟んで自前で横取りするようにしてみては。
716デフォルトの名無しさん:2007/08/24(金) 03:55:14
>>714
GV-VCP3R/PCI はダメ?
これでアプリ書いてるけど普通に
S-Video×1、コンポジット×2の
キャプチャデバイスとして見えてる。

もっとも玄人志向のTVチューナ付きに比べると
かなり高いのが難点やなあ。
717デフォルトの名無しさん:2007/08/24(金) 05:13:32
718デフォルトの名無しさん:2007/08/24(金) 16:03:37
すみませーん、DirectShowとか初めて使うんですけど、仕事の書類に
「DirectShow.dllにアクセスして・・・云々」って書いてあるんです
けど、PlatformSDKインスコしてもDirectX9.0cインスコしても、そん
なのどこにもないんですよー。DirectShow.dllって自前で作るんです
か?どうやって?
719デフォルトの名無しさん:2007/08/24(金) 16:15:31
その書類、DirectShow と DLL の間のピリオドはほんとにあったのか?
720デフォルトの名無しさん:2007/08/24(金) 17:17:03
自社製の共通DLLナンジャネ?
721デフォルトの名無しさん:2007/08/25(土) 03:22:01
.NETでそんな名前のDLLを見たような気がする
722デフォルトの名無しさん:2007/08/26(日) 21:55:50
間違えてzipで固めたmp3ファイルをDirectShowに流し込んだら再生された
すげえな
723デフォルトの名無しさん:2007/08/28(火) 01:56:12
zipを展開して再生してるわけじゃないぞ
たぶん
724デフォルトの名無しさん:2007/08/28(火) 12:40:56
Stored(非圧縮)で格納されてるならmp3データの先頭まで検索してそこから再生する
Inflateで格納されてたらNG
725デフォルトの名無しさん:2007/08/28(火) 17:54:30
あっち方面ではmp3をアルバム単位なんかで無圧縮zipで固めたものが良くある。
関連付けの都合なんかで.zip.mp3なんて拡張子が付けられていることも当たり前。
726デフォルトの名無しさん:2007/09/03(月) 00:13:21
Meida Playerのレンダリングプラグインが作りたくて
Media Plyaer SDKと戦っているんですが、
どっかわかりやすいwebページありませんか?
散々ぐぐったけど日本語で書いてあるのはGoogleキャッシュにのこってた
1サイトしかありませんでした。
http://72.14.235.104/search?q=cache:msvxh08gfA0J:developer.mine.nu/
wiki/index.php%3FWMPSDK%252FDSP%25A5%25D7%25A5%25E9%25A5%2
5B0%25A5%25A4%25A5%25F3%25B2%25F2%25C0%25E2+%E3%81%82%E3%8
1%84%E3%81%9D%E3%81%B3%E3%80%80%E9%96%8B%E7%99%BA+Meida+Player+SDK&hl=ja&ct=clnk&cd=4&gl=jp
727デフォルトの名無しさん:2007/09/06(木) 04:28:02
CTransformFilterを継承してフィルタを作成すると
それを読み込んだアプリケーションの終了時にメモリリークが出る
最初は解放の手順が間違っているのかなと思ったんだけど
Grapheditでそのフィルタを読み込んだときも、終了時にエラーがでる。
CTransformFilterを継承しているインプレイスフィルタでも同じ
考える限りSDKにうついているCTransformFilter自体に根本的なバグが隠れている気がするんだが…
728デフォルトの名無しさん:2007/09/06(木) 05:01:53
アレだよ、アレ。COM。
729デフォルトの名無しさん:2007/09/07(金) 17:17:21
フィルタのピン接続について

一度接続したフィルタの画像サイズを変更することは可能でしょうか?

実際にやりたいこと
320*240で描画していたところを途中から640*240サイズのストリームを
描画する方法があれば教えてください。

CBaseOutputPinで作成しております。
730デフォルトの名無しさん:2007/09/07(金) 21:59:21
フォーマットチェンジたい
731デフォルトの名無しさん:2007/09/10(月) 19:08:17
>>730
フォーマットチェンジはどのようにすればいいですか?

(追記)
CTransformFilterからの派生でGetMediaTypeを使用して出力ピンの情報を取得
し、変更をこころみたんですがだめでした。
732デフォルトの名無しさん:2007/09/11(火) 23:13:08
フィルタグラフは再生したまま?停止してピンの再接続はだめ?
あと、入力、出力両方のメディアタイプをかえたいの?
733デフォルトの名無しさん:2007/09/12(水) 15:59:31
>>732
停止してピンの再接続はOKです。
(停止せずに出来るのであればベターです)
変更は出力のみの変更です。
734デフォルトの名無しさん:2007/09/12(水) 21:17:40
サンプルのフラグを立てるたい
ダウンストリームが受け入れるかどうかはフィルタ次第ばい
735デフォルトの名無しさん:2007/09/13(木) 11:02:14
>>734
サンプルのフラグを立てるとはどのようにすればいいですか?

YV12などのグラフィックボード依存のフォーマットでなくRGBで接続しているので
サイズ変更で受け入れが出来ないことは考慮してないです。
736デフォルトの名無しさん:2007/09/13(木) 20:53:53
CBaseInputPin::Receiveあたりをチェックするとよかばってん
受け取る相手が何をするのか書いてあるからチェックチェック
737デフォルトの名無しさん:2007/09/14(金) 11:32:34
>>736
Receive関数の引数IMediaSample *pで出力先のピン情報は取得
出来るのですが書き換える(更新する)方法がわからないです。
SetMediaTypeで新規情報(サイズ変更)を設定しても初期設定の
情報は書き換わってないです。
738デフォルトの名無しさん:2007/09/14(金) 14:49:08
メディアタイプを大きく変えるってことはサンプルバッファのサイズも変えるんだろ?
SetMediaType なんかじゃ済まず、アロケートし直しが必要になってくるような気がする。
739デフォルトの名無しさん:2007/09/14(金) 15:34:32
>>783
サンプルバッファのサイズは変更しません。
初期値で必要な最大サイズを設定しています。

メディアタイプでの変更はサイズのみです。
VIDEOINFOHEADERで設定するbiWidth,biHeightの値のみの変更です。
740デフォルトの名無しさん:2007/09/14(金) 15:36:05
すいません。

>>738様でした。
741デフォルトの名無しさん:2007/09/15(土) 08:05:23
Media Foundationのスレがないみたいだから、ここで質問させてください。
Vistaで、bcdedit /debug onを実行すると、MPEGのDecodeが動作しなくなります。

Q1  これはProtected Media Pathのせいなんでしょうか?それとも、Vistaに付属しているMPEG Decoderの仕様なんでしょうか?
Q2  MPEG Decoderの仕様だとしたら、Kernel Debugできる環境で動く他のMPEG Decoderはありますか?
742デフォルトの名無しさん:2007/09/15(土) 16:23:02
VMR9で最大3つの動画ファイルを透過率を任意に変更しながら
表示を切り替えるプログラムを作成しています。

SDK内のサンプルプログラムBlenderでは、
2つのファイルの同時再生/透過率変更は行えるようですが、
個々のファイルに対し、再生/停止/シークといった制御が
行えません。(再生時には2つ同時に再生されてしまう)


このようなプログラムを開発する場合、何か参考になる
情報がありましたらお教え下さい。
743デフォルトの名無しさん:2007/09/15(土) 23:15:41
あのうVMRのインタフェースIBasicVideo2のGetPreferredAspectRatio以外から
ムービーのアスペクト比を取得するにはどうしたらいいでしょうか?

アスペクト比が設定されているのですがIBasicVideo2が使えない状況に
ありまして困っております。
744デフォルトの名無しさん:2007/09/18(火) 14:02:47
>>741
Q1. (DVD再生時以外は)おおむねベンダ独自の耐タンパの仕組みのせい。
Q2. ffdshow
745デフォルトの名無しさん:2007/09/18(火) 17:30:33
ffdshowでMPEGを有効にすると色々と不安定になるんだが…
746デフォルトの名無しさん:2007/09/20(木) 08:59:09
キャプチャーボードのチューナから動画と音声と取り込むいわゆる録画アプリを作ろうとしているものです。
Geekなページの記事を見ながら、チューナからの動画は表示(プレビュー?)できたのですが、音が出ません。
音周りの処理が書かれている様子もないので当然だと思うのですが、それに関する情報が見当たりません。
MSDNの概要あたりを眺めてもみました。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdx8_c/ds/appdev/capture_intro.asp
眺めてみたのですが、どのインターフェイスを使えばいいのかわかりません。
IAMAudioInputMixerかと思っているのですが、メソッドを眺めるとミキサ全体のようでこれだけではないような気がします。
この辺りの情報ってありませんか?
ヒントがいただければと思います。
747デフォルトの名無しさん:2007/09/20(木) 15:13:22
>>4
748デフォルトの名無しさん:2007/09/20(木) 15:18:56
>>746
クロスバー
749デフォルトの名無しさん:2007/09/22(土) 06:17:44
こんなスレで質問していないで、早く試行錯誤でバグ回避策を見つける仕事に戻るんだ!
何?やる気がありません?なら辞めろや、他の派遣雇うからw
750デフォルトの名無しさん:2007/09/23(日) 18:56:30
はいはい
751デフォルトの名無しさん:2007/09/24(月) 20:52:13
GraphEditを使って目的のフィルタグラフを構築できることを確認したんですが、
これをプログラムとして記述する際、困ったことが起きました。
フィルタを生成するのにCoCreateInstance関数を使いますが、このとき必要なGUIDが
分からないフィルタがあるんです。
Microsoftから標準で提供されているフィルタはMSDNを調べればGUIDが分かりますが、
そうでないフィルタは分かりません。
どうすればそのフィルタのGUIDを知ることができるでしょうか?
ご助言、よろしくお願いします。
752デフォルトの名無しさん:2007/09/24(月) 21:18:10
GraphEditでわかると思ったけど。
753751:2007/09/24(月) 21:32:35
>>752
すみません、どこを見ればよいんでしょうか?
例えば、NullレンダラーのGUIDは
{0xc1f400a4, 0x3f08, 0x11d3, {0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37}}
ですが、
GraphEditを見てもこの記述があるところが見つけられません。
754デフォルトの名無しさん:2007/09/24(月) 23:46:54
久しぶりにGraphEdit立ち上げてみたよw
メニューの[Graph]-[Insert Filter] から ダイアログ立ち上げたら
DirectShow Filter -> NULL Renderer 選んでください。んで、展開すると Display Name の後に
@device:sw:{083863F1-70DE-11D0-BD40-00A0C911CE86}\{C1F400A4-3F0B-006008039E37}
ってあるよね。
後半の { } を見てくれ。これってGUIDじゃない?

君に幸あれ
755デフォルトの名無しさん:2007/09/24(月) 23:51:19
やべー11D3-9F0B が抜けてたw 手打ちだったからゴメンな けどまあわかるよね。
最悪、フィルタ名でレジストリ検索したりとか、まあ頑張ってください
756デフォルトの名無しさん:2007/09/24(月) 23:56:18
手打ちかYO!
Guidにしては何か微妙に短いと思ったw
757751:2007/09/25(火) 00:07:16
>>754
うわー!気付きませんでした!w
ほんとうにありがとうございました!! 。゜(゜´∀`゜)゜。
758デフォルトの名無しさん:2007/09/25(火) 00:14:29
手打ちだYO!よく頑張りましたで賞くれYO! 
困ったらまたおいでお嬢さん
759デフォルトの名無しさん:2007/09/25(火) 02:34:15
とてとていつ転ぶか心配な歩き方をする>>751(幼女)と
有識者だけどおっちょこちょいの>>752(褒め言葉)で盛り上がるスレはここですか。
760デフォルトの名無しさん:2007/09/25(火) 07:12:46
はいはい
761デフォルトの名無しさん:2007/09/25(火) 10:24:35
direct showで二ヶ国語の音声ストリームを切り替えて再生するには
どのようにコーディングしたら良いでしょうか。
762デフォルトの名無しさん:2007/09/25(火) 20:04:08
かたっぽのボリューム0にしとけばいいんじゃねーの?
763デフォルトの名無しさん:2007/10/02(火) 15:58:31
Compact FrameworkからDirectShowを呼び出そうとしています。
QuartzTypeLib.dllに参照設定して
 RenderFile()→各種設定→Play()
とすると(初回だけ)再生出来るのですが、もう一度別のファイルを
RenderFile()したあと、IVideoWindowを再取得して
スタイルを設定しようとしたところで0x80004002が発生します。

MSDNによると再度RenderFile()するためにはフィルタを全削除しろと
あるのですが、QuartzにはEnumFilters()やRemoveFilter()がないので
やむなくいったんFilgraphManagerを解放→GC.collect()してから
RenderFile()しても、結局上記と同じ場所で例外が起きてしまいます。
アドバイスよろしくお願いします。
764デフォルトの名無しさん:2007/10/02(火) 20:53:59
>>763
中で使われているフィルタが怪しい
765デフォルトの名無しさん:2007/10/02(火) 20:55:26
>>761
自作の変換フィルタ間に入れてデータがLRとなっているのをLLかRRにすればいいんじゃないの?
766デフォルトの名無しさん:2007/10/02(火) 21:28:38
数秒のAVIを数十個連結して再生させたいのですが、
単純にどんどんファイルを読んで再生とかやると継ぎ目に真白なフレームがはさまったり汚くなってしまいます
音なしのAVIなのでそこまでシビアにつなげられなくてもいいのですが
映像として奇麗につなげるには
グラフ内でソースをどんどん切り替えていく、って形になるんでしょうか?
767763:2007/10/02(火) 22:41:48
>>764
やはりそんなところですかね…。
ただ一応、開発ターゲットの端末に添付の再生アプリでは
ふつうに別のファイルを再生できるので、回避策はあるのかも知れません。

フィルタを削除するさいにやっておく後始末とかって
何かあるんでしょうか。
768763:2007/10/03(水) 02:39:01
ちょっと待て…解決(?)したかも知れません。

試しに思い切ってQuartzTypeLib.dllを参照する方法を止め、
[ComImport, Guid(...), ...] interface IGraphBuilder ... { ... }
と手動で定義する方法(DirectShowNetで採用してるもの)にしたら
ちゃんと動くようになりました。

typelibでラップする方法の不具合かな? CE限定なのかは謎。
ちなみにその端末だとやっぱりIEnumFiltersは取得できても
Next()で未実装エラーが戻りました。とにかくCE要注意。
769デフォルトの名無しさん:2007/10/03(水) 17:59:04
>>766
再生リスト(.wpl)使えば順番に再生してくれる
770デフォルトの名無しさん:2007/10/03(水) 18:00:04
>>768
たまたまかもよ
デバッガで追うべし
771デフォルトの名無しさん:2007/10/03(水) 22:06:41
>>766
音なしのAVI程度なら avi 関連 API と DrawDibDraw で・・
772768:2007/10/04(木) 05:29:28
>>770
や、これまで再現率100%だったのがこの改良で全く出なくなったので、
対処方法としてはこれで間違いなさそうです。

COM相互運用(マネージドとCOMのやり取り)はけっこう高度な
トピックらしいですね。するとCEは関係ないかも。

一度QuartzTypeLib.dll(tlbimpというツールに自動生成させる)を
解析したものと、DirectShowNet方式の手動定義を比較して、
ちゃんとした原因を突き止めてみたいです。
773デフォルトの名無しさん:2007/10/07(日) 18:30:13
DirectX初心者質問スレから誘導されてきました。

DirectShowで再生してる動画の上にテキストを置きたいんですけど(ニコニコ動画みたいな感じに)
普通に再生している動画をSetWindowPositionでウィンドウに表示させて、そのウィンドウの子ウィンドウとして
スタティックコントロールを動画の上に置こうとすると、動画の下に隠れてしまいます。
WS_EX_TOPMOSTを指定しても隠れてしまいました。

そこで、SetWindowPositionでウィンドウに動画を表示させるのをやめて
グラバフィルタでフレームを取得して、フレームを取得するごとに呼ばれる
コールバック関数内で取得したフレームをウィンドウに再描画するという形にしたところ
スタティックコントロールが上手く見えるようになりました。

しかし、今度は動画の再生が進むうちに動作が重くなってしまい、コマ飛びが起きるようになってしまいました。

コマ飛びが起きないような方法はないでしょうか。
774デフォルトの名無しさん:2007/10/07(日) 18:38:02
サンプルのVMRとかVMR9にある奴じゃダメなの?
775773:2007/10/07(日) 19:08:58
>>774
ありがとうございます。
VMRについて少し調べてみたんですが、確かに動画とテキストを合成して
表示するような形にすれば出来そうです。

ただ、773に書いたような方法ではテキストは表示せずに動画を再生しているだけで
重くなってしまいます。

VMRを用いて、動画とテキストを合成して再生する方法だと、動画再生自体が重くなる
ようなことはなくなるでしょうか。
776デフォルトの名無しさん:2007/10/07(日) 20:46:42
サンプルを試せばいいと思うお
777デフォルトの名無しさん:2007/10/07(日) 22:05:35
適切に書けば重くならないし、阿呆なことをすれば>>773のような阿呆な動作になる。
自分の書いたプログラムが悪いのに、他に原因があるように思っている時点で、
どうやって処理させても結果は同じ。
778デフォルトの名無しさん:2007/10/09(火) 19:36:44
ttp://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/directshow.html#stillcap2_abst
をもとに、ISampleGrabberCBインタフェースの実装を試みているのですが、
『error C2512: 'CUnknown' : クラス、構造体、共用体に既定のコンストラクタがありません。』
『error C2614: 'mySampleGrabber' : イニシャライズ リスト内のクラス 'Cunknown' が基本クラスでもメンバでもありません。』

の2つのエラーが出てしまいます。ヘッダファイルやリンクの問題は解決したと思うんですけど
C++に慣れていないのでここからどう直せばいいかが分かりません。
以下、ソースです(行数の関係で詰めているので見にくいと思いますが…)

class CGrabCB: public CUnknown, public ISampleGrabberCB{
public:
DECLARE_IUNKNOWN;
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv) {
if( riid == IID_ISampleGrabberCB ){
return GetInterface((ISampleGrabberCB*)this, ppv);
}
return CUnknown::NonDelegatingQueryInterface(riid, ppv);
}
// ISampleGrabberCB のメソッド
STDMETHODIMP SampleCB(double SampleTime, IMediaSample *pSample){
return E_NOTIMPL;
}
STDMETHODIMP BufferCB(double SampleTime, BYTE *pBuffer, long BufferLen){
cerr << "Sample time: " << SampleTime << "\t";
cerr << "BufferLen: " << BufferLen;
cerr << endl;
SaveOneImage("C:\\tmp.yuv", pBuffer, BufferLen); // 後に定義する
return S_OK;
}
// コンストラクタ
CGrabCB( ) : CUnknown("SGCB", NULL){ }
};
779デフォルトの名無しさん:2007/10/09(火) 20:45:34
CUnknownコンストラクタのパラメータが実は3つってことはないよね?
780778:2007/10/09(火) 21:49:39
すみません。strmbase.libを作ってリンクさせたらコンパイルは通ったんですけど
今度は部分DECLARE_IUNKNOWNマクロで実装されているAddRef()周りが原因で
プログラムを起動した瞬間強制終了してしまいます。

DECLARE_IUNKNOWN部分を自分で実装して、AddRef()のみ実装しないようにしたところ
一応動作はするようになりました。

AddRef()を実装するために、他に実装する何かがあるのでしょうか。
781デフォルトの名無しさん:2007/10/09(火) 23:38:58
以下のように AviMux → ファイルライタ を準備してファイルへのキャプチャを行っているのですが、

pCaptureGraphBuilder2->SetOutputFileName( &MEDIASUBTYPE_Avi , キャプチャファイルのパス , &pFileOut , &pSink );
pFileOut : AviMux( IBaseFilter型 )
pSink : ファイルライタのインターフェイス( IFileSinkFilter型 )

キャプチャ終了後、AviMuxのピンを切り離し、プレビュー用のグラフ再生を行うと、ファイルライタが
グラフ内に残っているため、それによって作成したファイルが使用中となって再生できません。
キャプチャが終了したファイルはすぐに再生して確認できるようにしたいのですが、
(現状はグラフ停止中かアプリを終了しないと再生できません)
どのようにすればよいでしょうか?

上記のような便利なユーティリティ関数を使わず、地道にファイルライタ( IBaseFilter型 )の
インスタンスを作成して、ファイル名の設定、フィルタグラフの構築、と進め、キャプチャ終了後、
ファイル名を変えるかファイルライタを削除するかなりをしないといけないでしょうか?
782デフォルトの名無しさん:2007/10/10(水) 03:18:00
CBaseVideoRendererを継承したレンダーを作成したいのですが、DoRenderSampleの実装の部分で詰まっています。

HRESULT CGrabRenderer::DoRenderSample(IMediaSample *pMediaSample) {
HRESULT hr=S_OK;
CAutoLock mylock(&m_CritSec);
LPBYTE pbSrc=NULL;
const long lActualSize=pMediaSample->GetActualDataLength();
pMediaSample->GetPointer(&pbSrc);
// 表示ウィンドウからデバイスコンテキストを取得して描画
if(IsWindow(m_hwnd)==TRUE) {
BITMAPINFO bi={m_Vih.bmiHeader};
const HDC hdc=GetDC(m_hwnd);
RECT rect;
GetClientRect(m_hwnd,&rect);

StretchDIBits(hdc,0,0,rect.right-rect.left,rect.bottom-rect.top
,0,0,m_Vih.bmiHeader.biWidth , m_Vih.bmiHeader.biHeight
,pbSrc,&bi,DIB_RGB_COLORS, SRCCOPY);
ReleaseDC(m_hwnd,hdc);
}
return hr;
}

この実装方法をインターネット上のソース等を参考に試したのですが、音声だけが再生され、画像が表示されません。
pMediaSample->GetPointer(&pbSrc);でpbSrcにビットマップを読み込んでいると思っていたのですが、MSDNを参照したところ
GetPointer()は引数のバッファへのポインタを返すだけなようです。そうすると、直前で宣言、しかもNULLを代入しているpbSrcへの
ポインタを取得したところでビットマップを読み込めていないのではないかと考えたのですが、IMediaSampleでの画像の読み込み方法が
分かりません。

長文ですみません。
DoRenderSampleはどのように実装したら良いのでしょうか。
783デフォルトの名無しさん:2007/10/10(水) 03:23:30
なんでエラー値をチェックしないの?
784デフォルトの名無しさん:2007/10/11(木) 18:55:44
http://www.geekpage.jp/programming/directshow/renderfile-url.php

を元に、DirectShowで擬似ストリーミングを行おうと思ったのですが
ネットワークからダウンロード中はプログラムが固まってしまい
ダウンロードが全て完了したら再生出来るような形になってしまいます。
単にファイル名をネットワーク上のファイルにするだけでは駄目ということでしょうか。

これだとローカルにファイルを落として、そのローカル内のファイルを
再生するのと変わらないので意味がないのですが、DirectShowで
ストリーミングを行う場合、自作のソースフィルターを作らないといけないのでしょうか。

出来れば完全なストリーミング、難しければ擬似ストリーミングを考えています。
785781:2007/10/12(金) 21:50:32
自己解決しました。
pSink->SetFileNameで名前を変更すれば録画ファイルは解放されました。
786デフォルトの名無しさん:2007/10/17(水) 19:07:53
USBカメラからの画像をキャプチャして、jpg形式などで保存できるようなプログラム
を作成したいのですが、お勧めの書籍などありましたらご教授願えないでしょうか。
directxやdirectshowには触れたこともない初心者なのですが、これは無謀というも
のでしょうか?
787デフォルトの名無しさん:2007/10/17(水) 20:06:54
自分で作らなくても誰かが作ってることも多い。
ライブラリでも何でも探してみるとよろしいかと
788デフォルトの名無しさん:2007/10/17(水) 20:36:16
サンプルグラバで検索したらサンプルがたくさん出てくる
789デフォルトの名無しさん:2007/10/17(水) 20:50:46
OpenCVでもいけるんじゃない?
790デフォルトの名無しさん:2007/10/18(木) 04:16:21
たしかにOpenCVの方が向いてる気がする
791デフォルトの名無しさん:2007/10/18(木) 04:17:56
DirectShowなら
 ttp://www1.bbiq.jp/kougaku/link_videocap.html
が参考になると思う
792デフォルトの名無しさん:2007/10/18(木) 14:03:41
OpenCV使用の場合、OpenCVのカメラ種類サポート内ならとても楽に実現可能
サポート外なら
 DirectShowでカメラ画像取得→画像形式変換→OpenCVで処理
という手が使える・・・ちょっと面倒くさいが
793デフォルトの名無しさん:2007/10/25(木) 18:25:24
SetRateで速度変えたときに音程を維持するにはどうすればいいでしょうか?
794デフォルトの名無しさん:2007/10/25(木) 18:40:25
>>793
1.5倍速再生で声が甲高くならないように、とか?
オーディオレンダラの前にフィルタを追加して、
再生速度に応じてピッチを変更する。

ピッチ変更の処理の実装にはLGPL のライブラリなんかもあるね。
ttp://www.surina.net/soundtouch/

GPL が嫌なら自分で作っても1.5倍位までならそう聞き苦しくないものが
簡単にできる。
795デフォルトの名無しさん:2007/10/28(日) 03:51:40
> 786
もしかして他スレで動画をフーリエ変換したいと質問されていた方かな?
そうだったらこんなところに誘導するような羽目になってすいません。

単にWebカメラから動画をキャプチャしたいというならdirectshow付属のgrapheditを使ってしまうのが楽だと思いますよ
grapheditから、フィルタを呼び出して
カメラとFilewriterフィルタを繋いで上げましょう。間に動画圧縮のフィルタを入れてもよいです。
あとは、aviutil等のツールから連番のbmpで吐き出してしまえばよいと思います。
(他のツールもあるかも)

directshow自体は、それなりにプログラム経験と能力のある人でも使い方覚えるだけで一月くらいはかかるので
大学の学部クラスで大学からプログラム覚えたとかなら苦労は避けられないかと・・・。
796デフォルトの名無しさん:2007/11/01(木) 16:53:14
質問です。
DirectShowのデコーダフィルタ部で、オーディオのタグ情報(曲名など)は取得できないのでしょうか?

やりたい事は、MP3デコーダ(自作)でタグ情報を取得し、アプリに投げてやるという事です。
どうも上流のMPEG-1 Stream Splitterからは、タグのデータが流れてこない気がします。

例えば、先頭にタグの付いたMP3ファイルをDirectShowで再生すると、
デコーダにはタグ部のデータは渡されず、タグの後のフレームデータから渡されるようです。

入力ピンのWAVEFORMAT構造体の後ろにタグがあるかと考えましたが、そこにも無いようです。

どうかヒントをお願いします。

797デフォルトの名無しさん:2007/11/01(木) 20:04:02
普通に考えるとタグ情報なんてデコーダもレンダラも要らないから流さないんじゃないの?
もしスプリッタがタグ情報を流してくれるとするならば、ヘルプにどのように格納して渡すのか記しているはず。
一般的にはアプリケーションがそのMP3をパースしてタグ情報を引っ張り出して表示するんじゃないかな。
それともどっかに「タグ情報流すよ」みたいな記述があったの?
798796:2007/11/02(金) 01:28:50
>それともどっかに「タグ情報流すよ」みたいな記述があったの?

いや無いですが、そういう要望があったので、可能なのかと思って質問しました。
何かのビデオで入力ピンのAM_MEDIA_TYPEのVIDEOINFOHEADERの後ろに
ヘッダが格納されていることがあったので、同じようにどこかにあるかと思っていました。
となるとデコーダからタグ情報を得るのは難しそうですね…
799796:2007/11/05(月) 19:06:27
上記についてですが、調べたところ、IAMMediaContentというインターフェイスを使えば良さそうです。
スプリッタがこのインターフェイスを実装していました。
ということで解決しました。ありがとうございました。
800デフォルトの名無しさん:2007/11/05(月) 19:44:07
なるほど。
801デフォルトの名無しさん:2007/11/14(水) 19:09:38
DirectShowを始めて間もない初心者です。
DVキャプチャしつつ同時に
プロキシファイルを作成しようと考えているのですが、
どんな方法が考えられるでしょうか。
MSDVからの出力をInfTeeでふたつに分けて
片方はDVAVIに落とし
もう片方はエンコード処理をしてプロキシファイルに落とす、というのは素人の考えでしょうか。
出来ればプロキシの方は5分単位で分割して複数ファイル作りたいです。
DirectX,Window SDKs共に最新のものをインストールしてあります。
ご教授宜しくお願いします。


802デフォルトの名無しさん:2007/11/14(水) 20:03:22
>>801
それでもいいですけど、Inplace フィルタを作って、そ奴が間に入って素通ししつつ
プロキシファイルも作るって方が簡単だと思いますよ。

性能面で余裕があるなら、標準入力から DV ストリームを受け取って
プロキシファイルを作るexeを CreateProcess してパイプで流すとか
そんな構造にするとデバグも楽です。
803デフォルトの名無しさん:2007/11/14(水) 20:56:58
>>802
ありがとうございます。
Inplaceフィルタと聞いてパッと浮かんでこないですが
イメージ的にFileWriterフィルタの機能を持たせつつOutPutで
入力されたストリームを流すということでしょうか

フィルタを作るというのが想像できなくて
素人が1から作れるものでしょうか。
作る上で802さんが参考になられたサイトとかありますでしょうか。
804デフォルトの名無しさん:2007/11/15(木) 15:18:17
>>803
そんな感じです。
NullNull フィルタサンプルを改造してゆくのが一番簡単・・・
と思ったんですが、現行の SDK には含まれていないのかな。

だとすると tee で分けて Dump フィルタの改造版で書いてゆくのが
いいかも知れませんね。

マルチスレッドのプログラミングに慣れていれば(あるいは慣れる気があるなら)、
普通のフィルタを素人が1から作るのはそう難しくはありません。
(ソースフィルタやスプリッタ、パーサは別。これらは結構難しい)

参考になるサイトはありません。
805デフォルトの名無しさん:2007/11/15(木) 20:49:37
>>804
ありがとうございます。
NullNullフィルタサンプルは見つかりませんでしたが
Dumpフィルタを改造してみます。

もうひとつ問題にあたってしまって
エンコードするほうの処理ですが
Splitter→(V)DVDecoder→ASFWriter(V)
     →(A)→→→→→→ASFWritter(A)
とGraphEdit上で接続、ビデオのほうは繋がりましたが
オーディオの方が「中間に必要な…」というメッセージが出てしまい
繋ぐことが出来ません。
実はDVキャプチャといいましても
HD(TV局などで使う機器、出力解像度は1920*1080)で
音声の周波数が48kHzのようです。
一般的なDVのほうは上記のフィルタ構成で接続確認は出来ました。
こちらは32kHzらしくてAsfWriterが32kHz以上対応していないんじゃないかと思い
調査していましたが情報は手に入らず・・・。
何か知っていればご教授下さい。
806デフォルトの名無しさん:2007/11/16(金) 12:51:26
SDKのサンプルとネット上の情報を頼りにフィルターを作っています。
ちょっとわからない事がありましたのでどなたか教えていただけないでしょうか。
プロパティページの OnReceiveMessage で、マウス関係のメッセージを拾ってくれません。

INT_PTR CHogeProperties::OnReceiveMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  switch (uMsg)
  {
  case WM_MOUSEMOVE:
        Point_x = LOWORD(lParam);
        Point_y = HIWORD(lParam);
        //ここにフィルターへマウス座標を通知するコードを書く
        return (LRESULT) 1;
    }

  return CBasePropertyPage::OnReceiveMessage(hwnd,uMsg,wParam,lParam);

}

これじゃダメなんでしょうか。
WM_LBUTTONDOWN とか WM_LBUTTONUP なんかも拾ってくれないのですが・・。
こちらが提供すべき情報で、これ以外に何か必要なものがありましたら指摘していただけませんか。
807デフォルトの名無しさん:2007/11/19(月) 21:07:55
pMediaSeek->SetPositions と pSampleGrabber->GetCurrentBuffer を使い
差分タイムを指定して、mpeg2動画のスクリーンショットを取得しようとしています。
@指定:100 100秒ごとに画像取得
A指定:1 1秒ごとに画像取得
しかし、プログラム動作がうまくいったと思っても、上記のような指定をした際に
@での100秒時の画像と Aでの100秒時の画像 が食い違う現象がおきてしまいます。
(違うといっても誤差1秒程度のもののようですが・・)

上記の関数を使って mpeg2から確実に指定位置の画像を取得する方法を知りたいのですが・・。
808デフォルトの名無しさん:2007/11/19(月) 23:24:30
>>807
よく状況がわかんないけどAが間に合ってないの?
809デフォルトの名無しさん:2007/11/20(火) 03:00:49
>>806ですがコントロールをサブクラス化したら上手くいきました
810デフォルトの名無しさん:2007/11/20(火) 06:38:41
レスありがとうございます。
少々長くなりますが、詳細を書いてみます。
今現在は、このような形になっています。

n100TimePos //nsec時間

pSampleGrabber->SetOneShot(true); //サンプルが届く度にグラフを停止
pMediaSeek->SetPositions(&n100TimePos, AM_SEEKING_AbsolutePositioning, NULL, AM_SEEKING_NoPositioning); //指定位置へのシーク
pMediaControl->Run();
Sleep(3000); //必要はないです SetOneShot の動作確認のために入れたものです。
long param1, param2; loop = true;
while( loop ){
hr = pMediaEvent->GetEvent(&evCode, ¶m1, ¶m2, 100);
if( hr==S_OK ){
switch( evCode ){
case EC_COMPLETE : //イベント確認
printf("EC_COMPLETE\n");
pMediaControl->Stop();
loop = false;
break;
default:
printf("------\n");
break;
}
}
else{
printf("loop\n");
}
}
pSampleGrabber->GetCurrentBuffer(&nBufferSize, (long *)(rgbImg)); //イメージ取得

811デフォルトの名無しさん:2007/11/20(火) 06:47:49
少し文字化けしてしまいました・・。
hr = pMediaEvent->GetEvent(&evCode, param1, param2, 100);

理解の仕方が間違えているとまずいので質問します。
上記のようにsleepを挟むと 指定時間からかなりずれた画像が取得されます。
SetOneShot(true);によって グラフの動作は停止するはずなので Sleepを入れても問題ないと思ったのですが
実際には サンプルが届いても停止していないのでしょうか?

また、下記でGetEventによりイベント取得をしていますが、
GetState関数で Running や Stopped を参照していた際は いつまでたってもRunningが来続けていました。
SetOneShot(true); はサンプルを行った際にグラフを停止するとの事だったので、Stop に切り替わるものと
考えていたのですが、考え方が違うのでしょうか・・。

多分、この辺りの理解が間違っているから、今のような状況に陥っているような気がするのですが・・。
他にも、StopWhenReady や WaitForCompletion など色々組み合わせてもうまくいかないので
ご教授願えるとありがたいです。
やりたい事は、最初に書いたとおり
pMediaSeek->SetPositions と pSampleGrabber->GetCurrentBuffer を使い
差分タイムを指定して、mpeg2動画のスクリーンショットを取得しようとしています。
です。
812デフォルトの名無しさん:2007/11/20(火) 06:52:01
ちなみに、スリープを入れた場合、そのsleepで指定した時間分後ろにずれた感じになります。
こちらとしては、どんなに処理が重いときでも、
処理が間に合ったから取れたとかでなく、同じタイム指定を行ったときは同じ画像が得られることを期待したいのです。

813810〜812:2007/11/20(火) 12:04:08
コールバックを使ったやり方で こちらの思惑通りの動作が出来たような気がします

これからテストを重ねて検証してきます


お騒がせしました
814デフォルトの名無しさん:2007/11/20(火) 12:33:21
805です。
とりあえず回避策として一度DVEncoderを使ってDVMuxで
映像と音声と同期させた後、もう一度DVSplitterで映像と音声を分けて
AsfWriterに繋ぐことができました。

またまた質問になってしまいますが
テープが録画可能状態かというの情報はどうしたら取得できるでしょうか。
GraphEdit上でMSDVのプロパティページを開くと
テープのつめの状態で書込み可能か書込み出来ないか出来ています。
IAMExtDeviceかIAMExtTransportが怪しいのですが
それらしいメソッドが見つかりませんでした。
IAMExtDeviceのED_DEVCAP_CAN_RECORDと思ったのですが
テープのつめを変えてもステータスの戻り値に変化ありませんでした。
DirectShowサンプルのDVCapにもそれらしい記述は見当たりません。

どうかもう一度ご教授下さい。宜しくお願いします。
815デフォルトの名無しさん:2007/11/26(月) 22:00:16
Windows Media Format SDKの質問なんですが、専用スレがなかったためここで質問させてください。

現在ストリーミングサーバとしてWindos Media サービスを使い
Windows Media Format 11 SDKで作った動画プレイヤーで
MMSプロトコルのストリーミング再生を行っています。

但し、MMSプロトコルですとシークの度にバッファリングが起きてしまい
再生速度を変えるためにIWMReader::Start()を呼び出すと、その度に
バッファリングが起きてしまいます。

MMSプロトコル、Windows Media Format 11 SDKで、バッファリングを起こさずに
スムーズな再生速度変更を行う方法はないでしょうか。
816デフォルトの名無しさん:2007/11/26(月) 23:08:19
ぜんぜん詳しくないんだけど、ヘルプ読む限りではは、Startメソッドだと必ずバッファリングがおきる、
バッファリングを起こさないためにはResumeメソッドを呼べ、って書いてるけど、これじゃだめなのかな?
(再生速度は変更できない、とか?)

Any call to Start while paused is treated as a seek through the file, and incurs a buffering penalty from
network files. This is true even for calls to Start with the WM_START_CURRENTPOSITION value.
To continue playing from the current paused position with no buffering penalty, call Resume.
817815:2007/11/26(月) 23:17:56
>>816
ありがとうございます。

一旦Pauseして、Resumeすれば再生速度も1倍になるかもしれないと思ってやってみましたが、無理でした。
PauseしないでResumeすると、やはり何も起こりません。

再生速度のみ変更するような関数があればよかったのですが・・・。
818デフォルトの名無しさん:2007/11/26(月) 23:29:14
何の経験も無い俺はぐぐって出てきたヘルプをコピペするしかできんかったごめん
819デフォルトの名無しさん:2007/11/27(火) 17:15:28
DvAviファイルからAsfファイルに落とす構成を
GraphEditを使いながらいじってのですが
なぜか一度Video,Soundレンダラを通して
グラフを再生させないとAsfWriterのAuidoが繋がりません。

一度レンダラを使ってグラフを再生させると何が変わるのでしょうか。
820デフォルトの名無しさん:2007/11/28(水) 03:17:10
Builderが賢くなったかTransform Filterの状態が変わったのかかどっちかかねえ
821デフォルトの名無しさん:2007/11/28(水) 17:03:37
>>820
ありがとうございます。

原因を調べてみる必要がありますが、
とりあえず動いたみたいなのでこれで良しとします。
822デフォルトの名無しさん:2007/11/29(木) 20:56:27
とりあえず動いてるから良し、ですか。
個人趣味ならいいけど仕事だと気持ち悪いよねぇ…
823デフォルトの名無しさん:2007/11/29(木) 22:13:14
DirectShowを使うような、他社製の挙動の怪しいコンポーネントが
連動して動くアプリの場合はある程度しようがないよ。
824デフォルトの名無しさん:2007/11/30(金) 00:06:41
Microsoftは遅かれ早かれDirectShowを見捨てそう
825デフォルトの名無しさん:2007/12/02(日) 23:34:36
hResult = CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (LPVOID *)&g_pGrph );

WCHAR wszFileName[260];
MultiByteToWideChar( CP_ACP, 0, name, -1, wszFileName, 260 );
hResult = g_pGrph->RenderFile( wszFileName, NULL );
if( FAILED(hResult) )MessageBoxA(hWindow,"PlayShow()内 その名前のムービーはないです","PlayShow No2",MB_OK);

// フィルタ グラフの構築
hResult = g_pGrph->QueryInterface( IID_IMediaControl, (LPVOID *)&g_pMdaCtrl );
hResult = g_pGrph->QueryInterface( IID_IVideoWindow, (LPVOID *)&g_pVdoWin );
hResult = g_pGrph->QueryInterface( IID_IMediaEvent, (VOID **)&g_Event2 );

// ウィンドウ内で出力
RECT grc;
g_pVdoWin->put_Owner( (OAHWND)hWindow );
g_pVdoWin->put_WindowStyle( WS_CHILD | WS_CLIPSIBLINGS );
GetClientRect( hWindow,&grc );
g_pVdoWin->SetWindowPosition( 0,0,grc.right,grc.bottom );

// フィルタ グラフの開始
g_pMdaCtrl->Run();

// ムービーが終わるまでここから先へは進ませない
g_Event2->WaitForCompletion(INFINITE,&g);
if ( g == EC_COMPLETE ){
no.movie_end = 1;
UninitShow();
}
音だけしか出ません;;
なにかご指摘があるのならお願いします
826デフォルトの名無しさん:2007/12/02(日) 23:50:30
// ウィンドウ内で出力
から
// フィルタ グラフの開始

までをいじくるとなんとかなりそう
827デフォルトの名無しさん:2007/12/03(月) 14:13:43
デフォルトでvisibleだったような気がするものの、put_Visibleも付けたいような・・・
あとウィンドウ操作しといメッセージポンプ止めるなんて、Windows を舐めてるよ。
828デフォルトの名無しさん:2007/12/03(月) 17:01:26
>>824
既にVistaでは、新しくMedia Foundationが出ていて、
これがDirectShow後継になっている。
829デフォルトの名無しさん:2007/12/04(火) 00:54:25
>>827
役立たずは黙ってろよカス
830デフォルトの名無しさん:2007/12/04(火) 08:58:16
>>829
827 のは
> // ムービーが終わるまでここから先へは進ませない
> g_Event2->WaitForCompletion(INFINITE,&g);
のせいでメインのメッセージループ止まってて描画命令飛んでないんじゃないのという
非常に的を射たエスパー回答だと思うぞ。
831デフォルトの名無しさん:2007/12/14(金) 12:54:00
すみません、Directshowで、パソコンと
USBで接続されたビデオキャプチャ IO-DATAのGV-MVP/RZ3の
アナログビデオ入力(RGB)にカメラをつないで、
まずは、画像をプレビューしようかと考えています。
参考にしようと思ったプログラム、

http://www.geekpage.jp/programming/directshow/list-capture-device-3.php

を、コンパイルすることはできたのですが、うまく動きませんでした。
(ライブラリのリンクはできました。)
デバイス選択のところで、製品名のRZ3は認識しているようなのですが、
HRESULTをチェックしていくと、

// Graphを生成する
pCaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_PREVIEW,
NULL, pDeviceFilter, NULL, NULL);

のところだけ、S_OKでなく、VFW_E_CANNOT_CONNECTが返ってきました。
&PIN_CATEGORY_PREVIEWのところを、
&PIN_CATEGORY_CAPTURE や &PIN_CATEGORY_VIDEOPORT
に変えてもエラーをはいてしまいます。
周りに相談できる方が折らず、困っています。
どなたか、ご助言いただけませんでしょうか?

OSはXP home SP2に
Windows Server 2003 SP1 SDK
DirectX SDK 2007
Microsoft Visual C++ 2005で開発しています。
お手数かけますが、どうかよろしくお願いいたします。
832デフォルトの名無しさん:2007/12/15(土) 01:53:41
・そこのサンプルページのもうちょい前のサンプルの動作結果
・GraphEditでの動作結果
・デバイスの情報
 (デバイスマネージャの出力とか同じとこのサンプルプログラムとかインターフェース問い合わせるとか)

とかがあると答えやすいかも
833831:2007/12/17(月) 15:38:32
>>832
お手数かけまして申し訳ありません。ありがとうございます。
いくつかご指摘の点を実行してみましたので、
下記の通り、どうかよろしくお願いいたします。

少し前のサンプル結果としてmpgファイルの再生。
http://www.geekpage.jp/programming/directshow/renderfile.php
は成功しました。

デバイス情報を表示するサンプルからは、
FriendlyName : Python2 USB WDM Encoder RZ3
Description : Python2 USB WDM Encoder RZ3
DevicePath : \\?\usb#vid_04bb&pid_0519#6&25ee13b8&0&2#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global
となりました。

graphedit使ってみたところ、
フィルターから

Python2 USB WDM Endoderが見つかりました。
入力は、RGB入力と(おそらくです。文字化けしていました)
Audio inが見つかっています。
出力は、Mpeg out,Audio Preview,Index,VBI,Video Previewが見つかりました。
このまま、video renderの入力にVideo Previewをつなげようとしたところ、
「接続に必要な中間フィルタの組み合わせが見つかりませんでした。
 エラーコード、0x80040217」
が出力されました。Mpeg Outのほうを、直接つないだり、mpeg decoderなどにつないでも
同様に中間フィルタの組み合わせが見つかりませんでした。
との結果を得ました。
ここで、詰まってしまいました。
不勉強のために不十分かとは思いますが、どうかご教授いただければ幸いです。
834デフォルトの名無しさん:2007/12/17(月) 21:18:27
>833
とりあえず、GraphEditでVideo Preview Pinのプロパティを見て、MEDIASUBTYPEと出力サイズを調べる。
そこが変じゃないのなら、Video RenderとしてVMR9やOverlayなども試してみる。
835デフォルトの名無しさん:2007/12/25(火) 12:11:57
AviファイルからDirectShowのAsfWriter使ってエンコードしてるんですが
音量の変更の仕方をどなたか知ってる方いらっしゃいませんか?
プロファイルを指定して解像度なりビットレートは変えられています。
PCの音量を最大にしても人が喋ってる声とかがあまり聞こえないんです。
ちなみにAviの方ははっきり聞こえています。
836デフォルトの名無しさん:2007/12/31(月) 23:33:07
現在、DirectShowを用いてウェブカメラの動画ストリームを
「半透明で」「最上面」に映し出すためのプログラムを書こうと思っています。

http://codezine.jp/a/article/aid/322.aspx

のプログラムを下記の環境でデバッグしたのですが、

VS2005 Pro SP1
MS Platform SDK for Server 2003 SP1
MS Direct X SDK Nov 2007

下記のようなエラーがでてきてしまいます。

エラー 2 error C2504: 'IDXEffect' : 定義されていない基本クラスが宣言されています。 c:\program files\microsoft platform sdk\include\qedit.h 980

自分の経験・勉強不足は十分承知しております。
解決方法をご教授していただければ幸いです。
837デフォルトの名無しさん:2008/01/01(火) 23:49:53
あげて行きます。

ニコニコ動画のXMLファイルを読み込んで
入力動画に表示するフィルタは需要ありますか?
エンコード一発で字幕付き動画作れるようになる
838デフォルトの名無しさん:2008/01/02(水) 21:15:36
>837

てらほしいっす!
839デフォルトの名無しさん:2008/01/03(木) 03:56:17
需要は1人か・・・。
てら微妙。

DirectShowフィルタ作ってももはやだめなのかな。
840デフォルトの名無しさん:2008/01/04(金) 00:50:16
>>836
とりあえず「半透明で」はなく「最上面」とは限らないプログラムの動作状況がわからないと
なんともしようがない
841デフォルトの名無しさん:2008/01/04(金) 04:53:48
>>837
ノシ

そんなの作ろうとしてDirectShow勉強しはじめた人間です
842デフォルトの名無しさん:2008/01/04(金) 05:57:17
DirectShow 複雑怪奇な構造してるよな
魑魅魍魎な設計ここに極まれり
843デフォルトの名無しさん:2008/01/04(金) 06:43:25
>>841
マジで?
DirectShow部分は簡単だから一緒に作ろうか?
メールのやり取りでもしながらさ。

とりあえず、文字を右から左に送るフィルタでも作ってプロジェクト一式渡そうか?
XMLのタグをどう扱うかで勉強しようかと思っていたが需要ないから諦めかけてた
844デフォルトの名無しさん:2008/01/04(金) 15:09:32
>>836
エラーメッセージを見る限り、
デバッグ以前の問題でコンパイルが通ってない、
と思われるがその認識でよい?

手元の環境では IDXEffect は以下のファイルで宣言されている。
C:\Program Files\Microsoft DirectX SDK (August 2007)\Include\dxtrans.h

DirectX SDK Nov 2007 でも同様の場所にあると思われるので、
そこにインクルードパスが通っているかどうかを確認してみるべし。
845841:2008/01/04(金) 18:00:44
>>843
Windowsプログラミングの経験が浅いので役に立つかは自信ないですが、、
とりあえずメアドさらしておきます
846デフォルトの名無しさん:2008/01/04(金) 19:39:53
>>845
ほい。了解。
なら一日くらいかけて作るよ(とはいってもやる気出すのに半日使うだけだけど・・・)
ところでDirectShowのフィルタをビルドできる環境はあるかい?
847841:2008/01/04(金) 21:05:16
環境はこんな感じ。
* Windows 2000 SP4
* VC++ 2005 Express Edition
* Microsoft Platform SDK for Windows Server 2003 SP1
* DirectX 9.0b SDK

ttp://www.geekpage.jp/programming/directshow/ のサンプルをビルドできたから多分大丈夫
848デフォルトの名無しさん:2008/01/05(土) 07:42:07
はーい。了解。
環境あわせようとしたけどVC2005とDXSDK9.0は相性悪いな〜。

849841:2008/01/05(土) 09:04:57
Win2Kだとその構成が限界なんですよね。。
別のXPプレインスコマシンがあるのでそこに環境作ってみます。
850デフォルトの名無しさん:2008/01/05(土) 10:50:14
いや、よいですよ。
DX9.0c+VC6とVC2005+WindowsSDKこの2つの環境を作りました。
両方のプロジェクトファイルを付ければいいですね。
文字を画面に出すとこまで作ったけど環境作るのでへこたれた為、少しだれた
851837:2008/01/05(土) 20:26:41
>>837です
>>841さん
メールしました。
852836:2008/01/07(月) 22:48:08
>844

レスありがとうございます
>>そこにインクルードパスが通っているかどうかを確認してみるべし。
といってもVC++自体初心者なのでインクルードパスの通し方がわかってないかもしれませんが…。

ツール>オプション>
プロジェクトおよびソリューション>VC++ディレクトリ
プラットフォーム:Win32
インクルードファイルのところに
C:\Program Files\Microsoft Platform SDK\Include
C:\Program Files\Microsoft DirectX SDK (November 2007)\Include\
と入れてあります。

これであってるでしょうか?
853デフォルトの名無しさん:2008/01/08(火) 16:13:27
>>852
おkです。
あと、ライブラリのパス(ライブラリファイル)の方も同様に設定しておかないと
リンク時に見つからないと怒られます。
854デフォルトの名無しさん:2008/01/09(水) 21:37:09
>>841
おーい。一緒に開発しよっせ。
こんなクソソースよめっかっとかでもなんでもいいからなんかないの?
855デフォルトの名無しさん:2008/01/11(金) 15:28:36
( ´-`).。oO(戦うつもりだったけどスレとSDKサンプルみてもう白旗…)
856デフォルトの名無しさん:2008/01/11(金) 21:47:02
がんばれ。サンプルコードの意味わからんとこは解説してやるから

千里の道もまずはGraphedtから

857836:2008/01/11(金) 22:42:04
やっぱり、
C:\Program Files\Microsoft DirectX SDK (November 2007)\Include\
の中にdxtrans.hがありませんでした。消したつもりはないので、最初から入ってないような気がするのですけど、
dxtrans.hってNov 2007には入っていないのでしょうか?
858デフォルトの名無しさん:2008/01/11(金) 23:04:28
dxtrans.hが見つからない件について

どうもすいません、自己解決しました。
DreictX SDK November 2007
ではdxtrans.hが元々入っていないようです。

↓ここを参照しました。
ttp://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2617687&SiteID=1
859デフォルトの名無しさん:2008/01/12(土) 07:33:47
( ´-`).。oO(SDKのサンプルBallと戦かってみた…)
( ´-`).。oO(といってもいろいろ削って雛型作っただけ…)
( ´-`).。oO(GraphEditでは四角の箱がとりあえずでた…)
860デフォルトの名無しさん:2008/01/12(土) 09:36:47
小学生はまず学校の勉強を頑張れよ

×戦かってみた (たたかかってみた、いくさかってみた)
○戦ってみた (たたかってみた)
861デフォルトの名無しさん:2008/01/12(土) 10:18:10
( ´-`).。oO(DirectShow学生です…)
( ´-`).。oO(こまかいことは気にしないでね…)
862デフォルトの名無しさん:2008/01/12(土) 10:43:50
WMP(Windows Media Player) を動画再生を停止した状態で
DirectX+VMR9 を使ってムービーを再生させると WMP を
起動してないときに比べて滑らかに再生される...

timeBeginPeriod(1)やD3DPRESENT_INTERVAL_ONEは
指定してあるんだけどな何かあるのかなあ
863デフォルトの名無しさん:2008/01/12(土) 11:20:36
オーバーレイか?
864862:2008/01/12(土) 17:04:10
>>863
アロケータ・プレゼンタを使ってテクスチャに転送して
Direct3Dでポリゴン板に貼り付けて描画しています

一応それなりに再生できるのですが
少しカクカクするところがあって WMPで見ているようにはいかないですね
己の限界を思い知らされてますw orz
865デフォルトの名無しさん:2008/01/12(土) 19:10:04
DirectShowで変換フィルタつくったのですが、フレームレートが高い動画のパフォーマンスが
視聴に耐えられないほど悪いのでマルチスレッド化して高速化したいのですが、
ffdshowも何故かシングルスレッドしか動いてないみたいなんですが、
DirectShowの デコード→変換フィルタで変換→レタリング の流れをマルチスレッド化する方法を知っていたら教えてください。どうかお願いします
866デフォルトの名無しさん:2008/01/12(土) 23:25:23
俺は適当にデータを分割して並列処理しているけど、重い処理なら軽く作り直せ。
まさかデバッグ版が重いという落ちではないだろうな?
デバッグ版だとスタックチェック等でとんでもなく重くなるので本来のパフォーマンスはわからない。
あと、たいていはメモリの読み書きでもっとも時間を消費するので、少なくなるようコードを改良汁。

マルチスレッド化は、自分で別スレッドを作っておいてデータ処理の段階で、自スレッドと別スレッドで同時に処理を分散し
待機関数で別スレッドがすべて処理が終わるのを待って、処理を完了するってかんじ。シグナルはイベントを使うのが良い。
867デフォルトの名無しさん:2008/01/13(日) 00:28:19
>>866
レスありがとうございます
プロジェクトの設定を確認しましたがデバッグ版ではなく、ちゃんとリリース版でビルドしています
マルチスレッド化の話はたいへん参考になりました。難しそうですが、やってみます
868デフォルトの名無しさん:2008/01/13(日) 15:01:04
>>858
Novemver2007 では未確認でした…。スマンカッタデス。orz
リンク先のフォーラムの回答「August 2007 を使え」が泣けてくる。

この削除が MS による意図的なものとすると
→dxtrans.h をインクルードしている qedit.h が使えない
→qedit.h で定義されているクラスやインターフェース
(DirectShow 編集サービスや SampleGrabber など)が使えない

となる訳で、かなり影響があるんでは…。
869デフォルトの名無しさん:2008/01/14(月) 18:53:58
ソースとレンダラだけ指定して間のスプリッタとかデコーダを勝手に生成して適切なフィルタグラフを生成してくれるAPIはどれですか?
870デフォルトの名無しさん:2008/01/14(月) 23:16:38
>>869
そんなAPIは知らないけどフィルタグラフ作って最初にソースファイルとレンダラ繋げば
自動挿入されるけど…?
インテリジェンス接続ってやつ
871デフォルトの名無しさん:2008/01/14(月) 23:48:36
>最初にソースファイルとレンダラ繋げば
って具体的に言うと
IBaseFilter* s = ソースフィルタ、 IBaseFilter* r = ヴィデオレンダラ
graph->AddFilter(s)、graph->AddFilter(r)
あとどうするの?
sとrのピンを直接繋ぐ?
872デフォルトの名無しさん:2008/01/14(月) 23:52:12
>>871
そんなのどこの解説記事にも書いてある基本中の基本なんだからやってみればいいじゃん
873デフォルトの名無しさん:2008/01/15(火) 00:14:46
870ですが、
このスレで何度も言っちゃってるんですが
Graphedtを使ってどうなるかシミュレーションしてからコード書いてください。

そしてコード直接貼っての質問は最終手段にしてくださいね
874デフォルトの名無しさん:2008/01/15(火) 00:19:59
追記ですが
> sとrのピンを直接繋ぐ?
はい。そうです。
メディアタイプが非圧縮YUVならフィルタはさまないでつながるし、

圧縮されていてもMPEG4のV2ならコーディックも挟んでくれますよ。

後は試してないから知らない
875デフォルトの名無しさん:2008/01/15(火) 01:12:31
>>874
どうもありがとう。ちょっとやってみる。
GraphEditではやってみたんだけどね、ダメだったから何か追加処理が必要だなと思って質問してみた
876デフォルトの名無しさん:2008/01/15(火) 01:34:01
了解です。
下の文章も付けて質問した方が今後早い解決に繋がりそうですね。

コーデックに寄ってはフィルタの優先度を上げないと自動で繋いでくれないものもあります。
自分の環境だけでなくユーザーの使うような環境でもテストしてみましょう
877monamona:2008/01/18(金) 13:06:38
>>868
そうですね。

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2617687&SiteID=1
ここにjiapeiさんが書かれている方法を元に編集したら若干警告はあるもののビルドできました。
SampleGrabber も使えました。

私の環境における編集内容は下記です。
//#include "dxtrans.h" ・・・ 495行目
IDxtCompositor //: public IDXEffect ・・・ 979行目
IDxtAlphaSetter //: public IDXEffect  ・・・1484行目
IDxtJpeg //: public IDXEffect ・・・1725行目
IDxtKey //: public IDXEffect ・・・2400行目
878デフォルトの名無しさん:2008/01/24(木) 11:34:22
http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/directshow.html#two_cameras_graph
ここのサイトの一番したのプログラムを使わしてもらったんですが、不具合が起きてます。
Windowは2つ出ますがなにもしないと一つは真っ黒、もう一つの画面に2つのカメラの映像が交互に出ているらしく、
合成したみたいな映像になっています。
どうしたらいいでしょうか?
879デフォルトの名無しさん:2008/01/25(金) 22:13:34
・GraphEditで接続を確認
・RenderStreamの引数を明示的に指定
880デフォルトの名無しさん:2008/01/27(日) 01:55:50
USB接続のウェブカメラから静止画を取得し、表示するプログラムを作りました。
しかし、実装が悪いようで非常に重たいプログラムになってしまいました。

現在はメッセージループでPeekMessage関数によってメッセージを取り出し、
アイドル時にキャプチャと表示を行う仕様になっています。

改善策をご教授ください。
881デフォルトの名無しさん:2008/01/27(日) 02:00:59
ん?プレビュー表示じゃないの?
882デフォルトの名無しさん:2008/01/27(日) 02:07:15
プレビュー表示というのは動画をそのまま表示することでしょうか?

キャプチャした画像に処理を加える必要があるので静止画をキャプチャしています。
883デフォルトの名無しさん:2008/01/27(日) 09:55:14
重い部分を軽くすればいいじゃないか。何故調べない?
884デフォルトの名無しさん:2008/01/27(日) 11:46:05
コールバックの制御は直ぐに返しなさい。
885デフォルトの名無しさん:2008/01/27(日) 11:59:29
マルチスレッドにすべきだな
886デフォルトの名無しさん:2008/01/27(日) 15:52:35
イヤだと言ったら?
887デフォルトの名無しさん:2008/01/27(日) 16:51:15
マルチスレッドにするとしたらキャプチャは今までどおりで、
静止画に対する処理をスレッドでやればいいんでしょうか?
888デフォルトの名無しさん:2008/01/27(日) 17:57:51
質問です。
flvからaviに変換するようなアプリを作ろうと思っているのですが、
PCにインストールされている映像のエンコードのコーデック(フィルター)の一覧を取得する方法ってどうやればよいのですか?
889デフォルトの名無しさん:2008/01/27(日) 22:13:49
えーと、確か、enumなんとかw 酒が入っててよく思いだせねー
graphEditでもフィルタ一覧表示してるでしょ。大丈夫さ君ならやれるさファイトファイト
890デフォルトの名無しさん:2008/01/27(日) 22:15:55
>>880
フィルタ構成は
「ソースフィルタ」-「サンプルグラバ」-「レンダラ」
にしてサンプルグラバから静止画を取得するようにします。
このように設計してやることでマルチスレッド必要なく軽いアプリができます
891デフォルトの名無しさん:2008/01/27(日) 23:55:25
>888 このあたり見てみればいいんじゃね?気になるから調べちゃったよ
ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/DirectX9_c/directx/htm/enumeratingdevicesandfilters.asp
892デフォルトの名無しさん:2008/01/28(月) 00:30:39
VC++2005でDirectX9を使っています。DirectShowが必要でbaseclassesをビルドして
dshowutil.cppやstreams.hを使っています。
このとき、error lnk1181 でc:\program.objが見つからないとのえらがーでます。
どうやったら解決するでしょうか?
893デフォルトの名無しさん:2008/01/28(月) 00:39:19
'Program Files'が空白で区切られた予感。後はシラネ
894デフォルトの名無しさん:2008/01/28(月) 01:16:43
_TIME_FORMAT_FRAMEなどが未解決というエラーがでます。小生プログラミング暦が短くデバッグすることができません。
お力かしてください。
895デフォルトの名無しさん:2008/01/28(月) 01:25:22
>>892
VC2005でDirectShowがインストールできませんよ
といっているの?
私もvc2005でDX9をインストールに失敗した経験があります。
vc2005(有料版)では素直にwindowsSDKを使ったほうが簡単でしょう

>>894
あなたもインストールに困っているのでしょうか?
その問題は昔のDirectShowプログラムをビルドすると出てきます。
直し方は新しくプロジェクトを作ればよかったと思います。
が、その後別の問題があったような覚えがあります。
DirectShowのインストールをやりなおしましょう
896デフォルトの名無しさん:2008/01/28(月) 19:30:50
プログラミングが難しいとか以前に、環境がサクっと作れないのは問題だよなー
897デフォルトの名無しさん:2008/01/28(月) 19:31:13
↑MSに対する文句です
898デフォルトの名無しさん:2008/01/29(火) 01:15:09
いや。インストール環境が作れていないのを変な質問にすり替える奴らが痛い。

英語のサイト見るとそのあたりの情報調べられるよ?
DirectShow人口増やしたいから答えるけどさ…
899デフォルトの名無しさん:2008/01/29(火) 01:16:52
簡単になること自体には異議はないが
そんなに難しくないだろ・・
900デフォルトの名無しさん:2008/01/30(水) 01:00:16
MSDNをみるとVMRの入力ピン メディア タイプは
「MEDIATYPE_Video メジャー タイプを持つあらゆるタイプ」
になっていますが、これはYV12なども接続可能ということでしょうか?
つなげてみると、うまく繋がらないのですが。。。
901デフォルトの名無しさん:2008/01/30(水) 02:01:26
ソースフィルタを作成しているのですが、
CLSID_VideoInputDeviceCategoryに属するフィルタの作成が出来ません。

g_TemplatesでCLSID_VideoInputDeviceCategoryを指定しているのですが、
CreateClassEnumeratorで列挙しても検出してくれません。
デバイスを伴ったWDMフィルタでなければ作成できないのでしょうか?

なにかヒントでも良いので教えてください。
902デフォルトの名無しさん:2008/01/30(水) 04:16:17
登録部分のソースコード読めばわかるよ。つーか読め。
ちなみに、Baseclassのコードでは結論から言うとデフォルトの CLSID_LegacyAmFilterCategory にしか登録されない素敵仕様。
一からコード書くのも面倒なんで、俺はDllSetup.cppを改造したものを使ってこの問題に対処した。
903901:2008/01/31(木) 00:17:30
登録できました!ありがとうございます。

私も902さんに倣ってDllSetup.cppから必要な部分抜き出して、
登録部分を実装しました。
感謝感激でございます。
904デフォルトの名無しさん:2008/01/31(木) 00:51:11
VB6でDirectX Software Development Kit(August 2006)の組み合わせで、
DirectShowを利用したプログラムを作成していました。
今度、VB2005で同じようにDirectShowを利用するプログラムを作成するの
ですが、やはり、DirectX Software Development Kit(August 2006)がよい
のでしょうか?
905デフォルトの名無しさん:2008/01/31(木) 01:03:46
自分で試せよ!このゆとり!
906デフォルトの名無しさん:2008/01/31(木) 08:25:47
どうしょうもない時以外はVBではなくCで作った方がいいですよ。

資料数と実装難易度の問題で。やっぱりメジャーな使い方が地雷を踏みにくくさせる
907デフォルトの名無しさん:2008/02/02(土) 14:20:25
VFWのビットマップをAVIにする機能をフィルタで作りたいのですが、うまく行きません。

ビットマップを挿入するタイミングは非同期でないといけないので、
今回の場合はPushSourceフィルタでは駄目でした。

Asyncfltを改造すれば、要求にこたえる機能が実装できそうだと思い見ています。
IAsyncReaderのRequestでIMediaSampleを渡すところまでたどり着ければ何とかなりそうなのですが、
取っ掛かりがつかめません。

どなたか作ったことがある、又は分かる方居ませんか?

下流フィルタとのつながりのやり取りのフローだけでも参考になるものがほしいです。

ちょっと、難易度の高い質問で申し訳ないですが、分かる方お願いします。
908デフォルトの名無しさん:2008/02/02(土) 15:18:47
909デフォルトの名無しさん:2008/02/02(土) 15:40:48
ありがとうございます。

教えていただいたURLはすでに読んでいました。
MSDNのそれらしきところを読んで回った末に、
>IAsyncReaderのRequestでIMediaSampleを渡すところ
というのが出てきたところです。

フィルタが出力ピンを用意して、それがIAsyncReaderをインターフェイスに持っているということですよね。

たとえばpushsourceでは
フィルタ>出力ピン の順に作って、

その出力ピンに下流ピンがGetMediaTypeを呼んで、良ければ繋がって、

FillBufferが呼ばれてIMediaSampleに内容を渡す

という流れですよね。これはグラフが動いている間は常に要求されているので渡す時間は実時間と違います。
パソコンが早ければ1秒で1分のビデオが作れます。そして、渡すべき物が無く、戻り値にS_OKを返さない場合、終了します。

今の段階ではFillBufferがRequestにとって代わるような感じを持っています。
渡すべき内容が無い場合、グラフに待ってもらいたいのです。

サンプルのAsyncfltはキューとかIOとかで割とシンプルじゃ無いので取っ掛かりがつかめません。
理解している人に噛んで砕いて教えていただけたら手っ取り早いなというのが実のところです。

任意のビットマップが用意できたら下流に流し、次のビットマップが無ければリクエストに対し無いと言って次回。
次のが用意できるまでは下流はリクエストをタイミングごとに出し続けて待機というイメージです。

そのようなシンプルなサンプルがほしいと思っています。

よろしくおねがいします。
910デフォルトの名無しさん:2008/02/02(土) 17:56:15
質問です。
DirectShowを使って、オーディオ入力デバイスに対してファイルストリームから入力を行う事は可能ですか?
やりたい事は、ファイルシステム上のwavファイル等をオーディオ入力にいれるというものです。
よろしくお願いします。
911デフォルトの名無しさん:2008/02/02(土) 18:56:02
ソースフィルタ作ればなんでもできるだろ
912910:2008/02/02(土) 20:36:02
>>911
その場合特殊なドライバが必要だったりしませんか?
913デフォルトの名無しさん:2008/02/02(土) 20:57:21
CSourceでやってみれ。自分で好きなもの垂れ流し放題だぜ。
914デフォルトの名無しさん:2008/02/02(土) 22:14:08
908/909です。

pushsourceで出来ました。

CSourceStream をちゃんとしらべれば簡単な話でした。

掲示板で質問すれば手っ取り早い、と思うのは自分勝手でした。
すみません。

しかし、MSDNに限らず、こういうのの説明文はさらっとしすぎで初めての人には理解に時間がかかる。
もう少しデータのナガレをきちんと載せてほしいとこです。

あと、恩返しではないですが、
Delphiでやってるので、質問があればお答えします。
915デフォルトの名無しさん:2008/02/02(土) 22:33:53
>>913
レスありがとうございます。
ソースフィルタでストリームに処理を加えると、
自分以外のそのデバイスをlistenしてるアプリにも反映されるのでしょうか?
916デフォルトの名無しさん:2008/02/02(土) 23:37:39
お前DirectShowの機能勘違いしているぞ
917デフォルトの名無しさん:2008/02/03(日) 05:27:36
>>914
自分のやりたいことがPULLモデル/PUSHモデルどちらなのか
良くわかってなかったっつーことか。なんだかなー
918デフォルトの名無しさん:2008/02/03(日) 14:06:55
報告と謝罪と文句と募集と1レスで書かれるとなんだかわからん
919デフォルトの名無しさん:2008/02/04(月) 02:12:37
募集?
全レスのなかで私くらいしかしてないような…
ゴバクかいな
920デフォルトの名無しさん:2008/02/04(月) 17:16:44
>>914
Pull でも FillBuffer で待たせておけばOK.
921デフォルトの名無しさん:2008/02/05(火) 13:48:49
>>918
起承転結みたいだなw
922デフォルトの名無しさん:2008/02/11(月) 00:41:52
そろそろ新スレいっとくかい?
923デフォルトの名無しさん:2008/02/11(月) 01:01:57
1週間で1レスしか進んでないのに、まだまだ大丈夫だろ
924デフォルトの名無しさん:2008/02/11(月) 01:14:59
スレタイ変えるのもなんだけど
戦っちゃだめだよな
925デフォルトの名無しさん:2008/02/11(月) 01:58:21
戦わざるを得ないような××な仕様
926デフォルトの名無しさん:2008/02/11(月) 10:11:21
ロックするのが基本のダメ仕様。
927デフォルトの名無しさん:2008/02/11(月) 18:58:20
FillBuffer について質問。

CSourceStream はどのタイミングで FillBuffer を呼ぶの?
CSourceStream::DoBufferProcessingLoop の説明には
毎回ループを通じてアロケータから空のメディア サンプルを取得する。
とあるので、スレッドループから常に呼び出されていると理解したけど?
タイミングは随時?それとも下流フィルタから呼ばれてるの?


要は、渡すべきサンプルが FillBuffer 呼び出しに間に合わなかった場合の処置だけど、
戻り値に S_FALSE を渡すと終了してしまうよね。
IMediaSample を更新しないで単に S_OK を渡してやれば次回にスキップできる?
今やってるのではうまく行かないんだよね。
928デフォルトの名無しさん:2008/02/11(月) 19:47:04
ソースあるのになんでわからないの?
929デフォルトの名無しさん:2008/02/11(月) 20:34:38
わかってんなら教えろよ。
930デフォルトの名無しさん:2008/02/11(月) 20:58:04
ソース読めばいいじゃん
931デフォルトの名無しさん:2008/02/11(月) 21:43:21
どのソースのどこにどんな風に書いてあるんだ?

知ったかぶりすんな。

932デフォルトの名無しさん:2008/02/11(月) 22:11:37
DoBufferProcessingLoopのソースを読めっていう点では同意。
DirectShowの場合、説明だけに頼らずソースのある箇所は必ず読む方が良い。

>>927
サンプルを得られるまで返らない、とか?
昔作った時は、停止要求とかの処理で悩んだ挙句、
DoBufferProcessingLoop自体をオーバーライドしちゃった記憶が(汗
933デフォルトの名無しさん:2008/02/11(月) 22:16:49
>>931 なんでお前が偉そうなんだよw
934デフォルトの名無しさん:2008/02/11(月) 22:36:38
そーすっか
935デフォルトの名無しさん:2008/02/12(火) 02:15:50
DoBufferProcessingLoopは可能な限りすばやくループするから、
タイムスタンプに関係なくFillBufferを呼び続けるんだな。
渡すべきサンプルが無くてもお構いなしだ。

FillBufferがS_OKを返すとサンプルはDeliver(Sample: IMediaSample): HRESULT;から
Receive(Sample);に回される。ここでS_FALSEならおしまい。

ここらはMSDNから読めるだろ?

このReceiveの動作がDoBufferProcessingLoopが受け取る戻り値になるんだよ。
これはピンの状態なんかもかかわってくる。

問題は(Sample);の中身が無い状態で、とりあえず渡してどうなるかってこと
必要な動作のヒントがほしいなら、Receiveのとこはソースを見て自分で判断するしかない。

渡されたサンプルを無視するように何とかすればいいかもね
936デフォルトの名無しさん:2008/02/13(水) 18:39:20
DirectShow(Filter)がサポートしているファイルの拡張子を取得する方法ってある?
RenderFileで成功するか否か判断するしかない?
937デフォルトの名無しさん:2008/02/13(水) 22:13:41
>>936
拡張子ではわかりません。
938デフォルトの名無しさん:2008/02/13(水) 22:27:18
>>937
サポートしている拡張子は取得できない、ってことですか?
939デフォルトの名無しさん:2008/02/13(水) 22:43:02
拡張子が例えば ts や mpg や avi だったとして、
そこからはコンテナのフォーマットが推測できるだけであって、
中の映像や音声がどんなコーデックで圧縮されているかは全く不明。
940デフォルトの名無しさん:2008/02/13(水) 22:46:42
各フィルターがサポートしているメディアフォーマットならば取得可能かもしれません。
レンダラ、ライタまでたどり着けるかはシステムに拠りますね。
941デフォルトの名無しさん:2008/02/13(水) 23:16:38
>>937,939,940
ありがとうございます。

あるフォルダの中から、DirectShowで表示できるファイルだけを列挙したいのですが、
できればDirectShowにRenderさせる前に、DirectShowでサポートされているか拡張子で判断したいのです。
理由は判断ロジックのパフォーマンス確保のためです。
(この時、拡張子がrmなのに中身はwmvだった、という例外は除外してOKです。)

ファイル数が500個あった場合に、DirectShowにRenderさせてS_OKだったら、
これはサポートファイルであるという判断は時間がかかります。

もしくは、サクッとDirectShowサポートファイルか判断する手段はありますでしょうか?
942デフォルトの名無しさん:2008/02/13(水) 23:42:33
>>941
コンテナとコーデックの違いを理解しましょう
943デフォルトの名無しさん:2008/02/13(水) 23:46:01
>>941
そこにDivXの映像入りのAVIがあったとする。
しかし、そのコンピュータにはDivX(やXvidその他)がインストールされていなかったとする。
どうしよう。
944デフォルトの名無しさん:2008/02/14(木) 00:20:05
>>941
レジストリの HKEY_CLASSES_ROOT\Media Type と SDK のドキュメントの
「カスタム ファイル タイプの登録」を眺めるとひょっとしたら幸せに
なれるかも

# スプリッター/パーサーフィルタが対応してるファイルかどうかは判定できる
# ただし拡張子だけじゃなく、ファイル先頭のビットパターンまで見る必要が
# あるけど
945デフォルトの名無しさん:2008/02/14(木) 00:26:46
>>942
はい。

>>943
列挙されたファイルをDirectShowで使用する場合、Renderのタイミングでエラーになりますので、
そのタイミングで該当ファイルをリストから除外します。
ファイルの列挙のタイミングでは、精度よりもパフォーマンスを確保したいのです。

私の理解が不十分ですので、出直してきます。
ありがとうござしました。
946デフォルトの名無しさん:2008/02/14(木) 00:28:51
>>940,944
ヒントありがとうございます。
調べてみます。
947デフォルトの名無しさん:2008/02/14(木) 17:00:20
現在CTransformFilterから派生した変換フィルタを作っていますが、入力から出力へコピーするだけのフィルタを作ってみても、
ffdshowと比べて負荷が高いような気がします。
※色空間は暫定で、一番最初にCheck〜関数へ飛んでくる色空間にしてます。
自作フィルタをGRFで見てみると、AVIDecompressorが出力ピンに付くんですよね・・・そのせいでしょうか?
一応ffdshowのソースを見てみましたが、私には難解すぎました・・・orz
どなた様かご教授よろしくお願いいたします。。
948デフォルトの名無しさん:2008/02/14(木) 21:46:51
メディアサブタイプにPCMとWAVEが存在するのだが、これはどう違うの?
949デフォルトの名無しさん:2008/02/14(木) 22:14:09
気になって調べてみた。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/DirectX9_c/directx/htm/mediatypes.asp

MEDIASUBTYPE_WAVEで出力している自前のソースフィルタがあるけど普通に動いているな〜
どういうことだこれはwww
950デフォルトの名無しさん:2008/02/14(木) 23:05:06
MEDIASUBTYPE_WAVEは、過去の遺産ということなのか?
MEDIASUBTYPE_PCM = MEDIASUBTYPE_WAVE
と考えていいのか?(いやまずいだろうとは感じているのだが)
951デフォルトの名無しさん:2008/02/14(木) 23:10:44
WAVEはあくまでコンテナでしょ 中身がリニアPCMとは限らない。
952デフォルトの名無しさん:2008/02/14(木) 23:29:43
>>951
そしたら、サブタイプがWAVEだった場合、
中身のフォーマットはどのようにして取得するの?
953デフォルトの名無しさん:2008/02/16(土) 21:17:20
他スレッドからの誘導でここに来ました

質問です。
メモリ上のH.264とAACを含んだTSを再生したく、調べてみて、
ハードディスク等に保存されている動画を再生するには
IMediaControl->RenderFileを使用する事が分かったのですが、
自分でHeapAlloc等を使い、
メモリ上に展開した動画データを直接再生する方法が分かりません
何か方法はあるでしょうか?
宜しくお願いしますm(__)m
954デフォルトの名無しさん:2008/02/16(土) 21:18:57
上げます
955デフォルトの名無しさん:2008/02/16(土) 21:38:02
>>953
ソースフィルタ書け。
956デフォルトの名無しさん:2008/02/16(土) 21:51:41
当たり前だがパーサー、デコーダも必要になるぞ
957デフォルトの名無しさん:2008/02/16(土) 22:14:14
>>955
>>956

分かりました
それらのキーワードでぐぐってみます
レスありがとうございましたm(__)m
958デフォルトの名無しさん:2008/02/22(金) 14:38:56
DirectShowとDirectSoundを用いてmp3を再生するクラスを作成しようと思っています。
開発環境はWinXP + VS2005 です。
DirectShowでmp3のデコードを行ってメモリ上にrawデータを展開し、
そのデータをDirectSoundで再生させようと考えているのですが、
なかなか参考になりそうなwebページや書物が見つかりません。

そもそもこのことは可能でしょうか?
もし可能であれば簡単に展開の仕方を教示していただきたいです。
また参考になるHP等ございましたらご提示願います。
959デフォルトの名無しさん:2008/02/22(金) 15:52:58
>>958
DirectSoundでWAVEをストリーミングするサンプルを見つける
MP3をWAVEに変換するサンプルを見つける
それら2つのサンプルを組み合わせる
960デフォルトの名無しさん:2008/02/22(金) 22:00:35
>>958
yaneSDK3rd で DirectShow 使って  PCM に直す処理があったと思うので
気合でソース読め。
DirectSound 使わんで普通に再生フィルタにつなげばそれで良いと思うのだがな。
961デフォルトの名無しさん:2008/02/25(月) 23:55:58
GraphStudio
ttp://blog.monogram.sk/janos/tools/monogram-graphstudio/
オープンソース版GraphEditだそうだ。
962デフォルトの名無しさん:2008/02/28(木) 13:15:03
オープンソースなGraphEditならこっちも
ttp://www.codeproject.com/KB/audio-video/dsgraphedit.aspx
963デフォルトの名無しさん:2008/02/28(木) 20:37:55
なんか見た目がカッコいいなw
964デフォルトの名無しさん:2008/03/02(日) 16:58:32
再生速度をSetRateで変えたときに、動画が一瞬止まるのは何故でしょうか?
キーフレーム、バッファリングと関係があったりするのでしょうか。

また、再生レートを変更しても動画が一瞬止まらないようにするための解決法などありますか?
965デフォルトの名無しさん:2008/03/03(月) 03:02:10
SetRateで速度上げると音と動画が同期しませんが
どうすれば同期しますか?
966デフォルトの名無しさん:2008/03/04(火) 03:23:05
本家GraphEditっていまどこにあるの?
PSDK?
967デフォルトの名無しさん:2008/03/04(火) 17:36:08
Windows SDK
最新の6.1(Windows Server 2008/.NET Framework 3.5まで対応)にも収録されている。
968ddd:2008/03/06(木) 17:31:30
hhaahahhahaahahhahahahahah
969デフォルトの名無しさん:2008/03/06(木) 17:32:55
970デフォルトの名無しさん:2008/03/07(金) 19:09:03
どなたか
「USB Video Class Extension Units」と戦ったかた居ませんか?
ttp://msdn2.microsoft.com/en-us/library/ms803127.aspx

サンプルどおりに.axのDLLを作成して、infで登録し、
デバイスマネージャのドライバリストには入ってるんですけど
実際にAPLから、

pKsTopologyInfo->get_NumNodes(&nNodesNum);

for( int i=0 ; i<nNodesNum ; i++ ){
GUID guid;
hr = pKsTopologyInfo->get_NodeType(i,&guid);
if (!SUCCEEDED(hr)){
printf("err\n");
}
}

ってやると、extension unitのnodeで
KSNODETYPE_DEV_SPECIFICが帰ってくるんですよ。
(他のnodeは正常なGUIDが取れる)
ここではextension unitのGUIDeが帰ってくると
思ってたんですけど。・・・?
971デフォルトの名無しさん:2008/03/08(土) 09:19:06
ハードメーカー以外に居ない予感
972デフォルトの名無しさん:2008/03/08(土) 12:51:36
個々のフィルタの設定をIPersistStreamで保存したいのですが、うまく行きません。
IPersistStream::Save()は成功するのですが、IPersistStream::Load()はいつどのフィルタで呼んでも「初期化は既に完了している」とエラーが出てしまいます。
そもそも、設定の保存にIPersistStreamを使うので合っているのでしょうか?
973デフォルトの名無しさん:2008/03/08(土) 13:20:42
974デフォルトの名無しさん:2008/03/10(月) 12:26:29
IMediaSeeking::SetPositionsの説明に

AM_SEEKING_SeekToKeyFrame
最も近いキー フレームをシークする。これは高速だが、精度は落ちる。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/DirectX9_c/directx/htm/imediaseekingsetpositions.asp

という記載がありますが、AM_SEEKING_SeekToKeyFrameを加えても高速になりません。
これって体感できるほどの効果があるのでしょうか?
975デフォルトの名無しさん:2008/03/10(月) 22:09:40
圧縮形式とデコーダのでき次第じゃね?
976デフォルトの名無しさん:2008/03/11(火) 11:27:40
>>970
UVCのExtension関連の記憶は少しあやふやだけど、KSNODETYPE_DEV_SPECIFICで
良かった気がする。アクセス自体はその後Pinインタフェイスで行ったような。

ただ、UVC周辺は動作が怪しいんだよね…XPでの経験しかないんだけど、Extensionの
サンプルってそのままだと上手く動かなかった気がする。
あとXPだとUVCドライバの対応が中途半端なので、MSDNの説明通りにドライバが動かない
部分もあったり。Vistaだとそこらへん改善してるのかどうか少し気になる。
977970:2008/03/11(火) 13:03:33
>>976
HINTありがとう。

Pinインタフェイスですか・・・。試してないので早速試してみます。
KSNODETYPE_DEV_SPECIFICのノードのPinですよね。

あと、VISTAでもやって見ますね。
978970:2008/03/12(水) 19:58:39
>>976
VISTAでやったところ、get_NodeTypeはDEV_SPECIFICが返り、
やっぱり、CreateNodeInstanceは失敗したんですが、
IKsControlのKsPropertyでアクセスできました!やった。

ただ、XPは同様な方法ではダメでした。
(MSDNにもFilterではなくnodeからしか出来ないと書いてありますし・・)

で、Pinインタフェイスなのですが、IKsPinの事ですよね!?
インタフェイスは取得できたのですが、どう扱えばよいのか・・。

979デフォルトの名無しさん:2008/03/13(木) 12:49:04
質問があります。

他のアプリがUSB接続のカメラの映像をプレビューしている状態で、
自分のアプリでそのカメラの映像をキャプチャーしたいんですけど、
それって、DirectShowのAPIで実現可能でしょうか?

Geekさんの、ビデオ入力デバイスからの映像をAVIに保存するサンプルコード
http://www.geekpage.jp/programming/directshow/video-capture-save-avi.php
を使用させてもらい、試してみたのですが
pCaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_CAPTURE,
NULL, pDeviceFilter, NULL, pFileOut);
でE_INVALIDARGが返却され、映像を横取りキャプチャーすることはできませんでした。

X-LiteというSIPクライアントソフトはその横取りキャプチャー行為が可能で、
その真似がしたいのですが、どうやっているのかが分かりません…
X-Liteのキャプチャーを開始すると他のアプリのプレビュー映像は消えるので、
カメラに映像配信を停止するような?命令を出しているのかもしれません。
980デフォルトの名無しさん:2008/03/13(木) 17:38:50

どなたかアドバイスください。

IBasicAudio::put_Volume だとOSのWAVE音量が変わってしまうようです。

DirectSoundのSetVolumeのように、OSの設定には影響を与えない
アプリ内でのみ有効な音量の変更は出来ないでしょうか?
(設定できるのはOSの音量設定以下での相対値で構いません)

よろしくお願い致します。
981980:2008/03/14(金) 10:26:08
レス付かないですね…

Winampとかでムービー再生するとアプリ内の音量調整はOSのボリューム
コントロールに影響しないので、何かしら方法はあると思うのですけど。
WinampがDirectShowを使ってるかは分らないですが…。

失礼いたしました。
982デフォルトの名無しさん:2008/03/14(金) 11:34:26
>>981
DirectShowでの実現方法は分かりませんが…

WinAPIならコレでできたような…
ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpmltimd/html/_win32_waveoutsetvolume.asp
983980:2008/03/14(金) 12:52:40
>>982
レスどうもです

>waveOutSetVolume
このAPIでは、WAVEボリュームどころかOSのマスターボリュームまで
変わってしまいました。やりたいのはOSのボリューム設定を動かさずに
DirectShowの音声出力だけを制御する(下げる)ことなんです。
984デフォルトの名無しさん:2008/03/14(金) 13:14:05
詳しくないので違うかもしれないが、出力するサウンドデバイスに因ると思う
985980:2008/03/14(金) 13:39:01
>>984
ヒントありがとうございます。手持ちのデバイスで試してみました。

OSデフォルト:WAVE変更無し
マザボのオンボードカード:WAVE変更あり
USB音源:WAVE変更無し

となりました。さらにモニカのGetDisplayNameに"DirectSound:"が含まれ
ない場合にWAVEボリューム変更ありという感じでした。

なら"DirectSound:"が含まれるデバイスを選択すれば大丈夫なのですが、
PCによってはこれだと音が出ない場合もあったりで、結構困りモノです。

なんとかユーザーに選択させる方向で考えたいと思います…。
986デフォルトの名無しさん:2008/03/14(金) 14:24:35
DirectShowの何かがDirectSoundバッファにストリーミングさせてるから
そのバッファの音量変えればいいようにも思えるんだが違うのかな?

もともとの音関係のライブラリはデバイスに激しく依存していて
WAVE系APIで複数音を鳴らせることはできないのも多かった。
で、DirectSoundによってアプリごとの設定ができるようになった。

Winampの場合は出力するときに使うDLLに依存してて、
そのDLLが音量を調節する機能を盛っていたはず。
だから、自力で実装するかDirectSound使うか。

列挙についてはWindowsのガイドライン通りにやっても
うまくいかないことは多いので下手に作りこむとはまると思う。

987デフォルトの名無しさん:2008/03/14(金) 15:39:26
音量変える変換フィルタをサクッと作って繋ぐってのはどうだろう?
フィルタはレジストリに登録しなくても使えるみたいだし。
988980:2008/03/15(土) 10:41:01
>>986
>DirectShowの何かがDirectSoundバッファにストリーミングさせてるから
>そのバッファの音量変えればいいようにも思えるんだが違うのかな?
バッファがどこにあるのか(どう取得するのか)自分の知識範囲では
わかんないです。

>>987
その発想はありましたが、サクッと作れるなら苦労しないです^^;

画像だとサンプルグラバってのを参考にして出力画像を加工する
ってのはやったことあるんですが、音だとどこら辺参考にしたら
いいでしょうか?

デコード後の生データの流れにルーチンを割り込ませることが出来れば、
確かにボリューム調整は単なる乗算なので出来そうではありますが、
そこまでたどり着くので難儀してますね…。
989デフォルトの名無しさん:2008/03/15(土) 11:29:03
PCMデータの加工なんぞWAVEの基礎だ。
理解に5分もかからないけどな。
990デフォルトの名無しさん
今もあるかどうかわからんが、Inplace null フィルタサンプルにインタフェイス一個と
追加して掛け算するようにすれば簡単にできると思う。

コールバックを登録するインタフェイスを追加して、掛け算の代わりにコールバックを
呼ぶフィルタにすれば今後映像音声のいろんな加工やモニタリングに流用可能。