1 名前:デフォルトの名無しさん [2008/06/22(日) 18:38:21 ] DirectShowプログラマーのみなさん。 メソッドのデッドロックとか、わけわからん現象多くないすか。 このスレに怒りやテクをぶつけましょう。 関連スレ Win32API質問箱 Build67 pc11.2ch.net/test/read.cgi/tech/1212931246/ くだすれDirectX(超初心者用) part.3 pc11.2ch.net/test/read.cgi/tech/1193605500/ 【C++】 DirectX初心者質問スレ Part17 【C】 pc11.2ch.net/test/read.cgi/tech/1207702556/ DirectX総合スレ (Part8) pc11.2ch.net/test/read.cgi/gamedev/1205306118/ 【PureVideo】DirectX Video Acceleration【AVIVO】 pc11.2ch.net/test/read.cgi/tech/1178285897/
82 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 18:26:56 ] そこにソリューションのファイルあるだろう ビルドしてみそ。Vistaだと別の場所にする必要がある。 そこでできたlibをリンク
83 名前:デフォルトの名無しさん [2008/10/26(日) 13:38:07 ] SampleGrabberでオーディオを取得して、加工しています。 ムービーの場合は、BufferCB()には、1フレーム分のデータがくるので、 加工などは、とてもし易いのですが、オーディオの場合、同じ44100Hz16Bitステレオのデータでも、 非圧縮のWAVEと、MP3、WMAなどの圧縮データでは1回ごとのBufferCB()に流れてくるPCMの データ量は違うようです。 例えば3秒のデータを取得したいのですが、 IMediaControl->Run(); IMediaEvent->WaitForCompletion(3000, &evCode); で、確かにデータは取得できるのですが、実時間待つので リアルタイム処理ができません。 どうすれば実時間より短い時間で正確に3秒分のPCMデータを取得できますか?
84 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 13:59:49 ] 3秒分だけをリアルタイム処理したいの? ソースは何を想定してるの?
85 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 14:40:40 ] クロック無視してデータをなるべく早く流したいときはフィルタグラフのIMediaFilter::SetSyncSourceにNULLを渡す。 ヘルプのReference Clocksを参照。 しかし>>83 のWaitForCompletionの使い方は何か勘違いしてる予感。
86 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:34:40 ] シューティングゲームなどで複数の効果音を連続で再生させるような場合、 DirectShowは不向きですか?
87 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 23:54:02 ] DirectSound or OpenALでおk。つーか調べろ。
88 名前:デフォルトの名無しさん [2008/10/27(月) 03:21:32 ] >>84 3秒と書いたのは、任意の時間分のデータを取得したかったので、 とりあえず3秒としただけなんです。 エフェクト用のバッファが0.5秒なら0.5秒だったりします。 ソースはDirectShowで処理できる任意の音楽データです。 >>85 Reference Clocksを参照してみます。 IMediaEvent->WaitForCompletion(3000, &evCode); には特に意味はありません。 IMediaEvent->WaitForCompletion(INFINITE, &evCode);ですべてのデータを取得していたのですが、 例を3秒としたので、単純に書いてみました。 >>84 ,85 返信をありがとうございました。
89 名前:79 mailto:sage [2008/10/27(月) 19:00:43 ] >>82 ありがとうございました。おかげでそのエラーはなくなりました。 ただ、今度は エラー 1 error C2146: 構文エラー : ')' が、識別子 'pName' の前に必要です。 c:\program files\microsoft sdks\windows\v6.1\samples\multimedia\directshow\baseclasses\refclock.h 80 エラー 103 error C2327: 'CBaseReferenceClock::LPCTSTR' : 型名、スタティック、または列挙子ではありません。 c:\program files\microsoft sdks\windows\v6.1\samples\multimedia\directshow\baseclasses\sysclock.h 25 のようなエラーが大量に出てきてしょんぼりな事態に陥りましたorz これは該当するコードの部分を修正するほかないんですよね?
90 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 19:31:08 ] >>89 LPCTSTR がどこのヘッダで定義されているか検索してみるよろし
91 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 21:33:00 ] どんどんすれ違いな方向へ・・・
92 名前:メモ mailto:sage [2008/11/01(土) 16:20:51 ] MSDN Forums ≫ Software Development for Windows Vista ≫ DirectShow Development Discuss how to develop DirectShow applications using the API provided in the Windows Platform SDK forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=129&SiteID=1
93 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 18:42:42 ] 79の書き込みを見てビルドしてみたんだが,なんかビルド通らねえな 文字セットもマルチバイト文字セットを使用するにしたし, Windows.hもインクルードしたんだが・・・ refclock.hの80/139/178/166とsyclock.hの25行目でエラー出る 何が問題なんだろう・・・ そして79の子は投げたのだろうか?
94 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 19:30:21 ] >>79 ってサンプル? >>82 だけど、実際にビルドできるの確認して書いたんだけど。
95 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 19:31:09 ] >>93 マジですか Ver6.0 しか使ってなかったので 帰宅したら 6.1 で試してみよう
96 名前:94 mailto:sage [2008/11/05(水) 19:31:47 ] ググってみたけど、Dshow.hが複数あって別のやつがincludeされてた、というのがあったが
97 名前:95 mailto:sage [2008/11/06(木) 02:30:35 ] WindowsSDK Ver6.1 + VisualStudio2005 Standard SP1 で >>79 がビルドを試みたと思われるサンプルフィルタ(WavDest)をビルドしてみた。 ・ソリューションに「追加のプロジェクト」で BaseClasses.vcproj を追加 ・WavDest→BaseClasses の依存関係を設定 という操作は別途行ったが、Debug/Release ビルドしたところ特にエラーもなくビルドできた。 graphedit でも動作することを確認。 BaseClasses をマルチバイト版の構成(Debug_MBCS/Release_MBCS) でビルドしようとすると WavDest 側がUNICODE版の構成しかないので >>79 のようなリンクエラーが出るのは当たり前。 >>89 >>93 のコンパイルエラーはこちらでは再現できず。(謎) >>96 の通り別バージョンのヘッダが混じってると確かに起きそうな気はするが…。
98 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 00:23:02 ] BaseClassesのStreams.hをインクルードしたつもりが 別のStreams.hがインクルードされてしまっていたことがあった(>>93 みたいなコンパイルエラーが出てたはず) BaseClassesが先頭になるように、インクルードの優先順も見直してみるといいかもね。
99 名前:93 mailto:sage [2008/11/07(金) 14:21:42 ] 文字セットがUNICODE版じゃなかったのが問題だったぽい.騒がしてすまん 後,BaseClassesを先頭に持ってくるようにしたら,すんなりとコンパイルできた とりあえず,BaseClassesは先頭に持ってこないとコンパイルエラーでるっぽい. >>79 へ 97氏がやってるようにして,すべての文字セットがUNICODEであることを確認して, 追加のインクルードディレクトリでBaseClassesを先頭にしたらコンパイルは通るともう.
100 名前:sage [2008/11/21(金) 15:23:39 ] DirectShowでデコードした動画をOpenGLのテクスチャに流し込むプログラムを書いています。 CBaseVideoRendererを派生させてOpenGLのテクスチャを更新する自作フィルタを作成し、 それは動作しているのですがパフォーマンスに不満があります。 OpenGLでのテクスチャのアップデートにはPBOを使用しているのですが、この場合アップデー トを行うバッファはOpenGL側から指示されます。 一方、CBaseVideoRendererのDoRenderSample()メソッドでは、デコードされたデータへの ポインタは前段のデコーダーから与えられます。 そのため、DoRenderSample(IMediaSample * pSample)内でpSample->GetPointer()で得られた バッファからPBOのバッファへのmemcopy()を行う必要があり、結構なオーバーヘッドとなっ ています。 OpenGLから与えられたバッファアドレスを前段のデコーダの書き出しバッファとして指定で きれば、この無意味な転送はなくなると思うのですが、こういった指定をする方法はないで しょうか? IMediaSampleではPutPointer()は使えなくなっているようですが、なにかうまくデコーダの バッファをレンダラ側から扱う方法は無いものでしょうか?
101 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 15:51:52 ] >>100 ピッチの指定ができなかったから結局は自前コピーが必要かもしれない。 自前のアロケータ(ISampleAllocator)を返してやればそれを使ってくれることもあるけど使用するとは限らない。 個人的にはFBOのほうが好きだ。PBOよりパフォーマンスがいい気がする。 まあこのくらいのメモリコピーなんて気にするな。こういう状況はよくあること。
102 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 19:24:32 ] >>101 情報ありがとうございます。 無理っぽいですか・・。 とりあえず、教えていただいたアロケータ関連を調べてみます。 運よくつかってくれればラッキーってことで。 処理すべき、動画のサイズが4K用と馬鹿にならないサイズなので少しでも オーバーヘッドが減るとうれしいんです。MediaPlayerClassicあたりだと そこそこのフレームレートで再生されていますし。 あと、ここでする話しじゃないですけど、PBOを使用しているのは、 テクスチャとしてポリゴンに貼り付けて使いたいからです。 FBOでもテクスチャの転送用として使えるんでしょうか?
103 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 20:51:18 ] ふと思ったけどPBOじゃなくて普通に受け取ったサンプルのバッファでglTexSubImage2Dするのが簡単だな。コピー量同じじゃね? FBOは主にオフスクリーンレンダリング用途だけど↑の理由から使う意味があんまりない。どっちかというと逆の用途用。 以前ベンチマークしてみたことがあるんだが、FBO実装のほうが速い結果を得た。 ついでに将来的にPBOは消えるというかサポートされなくなる話も聞いたり。
104 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 21:05:44 ] IBasicVideo の GetCurrentImage を使って、 ビデオのワンフレームをビットマップとして保存しようと思っているのですが、 ソースが mpeg2 の場合だと何故か真っ黒なビットマップしか取得できません。 ソース、取得するフレームの位置、mpeg2 video decoder を色々変えて試してみたのですが、 結果は変わりませんでした。 ソースが avi, wmv, mpeg1 の場合は正常なビットマップを取得でることを確認済みです。 このことについて何かご存知の方おられましたらご教示お願いします。 試した mpeg2 video decoder は次のものです。 MpegVideoDecoder PIXELA, Cyberlink Video/SP Decoder
105 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 23:01:46 ] 上に便乗なんですが、GetCurrentImageでバッファサイズを取得すると40バイトほど大きくなってしまいます。 まあ、使った動画がどちらも160×112の動画なので、他の場合はどうなるのか分からないんですが この大きくなってしまうのは何が原因と考えられるのでしょうか?
106 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 23:46:52 ] >>102 OpenGLは詳しくないんで>>103 氏のコメントで正しいんでしょうが、 >>101 でも触れられている通りデコーダがテクスチャのピッチ通りに データを吐けるとは限らない(というか多分無理)ので、 デコーダから直接書き出すのはかなり難しいでしょう。 (デコーダもデコーダでいろいろ高速化の制約を受けてたりするし) >>104 IBasicVideo::GetCurrentImageはいろいろ制約が多いそうなので、 ちょっと面倒でもSampleGrabberを使ってみることをお勧めする。 なあに、慣れれば大したことないから。 (参考) ttp://www.geekpage.jp/programming/directshow/samplegrabber.php あと、サンプルのDumpフィルタベースで自前キャプチャフィルタを作ったこともある。 SampleGrabberより敷居高いのでお勧めしないけどw >>105 IBasicVideo::GetCurrentImageのドキュメント読むべし。 > メソッドが成功すると、バッファには BITMAPINFOHEADER 構造体、Win32 BITMAPINFO 構造体に定義されている > パレット エントリおよびビット マスクを含む DIB イメージ全体が書き込まれる。 だぞ。 40バイトってBITMAPINFOHEADERのことじゃないか?
107 名前:104 mailto:sage [2008/11/22(土) 00:22:43 ] >>106 情報ありがとうございます。 自前で作られたフィルタは IBasicVideo や ISampleGrabber を使うより効率よさそうですね。 うらやましい限りです。 実は ISampleGrabber を使ったことがあります。 そのときは、参考ページの geek さんの方法と同じく、 ISampleGrabber を RGB24 で SetMediaType しました。 すると、ソース が mpeg2 で video decoder が Cyberlink の場合だと、 ISampleGrabber が繋がらなかったのであきらめてしまいました。 Cyberlink の output pin が RGB 出力に対応していないのが原因というところまでは分かりました。 再び質問で申し訳ありませんが、 [Cyberlink S/P decoder] -> [ISampleGrabber] ↑を実現するためにはどうするのがいいでしょうか? 1. video decoder と ISampleGrabber の間に適当な color space converter をかます 2. ISampleGrabber の入力ピンの対応フォーマットを増やす(例えば YUY2) 3. それ以外の何か
108 名前:106 mailto:sage [2008/11/22(土) 00:43:00 ] >>107 CyberlinkのデコーダとSampleGrabberはどうやって繋いだんでしょう? ピン同士を繋いで勝手にColor Space Converterが挿入されなかったとしたら Color Space Converterが受け入れられないYUVフォーマットで出力されている可能性がありますね。 Cyberlinkのデコーダがサポートしている出力フォーマットを知るのが先決ですかね。 とりあえずDumpフィルタをデバッグビルドして、grapheditで接続してみる、 そのときgrapheditのプロセスにアタッチしてDumpフィルタのCheckMediaTypeでbreakかけて 待ち伏せればサポートしている出力ピンのメディアタイプが分かるかも。 (もっと楽な方法もありそうですが、言葉にするほど面倒なことでもないです) YUV→RGBを自前でできるならYUY2なりYV12なりで受けるのもアリですね。 ところでgrapheditでCyberlinkのデコーダ使って普通にMPEG-2を再生できてます?
109 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 00:49:41 ] >>107 RGB32
110 名前:104 mailto:sage [2008/11/22(土) 01:31:07 ] >>106 > ところでgrapheditでCyberlinkのデコーダ使って普通にMPEG-2を再生できてます? 改めて確認したところ正常に再生できています。 > CyberlinkのデコーダとSampleGrabberはどうやって繋いだんでしょう? GraphBuilder に SmapleGrabber を追加し、RenderFile しました。 > Cyberlinkのデコーダがサポートしている出力フォーマットを知るのが先決ですかね。 Cyberlinkのデコーダがサポートしている出力フォーマットは下記の graphedit による方法で調べました。 (おっしゃる通りに CheckMediaType で調べるべきでした。) graphedit 上で Cyberlink のデコーダが含まれる形でグラフを作成し、 Cyberlink のデコーダの output pin に繋がっている接続を解除させます。 Cyberlink のデコーダの output pin を右クリックし、pin propertis を選択、 現れる Preferred Media Types と書かれたタブの内容から Cyberlinkのデコーダがサポートしている出力フォーマットを判断してしまいました。 > YUV→RGBを自前でできるならYUY2なりYV12なりで受けるのもアリですね。 誰かが効率的で高品質なもの作っているはずですので、できれば避けたいですね。
111 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 14:50:54 ] Geekなページを参考にDirectShowを勉強してみようと思ったのですが、 『GraphEdit』が見つかりません もしかして、今はGraphEditは無いのでしょうが?
112 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 15:14:16 ] >>111 今はDirectShowもGraphEditもWindows SDKに入ってる。 www.microsoft.com/downloads/details.aspx?FamilyID=e6e1c3df-a74f-4207-8586-711ebe331cdc
113 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 15:33:03 ] あ・・・れ・・・? もしかしてインストールするのを間違えたという事なんでしょうか? アンインストールはSDKのフォルダを削除すればいいんですよね?
114 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 16:13:20 ] SDKのbinの中にあるよ
115 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:48:46 ] 若干スレ違いかもしれませんが、お邪魔します。 他人の作ったVMRを利用した動画再生ソフトの再生画面に、自前の絵・文字を合成したい場合、 CoCreateInstanceをAPIフックして、IBaseFilterが作成される時にIVMRMixerBitmapを勝手に作成 という流れで問題はないでしょうか? 試してみたところ、一応思い通りには動いてくれているようなのですが、 APIフックやDirectShowに対する知識があまりないため、もっと簡単にやる方法があるんじゃないかとか、 この方法だと(予期せぬ)問題が生じるんじゃないかとか思っているのですが、 そのあたりのご意見いただければ幸いです。
116 名前:105 mailto:sage [2008/11/22(土) 22:45:15 ] >>106 どうもありがとうございました。コピペしたのでそこに気づいてませんでした・・・ww
117 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 00:41:02 ] DirectShowにもっと簡単にやるという概念などない ひたすら泥臭い
118 名前:106 mailto:sage [2008/11/23(日) 00:42:04 ] >>110 乗りかかった船ついでに、ちょっと調べみた。 手元にあったDVDソフトがPowerDVD 6(for OEM)で確かに[Cyberlink S/P decoder]が インストールされました。 ざっくり確認したところ、SubType = {1B81BE0C-A0C7-11D3-B984-00C04F2E73C5} すなわち DXVA_ModeMPEG2_C というフォーマットで出力されるようです。 私もまだ勉強不足ですが、DXVAに依存した形式なのか、自分の過去の経験でも 普通のYUVフォーマットとしては扱えなかった気がします。 おそらく、DXVAでYUV→RGB変換をするコードを書けば解決するような気がしますが、 まあ、ちょっと面倒かもしれませんねえ。 (個人的にはDXVAでYUV→RGB変換するモジュールを自作したいところなんですが)
119 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 04:07:11 ] デコーダのハードウェアアクセラレータの設定を切ると大丈夫、 とかないかな。
120 名前:106 mailto:sage [2008/11/23(日) 07:28:16 ] ソレダ!! 後でやってみよう
121 名前:106 mailto:sage [2008/11/24(月) 00:28:42 ] いやはや、普通に "Use Hardware Accelerator" というオプションがありましたな。 それを切ればYUY2で接続することができました。 [Cyberlink S/P decoder]のプロパティ設定方法については調べていません。 おそらくIPropertyBagインターフェイスが実装されていると思うんですがどうなんでしょう? では、おやすみなさいませ
122 名前:104 mailto:sage [2008/11/26(水) 01:13:25 ] 106 さん、色々と調べてくださりありがとうございます。 私なりに解決方法を模索した結果、 CBaseVideoRenderer から派生したとある video renderer を カスタマイズすることで問題を解決させました。 その video renderer は私が望んでいた大抵の条件を満たすものとなりました。 出処と詳細については申し訳ありませんが記せません。 SampleGrabber を使わなかった理由は、 これにもいくつかの制限があったからです。 ttp://msdn.microsoft.com/en-us/library/ms786693(VS.85).aspx
123 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 10:14:41 ] フィルタを登録する時はどうすればいいんですか? CComPtr<IBaseFilter> WAVE_Filter; WAVE_Filter.CoCreateInstance(CLSID_MPEG1Splitter); // ここでエラー DS_graph->AddFilter(WAVE_Filter, _T("aaaa"); フィルタ CLSIDの項目をいれたんですが、)が無いとか言われるんです。
124 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 10:16:07 ] すいません)がありませんでした
125 名前:デフォルトの名無しさん [2008/12/03(水) 04:22:24 ] オーディオデータをファイルに書き込むにはどうすればいいですか? RenderFileでグラフを作成した後Default DirectSound Deviceを FileWriterフィルタに置き換えてRunする AddSourceFilter追加、FileWriterフィルタ追加、この2つをConnectで自動補間接続後Run 繋がるフィルタが無いと言われてしまいます。流れを教えてください。 今のところこれが一番きれいですが、無いと言われてつながりません。 お願いします。教えてください。 CComPtr<IGraphBuilder> DS_Graph; CComPtr<IMediaControl> DS_Control; CComPtr<IMediaEvent> DS_Event; CComPtr<IBaseFilter> DS_Source; CComPtr<IBaseFilter> DS_FileWriter; CComPtr<IFileSinkFilter> DS_FileSink; hr = CoInitialize(NULL); hr = DS_Graph.CoCreateInstance(CLSID_FilterGraph); hr = DS_Graph.QueryInterface<IMediaControl>(&DS_Control); hr = DS_Graph.QueryInterface<IMediaEvent>(&DS_Event); hr = DS_Graph->AddSourceFilter(fullPath, L"Source", &DS_Source);// ソースフィルタの追加 CComPtr<IPin> p; hr = DS_Source->FindPin(L"Output", &p);// ソースの出力ピン hr =DS_FileWriter.CoCreateInstance(CLSID_FileWriter); hr = DS_FileWriter.QueryInterface<IFileSinkFilter>(&DS_FileSink); hr = DS_FileSink->SetFileName(L"E:\\WavFile.wav", NULL); hr = DS_Graph->AddFilter( DS_FileWriter, L"FileWriter" );// ライタフィルタの追加 CComPtr<IPin> pin; hr = DS_FileWriter->FindPin(L"in", &pin);// ライタの入力ピン hr = DS_Graph->Connect(p, pin);// ピン接続 hr = DS_Control->Run();
126 名前:デフォルトの名無しさん mailto:sage [2008/12/03(水) 04:46:50 ] FileWriterは AVI ファイル用だったきがす。mux挟まないと駄目。 Waveファイル出力フィルタは標準で存在しない。SDKに WavDest というサンプルがある。 まずはドキュメントを一通り読むことだ。
127 名前:デフォルトの名無しさん mailto:sage [2008/12/03(水) 06:45:19 ] ためしにAVIMuxを間に入れたらAVIのファイルコピーができあがりました。 ずっと行き止まりで助かりました。 ありがとうございました。
128 名前:デフォルトの名無しさん [2008/12/10(水) 21:39:36 ] 再生中の動画から静止画をキャプチャしてDirect3Dのテクスチャに書き込みたいんですが、 どうやって画像を取得すればいいですか?なるべく高速に動作する方法を使いたいです。 ビデオウィンドウも表示されないようにしたいです。
129 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 21:44:02 ] GraphEditで色々遊んでみな
130 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 22:06:21 ] MSのDirectShowのドキュメントは何処にあるんですか? MSDNで検索してもいいんですが、インターネットに接続できないことが多いので・・・
131 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 22:38:15 ] >>130 英語でよければ つ WindowsSDK 日本語が必要なら つ ttp://www.microsoft.com/downloads/info.aspx?na=47&p=1&SrcDisplayLang=ja&SrcCategoryId=&SrcFamilyId=4b9b1752-6f6c-440e-816c-35d247570ae4&u=details.aspx%3ffamilyid%3d1419557B-95CB-475E-9ED1-6817B3B9CB0A%26displaylang%3dja
132 名前:デフォルトの名無しさん [2008/12/14(日) 16:41:58 ] すいません。質問です mpeg2デコーダの出力ピンがDirectX Video Acceleration (DXVA)でビデオレンダラに接続されている状態で、 自作した変換フィルタをその出力ピンとビデオレンダラの間に接続したいのですが、何か方法ありますか? 変換フィルタの入力ピンのMediaのSubTypeがRGBやYV12では接続できませんでした DXVAのビデオアクセラレーションが効いている状態では変換フィルタを接続することはできないということでしょうか?
133 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 20:49:49 ] GraphEditで色々遊んでみな
134 名前:130 [2008/12/14(日) 21:26:54 ] >>131 ありがとうございます。Windows SDKのWeb Installで Documantation→Win32 and COM を選択すればOKですね? すいません、また質問です。 Windows Headers and Libraries→HeaderFilesとx86 Libraries を選択しておけば問題ないと思ったんですが、IA64やx64のLibrariesや .NET Development Toolsも入れろといってきましたが無視して大丈夫ですか? これを入れる前に、前のバージョンはプログラムの追加と削除から削除したはずなのに C:\Program Files\Microsoft SDKs\Windows\V6.0 C:\Program Files\Microsoft SDKs\Windows\V6.0A が残っていたので手動削除しましたが、これも間違ったことをしたのではないかと不安です。
135 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 21:36:45 ] >>133 GraphEditでいろいろ遊んでみました DXVAを使うmpeg2デコーダの場合は「接続に必要な中間フィルタの組み合わせが見つかりませんでした」で変換フィルタが接続できませんでした DXVAを使わないmpeg2デコーダにすれば変換フィルタを入れられるのですが、ハードウェアの再生支援がなくなるのでCPU負荷が高くなります・・・ DXVAを使うデコーダのメリット値が一番高い場合、自動的な組み合わせではなく、変換フィルタと接続できるデコーダを自力で探さないといけないのが少々面倒ですね H264のデコーダでもDXVAが使われることがあるので、DXVAに対応させるように変換フィルタを組み合わせるのは結構大変ですねオワタ\(^O^)/
136 名前:130 mailto:sage [2008/12/14(日) 22:02:30 ] Streams.hも探しているんですが無いです・・ いったい何処にあるんだ亜!
137 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 22:32:15 ] >>136 Streams.h は Microsoft Platform SDK のサンプルの下にあるよ 例)C:\Program files\Microsoft SDKs\Windows\v6.0\Samples\Multimedia\DirectShow\BaseClasses サンプルを要らないと思って消すと見つからなくなるわな
138 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 23:00:23 ] >>130 こんなとこで、クダまいてないで、ググったほうが早いぞ。 手当たり次第に見ていけば環境構築について書いたHPくらいすぐ見つかるじゃろ。 というか、テンプレの関連サイトくらいは全部のぞいとくべし。
139 名前:130 mailto:sage [2008/12/15(月) 23:49:30 ] すいません、どうすればいいか分かりません・・ ------ ビルド開始: プロジェクト: d3dsetup9, 構成: Release Win32 ------ コンパイルしています... cl : コマンド ライン warning D9035 : オプション 'Wp64' の使用は現在推奨されていません。今後のバージョンからは削除されます。 movietex.cpp .\movietex.cpp(30) : warning C4995: '_vsntprintf': 名前が避けられた #pragma として記述されています。 .\movietex.cpp(30) : warning C4995: '_vsnprintf': 名前が避けられた #pragma として記述されています。 .\movietex.cpp(30) : warning C4996: '_vsnprintf': This function or variable may be unsafe. Consider using _vsnprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. C:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h(358) : '_vsnprintf' の宣言を確認してください。 main.cpp d3dsetup9.cpp .\d3dsetup9.cpp(260) : warning C4995: 'sprintf': 名前が避けられた #pragma として記述されています。 .\d3dsetup9.cpp(260) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. C:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h(366) : 'sprintf' の宣言を確認してください。 2ddraw9.cpp コードを生成中... リンクしています... movietex.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall CBaseVideoRenderer::CBaseVideoRenderer(struct _GUID const &,char const *,struct IUnknown *,long *)" (??0CBaseVideoRenderer@@QAE @ABU_GUID@@PBDPAUIUnknown@@PAJ@Z) が関数 "public: __thiscall CMovieTexture::CMovieTexture(struct IUnknown *,long *)" (??0CMovieTexture@@QAE@PAUIUnknown@@PAJ@Z) で参照されました。 Release/MovieTexture.exe : fatal error LNK1120: 外部参照 1 が未解決です。 ビルドログは "file://d:\MovieTexture\Release\BuildLog.htm" に保存されました。 d3dsetup9 - エラー 2、警告 6
140 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 23:56:01 ] ttp://www.shader.jp/xoops/html/masafumi/directx9/DShow/dshow001.htm これをビルドしたいだけなんですが、リンクでよく分からないエラーが出ます。 まずatlbase.hが無いといわれたので、 ATLをWinDDKからとってきて、 Streams.hをサンプルからとってきて、 strmbase.libもビルドしてVC++ディレクトリに設定しました。 それでもまたエラーが出るので /NODEFAULTLIB:libcmt.libを設定しました。 これから先どうすればいいんでしょか・・?これはググっても全然分かりません。
141 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 23:57:16 ] C/C++でプログラム書いたことあるのか???
142 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 23:58:03 ] >>135 mpeg2デコーダとDXVAの間に自作フィルタ入れたいんだよね? サンプルでさ、NullNullフィルタだかNullInPlaceだか名前忘れたけど 何にもしないフィルタがあるんだわさ。 そいつを改造してmpeg2デコーダとDXVAに入れてみるといいよ。 改造内容はどのメディアタイプで繋がるのかログでも吐かせりゃいいべさ。
143 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 00:01:12 ] 言い忘れた。 >mpeg2デコーダの出力ピンがDirectX Video Acceleration (DXVA)でビデオレンダラに接続されている状態で 一回接続させた後に接続解除して、Nullフィルタ繋ぐんだわさ
144 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 00:08:28 ] >>139 C++かVSスレで質問しろ。
145 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 01:55:37 ] >>139 Expressだとatlmfcがないから無理
146 名前:130 mailto:sage [2008/12/16(火) 15:07:14 ] >>144 そうすることにします・・ 皆さん回答ありがとうございました。
147 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 23:37:26 ] フレーム単位でシークするのってどうやるの? SetTimeFormatでTIME_FORMAT_FRAMEを指定したら E_NOTIMPLが帰ってきて使えないんだが
148 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 23:56:16 ] 自分でフレーム数をMediaTimeに変換してシークする。 かな。
149 名前:147 mailto:sage [2008/12/22(月) 22:57:00 ] >>148 遅れたがサンクス。
150 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:05:39 ] ・再生処理に使う時間が充分あれば等速で再生し、 間に合わない場合は再生速度を遅くする (つまり、一切フレームスキップをしないようにしたい) ・音声をリアルタイムに加工、出力する この2つを実現するにはどうする?
151 名前:デフォルトの名無しさん [2008/12/22(月) 23:06:15 ] かなり下がったし、age
152 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:49:58 ] C++で作ったフィルタをC#から使うのってどうやるの? 検索しても出ない
153 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:29:33 ] >>152 フィルタを使うじゃ抽象的過ぎてわからんよ。
154 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:43:57 ] 手とり足とりということです
155 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 21:00:54 ] DShow.NETがあるやん。
156 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 21:33:31 ] もちろん、DirectShow自体COM Interopでもなんとかなるはず。
157 名前:152 mailto:sage [2008/12/23(火) 22:01:42 ] 1.CBaseVideoRendererを派生させてOpenGLのテクスチャに ムービーを書き込むクラスをC++で作る 2.C#でWindows FormsでGUIを作る 3.C#でDirectShow、OpenGLを初期化 DirectShowでグラフ構築時に1.で作ったフィルタを入れる というようなことがしたい。のだがCOMに対応したDLLの作り方が 分からない。 C#でDirectShowを使うのにはDirectShow.NETを使うつもり。
158 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 22:24:21 ] COMに対応したDLLってのは1のことか? SDKのサンプルの改造じゃだめなの?
159 名前:152 mailto:sage [2008/12/23(火) 22:46:59 ] ・・・どのサンプル?
160 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 22:50:45 ] SampVidとかだけど。
161 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 22:33:25 ] "C# DirectShow"でgoogle検索すると山ほど見つかるわけだが。 何を迷ってる?
162 名前:デフォルトの名無しさん mailto:sage [2008/12/25(木) 00:38:38 ] DirectShowに関係ないところで迷ってるぽい
163 名前:デフォルトの名無しさん mailto:sage [2008/12/25(木) 01:33:09 ] 質問なのですが、HDVをDirectShowでキャプチャすることはできますでしょうか?
164 名前:152 [2008/12/27(土) 22:12:10 ] >>160 やってみた strmbase.lib(dllsetup.obj) : error LNK2001: 外部シンボル ""class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A)" は未解決です。 strmbase.lib(dllentry.obj) : error LNK2001: 外部シンボル ""class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A)" は未解決です。 strmbase.lib(dllsetup.obj) : error LNK2001: 外部シンボル ""int g_cTemplates" (?g_cTemplates@@3HA)" は未解決です。 strmbase.lib(dllentry.obj) : error LNK2001: 外部シンボル ""int g_cTemplates" (?g_cTemplates@@3HA)" は未解決です。 C:\Documents and Settings\ \My Documents\Visual Studio 2008\Projects\FilterDLL\Release\FilterDLL.dll : fatal error LNK1120: 外部参照 2 が未解決です。 必要そうなコードのをSampVid.cppからコピーしたけどビルドできん・・
165 名前:デフォルトの名無しさん [2009/01/02(金) 21:25:16 ] 1フレーム目を表示させてすぐ一時停止状態にするのって どうやるの?
166 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 22:21:16 ] 目と指と反射神経を鍛える
167 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 23:19:34 ] 普通にImediaControl::Runするとビデオが進んでしまうので そうさせない方法を
168 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 00:07:03 ] Pauseでええやん。
169 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 14:21:02 ] ライブストリーミングを保存するために 動画を再生しながらファイルにも出力しようと思っているのですが SampleGrabberで可能なのでしょうか? Web上のサンプルは静止画を切り抜くものばかりで使い方がよくわかりません・・・
170 名前:デフォルトの名無しさん [2009/01/06(火) 14:40:49 ] 指定フレームの画像を抽出しようと以下のようにすると MediaSeeking->SetPositions( ¤t, AM_SEEKING_AbsolutePositioning, &stop, AM_SEEKING_AbsolutePositioning ); ::Sleep( 50 ); // ←これないとフレーム移動する前の画像になる SampleGrabber->GetCurrentBuffer( &DIBBufferSize, (long *)DIBBuffer ); 間にSleepを入れないと指定フレームの画像にならなのですが もっと早く取る方法あったら教えてください。
171 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 15:10:32 ] >>169 可能です。 ただ、ファイル出力処理で滞ると当然コマが飛びます。 再生優先かファイル出力優先かによってコールバック内の実装をよく考えるべし。 >>170 IMediaControl::GetState()で必要最低限のウェイトを入れられると思います。 デバッグ中ならとりあえずINFINITEを入れてもいいでしょう。
172 名前:169 mailto:sage [2009/01/06(火) 16:03:26 ] >>171 ありがとうございます 現在 ttp://www.geekpage.jp/programming/directshow/samplegrabber.php こちらのページを参考にしているのですが BMPではなくそのままの動画ファイルにするには どういった部分を変更すればよいのでしょうか?
173 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 16:38:33 ] >>172 あー、ごめん、別に自前のメモリにビットマップが欲しいわけなじゃないのね。 じゃあ、この辺りを参考にしてみてはどうでしょう? VBで書いてあるけど、大体意味は分かるでしょう。 ttp://www.geocities.co.jp/SiliconValley/7406/tips/dshow/dshow3.html 簡単に説明すると、入力データを Infinite Pin Tee Filter で分岐させて、 Video Renderer と AVI Mux につっこむ。 ピンのつなぎ方が分からなければ、またそのときに。
174 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 17:01:41 ] >>171 ありがとうございます。 IMediaControl::GetState()で最低限のウェイトにできました。 所でこれはやっぱりウェイトを入れないとダメなものなんですか?
175 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 17:51:04 ] >>174 フィルタグラフ自体は別のスレッドで動いているものなので、 スレッド間で同期をとることを考えると仕方のないことですね。
176 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 18:12:26 ] >>175 そうなんですか。 ちなみに、最初のフレームから最後のフレームまで 順番に画像を抽出したい場合は>>170 以外の方法でもっと効率がいいやり方はありますか?
177 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 18:41:58 ] なんか知らんが、普通にエンコードする時の様にフィルタ繋げるだけでいいんでね?
178 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 18:50:35 ] やりたい事は、最初のフレームから最後のフレームまで順番に 画像を取り出すだけなんですけどね。特に動画を再生する必要はないんですが
179 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 18:55:56 ] >>176 毎フレームSetPositionsをするのは確かに効率が悪いです。 可能であればSampleGrabberのコールバックを使った方がいいでしょう。 自分は以下の記事を参考にしてコールバック処理を実装しました。 ttp://codezine.jp/article/detail/322 GetCurrentBufferに比べると結構面倒ですけどねw しかし結局自分はSampleGrabberの実装を捨てることになってしまいましたorz (まあどうでもいいことですが)
180 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 19:13:34 ] >>179 ありがとうございます。 参考にさせて頂きます〜
181 名前:169 mailto:sage [2009/01/06(火) 19:14:29 ] >>173 度々ありがとうございます VBはいまいち理解できてないのですがVC++の場合ですと ttp://www.geekpage.jp/programming/directshow/video-capture-save-avi.php こちらのページの入力をビデオカメラから動画ファイルに変更するということでよろしいのでしょうか? 的外れな質問でしたらすみません
182 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 19:41:19 ] >>181 そこにはキャプチャデバイスからAVIファイルに直接保存する方法が書いてありますが、 169さんの場合対象が(ネットワーク上の)ファイルからの再生だとすると あまり参考にならないと思います。 とりあえず>>173 で挙げたページと同じようにGraphEditでフィルタを繋いでみて、 自分の意図している動作をさせられるか、を確認してはいかがでしょうか。 ほな。