DirectShowと戦うスレ Part 2
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/11/08(水) 00:25:56http://pc8.2ch.net/test/read.cgi/tech/1026666092/
0084デフォルトの名無しさん
2006/11/28(火) 19:34:50ありがとうございました
なぜGetMediaTypeの中に出力Pinの設定をかくのか未だ謎。
まぁもう少し使い勝手(入力画像サイズの自動判断など)よくしたら
ソースとバイナリうpします
今後の為にも
0085デフォルトの名無しさん
2006/11/28(火) 19:36:21DirectXで描画したイメージを100%忠実に取り出すことなんて そもそもできるのか?
0086デフォルトの名無しさん
2006/11/28(火) 22:49:29ココわからないと、この先しんどいと思われ
0087デフォルトの名無しさん
2006/11/28(火) 23:01:47GetMediaTypeは上流ストリームの設定を取るインターフェースだけではなく
下流ストリームの接続の設定も取るしくみなのかしら?
だとしたらPinそれぞれにMediaTypeを取れるインターフェースを作ってもらいたいものよね
0088デフォルトの名無しさん
2006/11/28(火) 23:52:18だからそうなってるだろ?
0089デフォルトの名無しさん
2006/11/29(水) 17:43:12後学の為の資料としてソースうpしてくれるなら
ソースは直接書き込んだ方がいいかも。
うpろだだと後々検索でこのスレ見た人とかは拾えないから。
>>85
DllInjectionでDirect3D乗っ取ってフロントバッファを取得して、
それを直接DirectShowに流して動画キャプチャソフトを作りたいんじゃないかな?
俺は>>83じゃないからわからんけど。質問見た感じそんな所じゃないかなーと思った
0090デフォルトの名無しさん
2006/11/29(水) 19:49:16わかりました。
えいちてぃーえむえるにしてソースをどこかに貼りますね。
ただまだ解決出来ない問題がありますので暫くかかると思うけど…
画面の解像度変更すると出力Pinとレンダラの間に中間フィルタ「Colorコンバータ」が何故か入る
(´・ω・`)
中間フィルタさえはいらなきゃちゃんと表情されるのに…
0091デフォルトの名無しさん
2006/11/30(木) 02:41:37フロントバッファと画面イメージって必ずしも同じじゃないんじゃ?
よくわからんけど。。。
0092デフォルトの名無しさん
2006/11/30(木) 22:47:39え、BeginScene()とEndScene()の間のレンダリング結果が
Present()によってバックバッファからフロントバッファに
Blt(あるいはFlip)されると思ってたけど、違う?
0093デフォルトの名無しさん
2006/12/07(木) 14:28:29{
・
・
・
とコールバックとかいうのをすると、下記のようなエラーがでるのですが
どうすればよいのでしょうか?
.\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' の宣言を確認してください。
0094デフォルトの名無しさん
2006/12/07(木) 14:38:30仮にCUnknownがIUnknownのメソッドを実装するクラスとして存在したとしても、
C++ではCGrabCBがCUnknownを継承しただけでは、
ISampleGrabberCBのIUnknownのメソッドを実装したことにはならないはず。
0095デフォルトの名無しさん
2006/12/07(木) 14:51:07このエラーが出てしまって。前も出たのですがどうやって修正したのか忘れてしまった
次第です。
やり方は
ttp://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/directshow.html
を真似しました。
009693
2006/12/07(木) 14:59:05で、インクルードすると
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)' がありません
またエラーが出てきてしまいました。前はこれでうまく言ったのですが・・
0097デフォルトの名無しさん
2006/12/10(日) 22:24:56TVチューナーの付いたパソコンだとTV映像が表示されてしまいます。
なんとかWEBカメラに限定させることはできないでしょうか?
0098デフォルトの名無しさん
2006/12/11(月) 17:08:23(最終的に別のソフトで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;
0099デフォルトの名無しさん
2006/12/11(月) 17:08:55CoCreateInstance(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 );
0100デフォルトの名無しさん
2006/12/11(月) 17:10:19pGraph->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();
0101デフォルトの名無しさん
2006/12/11(月) 17:11:22if(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();
-----------------------------------------------------------------------
いろいろ試行錯誤していたので少し読みにくくてもうしわけありません。
0102デフォルトの名無しさん
2006/12/11(月) 17:21:22pAVIMux->GetClassID(&id);
CoCreateInstance(id, NULL, CLSCTX_INPROC, IID_IConfigAviMux, (void **)&pConfMux);
pAVIMux->QueryInterface(IID_IConfigAviMux, (void**)&pConfMux);
pConfMux->QueryInterface(IID_IConfigAviMux, (void **)&pAVIMux);
の辺りを主にいじっていました(コードを実行する場所をかえたりなども)
0103デフォルトの名無しさん
2006/12/11(月) 17:33:02WMV: 各サンプルにタイムコードあり
AVI: 各サンプルにタイムコードなし
とかこのあたりの問題はOK?
0104デフォルトの名無しさん
2006/12/11(月) 17:42:49いじるのは無理と判断しまして、Directshowで出力前設定をいじれば勝手に
それをはさんでくれるのではないかと思いまして(Grapheditではうまくいったので)
動画関係をいじりはじめたのがつい最近なので色々調べはしましたが
細かいところはよくわかっていないと思います
0105デフォルトの名無しさん
2006/12/11(月) 17:46:28↓
「AVI→mp4の変換がうまくいかずに」
が誤字なのとそのあとの調べたものを書きそこねました
自分で無理だと判断↓原因がタイムコードです
0106デフォルトの名無しさん
2006/12/11(月) 19:56:380107デフォルトの名無しさん
2006/12/11(月) 19:57:300108デフォルトの名無しさん
2006/12/11(月) 20:26:13そういうのって、どこかで指定できましたっけ?
接続してるカメラを列挙してるから
カメラ以外は入ってこないと思ってたんですが。
0109デフォルトの名無しさん
2006/12/11(月) 22:20:47>>103氏の懸念していることに近いけど。
入力のWMVと出力されたAVIの総フレーム数は一致しているだろうか。
また、それぞれのフレームレートはどうなっているのかな?
その辺の具体的な数値があった方が状況を確認しやすいと思う。
011098
2006/12/12(火) 10:44:27WMVファイル →WMAudioDecoderDMO →AVIMux →FileWriter
→WMVideoDecoderDMO →AVIDecompresser→
となっています
変換結果は
フレームレートは両方30fpsなのですが、
出力されたAVIのフレーム数は1723です(WMVのほうは調べ方がちょっとわからなかったです)
再生時間がWMV時点で28.7秒でAVIにすると57.4秒で丁度綺麗に2倍になる感じです
フレームの持続時間のほうはフレームレートの調整程度しか意識していませんでしたので
また少し自分でも調べてみようと思います。
011198
2006/12/12(火) 10:55:08mp4に変換するとファイルによって色々な症状がでて3個ほどサンプルを試した内では
ひとつもまともに再生できませんでした。
dwAudioTime = (double)dwAudioLength * dwAudioScale / dwAudioRate;
dwMicroSecPerFrame = dwAudioTime / dwVideoLength * 1000000.0+0.5;
dwVideoRate = 1000000L;
dwVideoScale = dwMicroSecPerFrame;
011298
2006/12/12(火) 11:05:27書き換えた部分はstrhヘッダ(ストリームタイプがvids)の
rateとscale、avihヘッダのmicrosecperframeです
0113デフォルトの名無しさん
2006/12/12(火) 11:10:40>フレームレートは両方30fpsなのですが、 出力されたAVIのフレーム数は1723です
30fpsで1723フレームなら、57秒ちょっとで合ってるじゃないですか。
GraphEdit で WMV ファイルを再生して、ビデオレンダラのプロパティで再生フレーム数を見れば
おおむねのフレーム数がわかると思います。それでフレーム数を確認してみてください。
それから、WMV はフレーム毎にタイムスタンプが付いていますから(≒フレームの時間的間隔が
一定ではない)、デコードして AVIMux で結合という簡単な処理では決して正しい AVI ファイルは
出来ないということも理解する必要があります。
011498
2006/12/12(火) 13:05:01WMV(変換元ファイル)のほうは28秒ちょっとなので57秒でフレームが丁度2倍になっている感じですね
>それから、WMV はフレーム毎にタイムスタンプが付いていますから(≒フレームの時間的間隔が
>一定ではない)、デコードして AVIMux で結合という簡単な処理では決して正しい AVI ファイルは
>出来ない
やはりちょっとヘッダー部などをいじった程度だと無理でしたか
Directshowのフィルターがその辺の処理をやってくれるのではないかと
甘く見ていました
011598
2006/12/12(火) 13:17:20まともに再生されるのですが、AVIMuxでファイル保存できるようにするときに
タイムスタンプが抜かれてしまうのでしょうか?
0116デフォルトの名無しさん
2006/12/12(火) 16:42:29AVI 形式のファイルは、メディアフォーマットで指定された同一持続時間の
サンプルがずらーっと並ぶだけというようなフォーマット。
なので正しいフレームレートでかつ1フレームの欠落もないデータじゃないと
正常に再生できない。
変換元ファイルを走査して、真のフレームレートを計算してWMV側で落ちている
フレームも捏造して自分でmuxするとかやり方はあるような気がするけれども、
絵と音がずれないAVIファイルを作るのはとても難しいです。
011798
2006/12/12(火) 19:17:37とりあえずWMVファイルを調べてその最小公倍数分のフレームレートをAVIファイルに設定、
フレームの余計な部分に空フレーム挿入などで試してみようと思います。
途中で挫けそうですが、もしうまくいったら報告だけでもさせていただきます。
…WMVとかに使っているコーデックで圧縮かかってるとその別ソフトが読み込んでくれないから大変です...orz
色々教えていただいてありがとうございました。
0118デフォルトの名無しさん
2006/12/21(木) 21:42:10どこみても質問に回答してる。
ネ申ですか?それともM$の中の人ですか?
0119デフォルトの名無しさん
2006/12/22(金) 00:43:590120デフォルトの名無しさん
2006/12/22(金) 08:57:53教徒と言う事は宗教団体さんみたいなもんなんすね。
DirectShow究めるためにボコノン教に入ってみたいかも
0121デフォルトの名無しさん
2006/12/23(土) 17:14:46参考になるサンプルなどありますか?
情報が少なくて困っています。
変換フィルタはいくつか作成したことがあります。
0122いつでもどこでも名無しさん
2006/12/23(土) 23:31:060123デフォルトの名無しさん
2006/12/27(水) 00:00:48ソースがプルなのかプッシュなのかによりスプリッタの挙動が大きく異なるわさ
プッシュなら来たサンプルバラして後方にポンポコ投げろや
プルなら入力ピン繋がった時点でソース先読みして各種情報提供してやるとか色々とアレ
年末ゆえ酒飲んでて上手く得ないけど、まあ察しろ
出力ピンに関してはINFTeeのサンプルが参考になるよ
>>122
変換式ならググればゴロゴロみつかるし、後は自分でやってもたいしたことないだろ がんばれー
0124デフォルトの名無しさん
2006/12/27(水) 00:01:470125デフォルトの名無しさん
2006/12/27(水) 20:37:01変換を自作したがいちピクセル単位でやると遅くてつかいものにならんかったよ。
そこで私は
趣味→オーブンしーぶい(ただだけど配布できない)仕事→あいぴーぴー(よっしゃでかえるレベル)
を使った。一個関数呼ぶだけだった
0126122
2006/12/28(木) 02:18:06変換式は見つかりました。でもSSE命令とか使いたいところです。
アセンブラ画像処理プログラミング って本買ってきたので頑張ります
>>125
OpenCVやIPPの場合、どんな関数使えばいいですか?
正にIplImageが欲しいです
0127122
2006/12/28(木) 02:23:55OpenCVって配布できないんですか?
http://journal.mycom.co.jp/news/2006/11/08/360.html
http://e-words.jp/w/BSDE383A9E382A4E382BBE383B3E382B9.html
BSDライセンスってことですが
0128122
2006/12/28(木) 02:57:28OpenCVで変換する関数を是非教えて下さい
0129122
2006/12/28(木) 09:22:06アドバイスありがとうございます。
ソースフィルタはFile Source(Async)です。
とりあえず、空の変換フィルタ(CTransformFilter)を作成し、
ソース→空フィルタと接続して解析しようと思ったのですが、
「同じトランスポートをサポートしていない為、ピンを接続できません。0x80040266」
というエラーが起こり、接続することすらできません…
0130121
2006/12/28(木) 09:23:060131デフォルトの名無しさん
2006/12/28(木) 12:47:29FileSource にTransformFilterがそのまま接続可能(かも)と思う時点で
知識が少なすぎて説明とか不可能なレベル。
SDK の DirectShow のドキュメントを先頭からちゃんと読むべし
(大した分量じゃないでそ)。
0132デフォルトの名無しさん
2006/12/30(土) 08:42:31が定義されているとムービー再生時に
VMR9のRenderlessが無視されてActiveMovie Windowが
ポップアップで出てくるんだけど、これ抑制させる方法ないでしょうか?
0133デフォルトの名無しさん
2006/12/30(土) 18:38:310134デフォルトの名無しさん
2007/01/05(金) 01:08:09>>127>>128
オープンしーぶいの話し少し待ってもらってもいいか?
仕事始まれば家に帰るからさ
ライセンスの話は多分私が間違えていると思う。
ただインターネットの書き込みで気になるのがあった
それを張り付けますよ〜。
0135デフォルトの名無しさん
2007/01/06(土) 11:16:080136デフォルトの名無しさん
2007/01/09(火) 19:46:03http://www.microsoft.com/japan/msdn/directx/downloads.aspx
0137デフォルトの名無しさん
2007/01/09(火) 20:55:300138デフォルトの名無しさん
2007/01/09(火) 21:07:56DirectShow関係で何か変わってます?
0139デフォルトの名無しさん
2007/01/10(水) 00:15:22見たいな事言ってるけど実際Win2Kではどうですか?
ぶっちゃけウインドレスモードが欲しいだけなんですが。
オーバーレイとかDirect3Dで描画なんたらとかじゃなく
0140デフォルトの名無しさん
2007/01/10(水) 07:56:143つ以上、思い当たる点があればアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。
□派遣先の社員の意見にはたとえ間違っていても反対しない
□派遣先から「いつまでもここで仕事してくださいね」と言われるようになりたい
□自社に仕事を持ち帰れるように言われるとムカつく
□自社で仕事なんてできるわけがない
□派遣/受託の差異を指摘する人間はムカつく
□派遣先には仕事だけでなく自分のプライベートについても指示して欲しい
□自分の月額金額を知らない
□派遣先社員より自分の生涯収入が低いのは当然だ
□派遣先に尻尾を振り、いつまでも一緒に仕事をすることが大切だ
□今のプロジェクトが終わっても同じ派遣先に常駐したい
0141デフォルトの名無しさん
2007/01/12(金) 02:18:08正社員なんだが仕事の為なら派遣さんにも尻尾ふりますよ。寧ろ俺が最下層。
OctoberではVC6のサポートしていたんだが、December 2006 DirectX SDK は打ち切ったようだね。
「.dws」と言うプロジェクトファイルがなくなっとる
0142デフォルトの名無しさん
2007/01/12(金) 02:48:15派遣は「切られないため」に尻尾ふり
0143デフォルトの名無しさん
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に解像度の情報が乗っていない。。
できないのかな?
0144デフォルトの名無しさん
2007/01/15(月) 13:44:33GetMediaType で解像度入れたメディアタイプを返せばいいんじゃない?
0145デフォルトの名無しさん
2007/01/15(月) 16:31:10回答ありがとうございます。
そのあたりを嗜好錯誤してかつできませんでした。
解像度を返すにはCMediaType->Formatのポインタが必要ですがそこが
空になっているんです。
0146デフォルトの名無しさん
2007/01/15(月) 16:54:48それは当たり前でソ。フォーマットタイプによってpbFormatの先の構造体のサイズは変化するんだから、
事前にアロケートしてもらうのは無理。>>145が自分で SetFormat & SetFormatType してあげないと。
0147デフォルトの名無しさん
2007/01/15(月) 17:15:08できました。
優先的に上流フィルタの解像度を選んでくれるようになりました。
0148デフォルトの名無しさん
2007/01/17(水) 08:27:5460fpsで描画すると(SetTexture→DrawPrimitiveUP→Present)
フルスクリーンモードでDirectShowが固まってしまいます。(デコードが停止)
同じような問題に遭った方いらっしゃいますか?
フルスクリーンでもビデオに合わせて30fps程度に落としたり
(ソースは典型的な29.97fps)、ウィンドウモードにすると問題は無いんですけども・・・。
VGAは NVIDIA GeForce4MX , DirectX9 2006-feb
ドライバは ForceWare 93.71 (2006年11月2日) WHQL認定 です。
0149デフォルトの名無しさん
2007/01/18(木) 01:45:21メモリ上のmp3を鳴らす場合、ソースフィルタをどうにかこうにか、
と言うことのようですが、それ以降さっぱりわかりません。
なにかいいサンプルがあったら教えてください。
0150デフォルトの名無しさん
2007/01/18(木) 04:40:47C:\Program Files\Microsoft Platform SDK\Samples\Multimedia\DirectShow\Filters\Async\MemFile
と、よく知らないのに返答してみる・・・
0151デフォルトの名無しさん
2007/01/18(木) 10:57:19まず標準的なPCにプレインストールされているMP3デコーダフィルタがある、と仮定すると
それが何なのかGraphEdtで調べる。
次にそのMP3デコードフィルタとつながるソースフィルタを自作する。
そしてソースフィルタがそのMP3デコーダフィルタに対してどのようなメディアタイプで接続できるのか調べる。
メディアタイプがわかったらそのメディアタイプにあった形式に、メモリ上のデータとやらを加工してMP3デコーダに渡す。
フィルタ作ったことが無いなら相当大変だよ。
0152149
2007/01/19(金) 03:05:59サンプルも151もまるで理解できないのでとりあえずDirectShowを1から勉強してます。
0153デフォルトの名無しさん
2007/01/19(金) 04:54:19他の選択肢があるかもしれんし。。。
0154デフォルトの名無しさん
2007/01/19(金) 23:55:04これが標準にインストールされてるデコーダだよ。
このデコーダ通ったストリームがWAVEファイルみたいな生な音声ファイルになってるからそこに変換フィルタを自作してやればいいよ。
意外と簡単にいけるかもしれん…
0155デフォルトの名無しさん
2007/01/24(水) 10:52:40この↑ページをみながらDirectShowLibを使ってC#で
USBのマイク&カメラ(LogicoolのQcam10.0)からの入力をCaptureGraphBuilderを使って
MuxAVI経由でAVIファイルとして保存しているのですが、
フィルタグラフマネジャIGraphBuilderのRun(),Stop()およびIFileSinkFIlterのSetFileName()を使って、
Run 5秒間保存 Stop 保存先変更 Run 5秒間保存 Stop 保存先変更・・・
と繰り返すと、できあがったファイルは
1つ目、所望のものが得られた
2つ目、映像が〜5秒フリーズして5秒後から再生される。音声は再生直後から5秒までにちゃんと入っている
3つ目、映像が〜10秒フリーズして再生される。音声は同上
のようになっていて、どうもVideoのほうの時間がおかしいのですが、
そこをうまく扱えるような方法があったら教えてください。
0156デフォルトの名無しさん
2007/01/24(水) 12:34:32厳密に言うとMediatimeの初期化をしてくれてないからそうなる。
カメラの後に「Smart Tee」繋いで、さらにフレビューピンに繋いだら?
0157155
2007/01/24(水) 17:57:20とりあえずそれでやってみます!
0158155
2007/01/24(水) 20:43:33>>156さんの
>>カメラの後に「Smart Tee」繋いで、さらにフレビューピンに繋いだら?
のおっしゃるように
VideoSource->SmartTee->PreviewPin->AviMux->FileWriter
とつないだら、Runできずに
The graph could not change the state.
タイムスタンプがこのサンプルに設定されていません。(Return code:0x80040249)
と出て行き詰まっています。
知識不足でお聞きしたいのですが、
タイムスタンプがないのはバグなのでしょうか、
それとも当然の動きで設定になにか必要なのでしょうか・・?
もともと連続でファイルを区切って数秒間の音声付き映像をキャプチャできれば違う方法でもよく、
いちいちGraphBuilderを解放してまた作るとうまくいくことはいくんですが、
それでは解放と作成に時間がかかるのでもっと早くできる方法を探していて
上記155みたいな試行錯誤してます。
0159デフォルトの名無しさん
2007/01/24(水) 20:47:14previewピンからの出力にはタイムスタンプがつかないのがDirectShowのお約束です。
>いちいちGraphBuilderを解放してまた作るとうまくいくことはいくんですが、
QCAMのフィルタだけDisconnectして取り除いて作り直して挿入して接続するとか。
0160デフォルトの名無しさん
2007/01/24(水) 20:58:38で、なんでそうしろといったかと言うと
キャプチャピンとプレビューピン両方にレンダラ繋いで再生→停止を繰り替えすとわかる。
キャプチャピンに繋いだ方は画像が流れて来なくなる以前に5秒再生してたら5秒間固まる。
これはQCAMがタイムスタンプを初期化してないからだと思う。
多分自分でスタンプ情報作ってやればよかったと思うけどソースが会社なんだ…
コンブライアンスが厳しい
0161155
2007/01/24(水) 22:07:33ご返答ありがとうございます。
なるほど。
タイムスタンプが設定されていません。はPreviewPinより下流のFilterが発していたことがわかっていませんでした。(恐らくFileWriter?)
>キャプチャピンに繋いだ方は画像が流れて来なくなる以前に5秒再生してたら5秒間固まる。
まさにそのとおりです。
>多分自分でスタンプ情報作ってやればよかったと思うけどソースが会社なんだ…
>コンブライアンスが厳しい
っということは諦めるかタイムスタンプを自分で打つfilterを作るかでしょうか・・キビシイですね
とりあえず>>159さんの
>QCAMのフィルタだけDisconnectして取り除いて作り直して挿入して接続するとか。
をやってみます。
0162デフォルトの名無しさん
2007/01/24(水) 23:03:55フレビューピン、コンブライアンスワラタ
0163155
2007/01/25(木) 08:21:37たぶん(としかいえないのがつらいのですが)Qcam10.5をインストールした後に直ったと思われるので、
Qcam側の原因が自動的に解決されたのだろうと解釈しています・・
いろいろと本当にありがとうございました。
0164155
2007/01/25(木) 08:23:22携帯だったのですね
感謝してます
0165162
2007/01/25(木) 18:45:16どうもありがとう。自分も試してみますm(__)m
0166デフォルトの名無しさん
2007/01/26(金) 20:48:07変換フィルタにてRGB24ビットのIMediasampleを扱っているのですが、
カメラから入ってきた画像に線を書いてレンダラに渡したいと思ってます。
DIB形式のBMP画像に直接線を描く関数を探しております。
なにが難しいと思っているかというと、デバイスコンテキストが得られない事で、「LineTo」などを代表するWinAPIが使えない事です。
みなさんはどのように画像の加工をしているのでしょうか?
やっぱりオーバーレイとかですか?
0167デフォルトの名無しさん
2007/01/27(土) 00:44:03それをメモリデバイスコンテキストでセレクトしてやればGDIで描画できるんじゃないかな。
0168デフォルトの名無しさん
2007/01/27(土) 01:10:27ありがとうございます。
http://www.greenwood.co.jp/~k-aki/pc/directshow_movie/directshow_movie.html#h-7
↑このページのレンダラ処理に>>167さんのおっしゃるようなことが書いてあったため
試して見ます
ちなみにこんなソース
// ビデオ ヘッダーへのポインタを獲得する。
const VIDEOINFOHEADER *pVideoHeader
= (const VIDEOINFOHEADER *)pMediaType->pbFormat;
// ビデオ ヘッダーには、ビットマップ情報が含まれる。
// ビットマップ情報を BITMAPINFO 構造体にコピーする。
ZeroMemory(&m_bitmapInfo, sizeof(m_bitmapInfo));
CopyMemory(&m_bitmapInfo.bmiHeader
, &(pVideoHeader->bmiHeader)
, sizeof(BITMAPINFOHEADER));
// ビットマップ ヘッダーから DIB を作成し、バッファへのポインタを獲得する。
HBITMAP hBitmap
= CreateDIBSection(0, &m_bitmapInfo, DIB_RGB_COLORS, &m_buffer, NULL, 0);
if(hBitmap){
m_hdc = CreateCompatibleDC(NULL);
SelectObject(m_hdc, hBitmap);
0169デフォルトの名無しさん
2007/02/05(月) 11:52:49ここを参考に、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によるデバッグ(?)で確認しましたが、
最後のファイル書き込み部分がつながりません。
なにかヒントをいただけたらよいのですがどうでしょうか・・
0170169
2007/02/05(月) 11:53:51wavFilterは
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);
こんな感じでやっております。
0171169
2007/02/05(月) 21:45:12sinkSetFilter.SetFileName(sinkFileName, null);
にしたらできました。
なんでやろ
0172デフォルトの名無しさん
2007/02/06(火) 19:24:44むかしここかどこかに貼ってあった気がするんだけど、
誰か知りませんか?
0173デフォルトの名無しさん
2007/02/07(水) 12:21:04「拡張ストアド プロシージャーDLL」
これで作っちゃだめなの?
自分はいつもこれで作って、
〇「proc.c」を削除
〇「stdafx.c」にStreamヘッダを追加
〇追加インクルード
〇モジュール定義
〇ライブラリ追加
をしていた。これがめんどいです?
0174デフォルトの名無しさん
2007/02/07(水) 13:28:32有り難うございます。
あちらで聞いた方が良かったですか。でも、今から同種の質問を飛ばすとマルチですし。
やはり、October 2004かsummer 2003ですか。試してみます。
私もVC6やめたいところですが、色々としがらみと要望がありまして。
未だにVC6の需要があるので困ります。
0175174
2007/02/07(水) 13:30:270176デフォルトの名無しさん
2007/02/07(水) 15:53:05ありがとうございます。めんどいとかじゃなくて
そのやり方を知りませんでした。
参考になりました。
0177デフォルトの名無しさん
2007/02/07(水) 16:14:12Sampleを改造することにします。
0178デフォルトの名無しさん
2007/02/07(水) 16:17:44http://hammer.prohosting.com/~arabo/DirectMediaWz.shtml
0179デフォルトの名無しさん
2007/02/07(水) 19:02:10ぶっちゃけDLL作るプロジェクトならなんでも可
まぁ結局新規プロジェクトでフィルタ作れるようになってもサンプル改造に落ち着くんだけど
0180デフォルトの名無しさん
2007/02/08(木) 08:58:22VC6…DirectXサポート切れていて最新の盛り込みできない
VC2005無料版…リソースエディタがないため扱いづらい
VC2005…普及してる?
C#…これ自体存在が微妙
VB…本格的にやるには不向き
他…資料がなさすぎね??
0181デフォルトの名無しさん
2007/02/08(木) 11:44:35VC2005無料版はいろいろ難関がありそうだよね。
ただVC2003のプロジェクト(非DirectShow)をコンバートしただけなのに
PlatformSDKのセッティングとか初めてだと面食らう。
なぜかウチの環境だとPlatformSDKのツリーがVc7の下にあって・・・。
近いうちにVC2005導入予定だけど、普及の問題は別として開発しやすいのかな?
0182デフォルトの名無しさん
2007/02/09(金) 00:09:39プレビューで使われる画像サイズやフレームレートをプログラムから
指定する方法は無いでしょうか。
IVideoWindow等でウィンドウを小さくする等だと転送するデータは変わらないので
負荷が下がらないと思うので駄目だと思います。それとも変わるのでしょうか。
IPropertySetStorageで色々設定できるダイアログが表示されるが
これって使う人の立場で考えると
製品によってダイアログが違うので説明が大変だし
変にいじって品質を落としたりする可能性があって嫌なんだが
これしかないのでしょうか。
0183デフォルトの名無しさん
2007/02/09(金) 01:31:30自分でカメラの出力pinに対して要求だせばいいよ
MSDNのヘルプみるよろし
■ このスレッドは過去ログ倉庫に格納されています