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/
29 名前:デフォルトの名無しさん [2008/08/05(火) 23:50:25 ] 出力ピンに設定している画像サイズがわかるツールつくったぜ? >>24 答えてくれたら放出するよ
30 名前:デフォルトの名無しさん [2008/08/06(水) 08:51:59 ] >>28 あれ。そうなんですか… GetMediaTypeで伝えるだけじゃだめなのかな。 Transformが呼ばれる時点で既にpOutには変更されたサイズが入ってしまってるんだけど… もしかして再接続を適切に処理してないからでしょうか。
31 名前:デフォルトの名無しさん [2008/08/06(水) 23:34:37 ] ROT使って、どうつながってるか覗いてみるとか。 などと適当に書いてみる。 ↓やりかた ttp://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/directshow.html#addtorot
32 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 00:10:51 ] 相武沙希がかわいすぎてDirectShow
33 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 14:52:12 ] >>24 あれは動画と言うより静止画で、鯖から要求されたときに jpc(Jpeg2k)形式の1フレームの画像ファイルを送ってるだけなので やろうとしてることを実現したければ、webcam画像取り込み、加工、 エンコード、パケット送信まで丸ごと作っちゃうか ビデオ入力デバイスとしてwebcamの画像を横取り、加工する何かを 作るしかないと思う。←たぶんやりたいのはこっち? jpcは写真とかは得意だけど文字とかはボケボケになった気がする。 丸ごと作っちゃうパターンだと圧縮率変えれば文字も綺麗に見えるけど、 受信側のデコードで負荷がかかりすぎて PCがフリーズする視聴者続出させた記憶があるw
34 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 20:39:02 ] >>33 そうですか。 単純にキャプチャフィルタと画像送信フィルタ構成で出来ているとばっかり 思っていました。 画像を横取りできたとしてもエンコード、パケット送信までは作れないから 諦めかな? んで、フィルタの放出はした方がいいかい?
35 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 21:07:02 ] いらん
36 名前:デフォルトの名無しさん [2008/08/08(金) 21:10:57 ] じゃあ、俺の妹(高校生)の寝顔は? (´・ω・`)? 俺の脳内妹かわいいよ
37 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 13:27:03 ] aviファイルの画像と音声を抜き出したいんだけど、どこかにサンプルがないかな? Video for windows の例はいくつか見つかるんだけどね。 詳しい方、よろしくお願いします。
38 名前:37 mailto:sage [2008/08/11(月) 13:46:21 ] 補足 業務で使うので、ツールではなくやり方が知りたい。 画像の抜き出しは見つけた。音声の抜き出し方がわからない。 以上、よろしくお願いします。
39 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 14:40:41 ] しばらくGraphEditで遊んでみれば分かる。
40 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 14:45:13 ] こんなゆとりを飼っている会社も大変だな
41 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 18:58:30 ] でも3ヶ月後はお前らぶち抜いてるかもよ そういうもんだ
42 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 00:30:53 ] それも癪なので教えないでおこう
43 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 11:43:50 ] >1参照
44 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 14:26:53 ] DirectShowを使った録画アプリケーションをサービスとして実装し、 ログインしていない時に録画できるようにする事は可能なのでしょうか? 例えばプレビューは無しでもデスクトップがないとグラフを構築できないといったような制限はあるのでようか?
45 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 14:34:26 ] なんでその程度の試す手間を惜しむの?
46 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:00:32 ] CheckTransformに渡ってくるレンダラからの要求サイズで絵を作って渡しているのに、 YV12形式だとQCIFだけ横幅がおかしく表示されます…
47 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 12:37:30 ] DirectShowの質問です。 ムービーの動画をテクスチャに移して加工した上で表示させたいと思い、 ネット上のサンプルを読み漁ってとりあえず組んでみたのですが 以下の疑問点が発生しました。 どなたかわかる方が居ましたら、答えていただければありがたいです。 1. ムービーファイルの画像を「1枚ずつ」「任意のタイミングで」取得する方法はありますか? 現在のコードでは、DirectDrawに再生させておいて 描画時にテクスチャを取得して再生する、という構造になっています。 おそらく別のスレッドで再生させているのだとは思いますが このシステムでは、負荷でメインスレッドのFPSが落ちた場合などに 当然ながら同期のズレが発生してしまいます。 (動画とメインループのフレームの比率が変化してしまうため) アプリ側から任意のタイミングでフレームを進めることはできますでしょうか? 2. 実際に再生させるルーチンまでは作れたのですが 動画ファイルの読み込みに250msほど時間がかかってしまいます。 特にIGraphBuilderのRenderFileメソッドが非常に重く、 ここだけで200ms持って行かれてしまいます。 これはムービーファイルを再生する上で回避できない時間なのでしょうか? ちなみに、ムービー形式はサンプルに沿ってwmvを使用しています。 DirectShowというと、マイナーでネット上のサンプルも少ないというイメージで 触っている人が少ないかもしれないかと思うのですが、わかる方が居ましたら よろしくお願いいたします。
48 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 13:04:32 ] レンダラの出力がテクスチャになるようなフィルタを作る。 手動でフィルタ接続が速いかも
49 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 13:25:09 ] デフォルトのフィルタを使った場合、 変換が二度手間になっているような認識でいいのでしょうか? ありがとうございました。ちょっと色々とやってみます。
50 名前:デフォルトの名無しさん mailto:sage [2008/08/28(木) 11:00:10 ] >>47 homepage1.nifty.com/nekora/soft/howto/avi.html 張るのが遅かったな
51 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 18:50:07 ] DirectShowでマルチチューナに対応したTVクライアントを書こうとして最初で躓いてしまいました。 あるBDAチューナデバイスAがサポートするチューニング空間を列挙する方法が知りたいのですが、 何かいい方法はないでしょうか?
52 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 23:27:51 ] COMの質問なのか COMは分かってるけど適当なAPIが見つからないのか APIも分かってるけど挙動がおかしいのか、などなど
53 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:23:24 ] >>52 COMはだいたいは大丈夫だと思います。 適当なAPIが見つかりません。 PNDIR_INPUTのAM_MEDIA_TYPEをみると、 majortype = KSDATAFORMAT_TYPE_BDA_ANTENNA subtype = MEDIASUBTYPE_None formattype = FORMAT_None であって、接続可能なピンかどうか判断できませんでした。 ネットワークプロバイダの出力ピンをみても、同様でAM_MEDIA_TYPEだけでは 判断できないようですが、ほかの方法が思いつきません。
54 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 19:58:20 ] CBaseVideoRendererを使って テクスチャにレンダリング、DirectXで表示という いわゆるムービーテクスチャー方式で再生しているのですが Vistaのフルスクリーン時のみフリーズする現象にぶち当たってます VistaウインドウモードやXPでは問題ないようなのですが・・・ DoRenderSample内のテクスチャのロックが 癌なような気がしないでもないですが対処法がわかりません なにか解決方法はありますか?
55 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 20:04:13 ] デバッグしろ
56 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 20:09:22 ] リモートデバッグ環境がないので フルスクリーン時のデバッグができないのです
57 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 00:43:59 ] マルチスレッドのフラグ立ててデバイス作っていないのに、複数のスレッドでアクセスしてデッドロックしている感じもする。 つーか、お前の環境なんて知ったこっちゃない。マルチモニタでやるなりログ出力するなり好きにしろ。 最低限の道具も揃えられないようだと話にならない。
58 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 02:02:13 ] VB.net2005でDirect Show を使用し動画から音声を抽出→音声波形を作成 ということをしたいのですが,どのようにしたらよいのでしょうか? Direct Showの使い方もわからず,教えていただけないでしょうか?
59 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 02:12:40 ] まずはC++を使ってください。C++以外の言語でDirectShowを扱うのは愚かな行為です。 次にサンプルやドキュメントを読んで基本的な仕組みを理解してください。
60 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 03:05:24 ] >>59 さん ありがとうございます,VC++でやるのが普通なのですか・・・ vb.netでやるのが仕事の条件だったもので結構探してみたんですがなかったのはそういことだったんですね. ありがとうございます.
61 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 16:19:48 ] >>60 .NET(C#) で GUI とグラフ作成・制御、C++ でフィルタの画像処理という 組み合わせなら .NET 初めての身にもそこそこ作り易かった記憶があります。 ・.NET から DirectShow を扱うためのライブラリ ttp://directshownet.sourceforge.net/ Platform SDK 内の DirectShow サンプルのほとんどが C#で書き直されているので、グラフ作成・制御方法の参考になるでしょう。 当然ながら Unmanaged なリソースを扱うので Marshalling の面倒をイヤというほど味わうことになるのは覚悟して下さい。 また、フィルタを .NET で書くことも可能らしいです…。(実際にやったことはありませんが) ・C# で DirectShow フィルタのプロトタイプを作成 ttp://www.codeproject.com/KB/directx/prototypingdsfilters.aspx パフォーマンスに問題があるのであくまでプロトタイプの作成に 留めた方がよいそうです。本番の時はC++で。
62 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 00:00:16 ] その辺のいろいろな手間考えるとまあ>>59 だろうなあ
63 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 00:10:43 ] >>61 さん ありがとうございます. 皮がvb.net2005で作らざるを得ないのでできれば閉じた環境で作りたかったもので・・・ とりあえず,真剣に無理そうならvc++でdllを作成するという方向になるかと思われます.
64 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 01:49:27 ] .NET環境はCOMの扱いが面倒なんで、結局C++なDLLでやって値だけ得るのがいい。 VSなら言語やモジュールが分かれていてもシームレスにデバッグできるよ。 GUI(C#)+DLL(C++)も簡単。
65 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 09:19:05 ] 最新のDirectX SDKをインストールしたのですが GraphEditが見当たらないのですがどこにあるのでしょうか?
66 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 10:14:06 ] 今はWindows SDK for VISTAのほうにあるんじゃないかな。
67 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 10:40:23 ] なんですとー!
68 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:04:46 ] msdn.microsoft.com/ja-jp/library/cc352285.aspx このBDAサンプルが動く地デジ・ワンセグチューナってありますか?
69 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 18:22:12 ] DirectShowつかって、Form上に動画を表示しています。 その画面上にlabelやtextboxを表示したいのですが、動画の下に隠れて(?)しまってみえません。 隠れない方法はあるのでしょうか? VS2005 C#です。
70 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 19:16:19 ] コントロールを最前面に移動させるとかフォームじゃなくてパネルにして最背面にするとか
71 名前:69 mailto:sage [2008/10/07(火) 19:55:08 ] >>70 できました!!!!!!ありがとうございます。
72 名前:デフォルトの名無しさん [2008/10/08(水) 04:24:48 ] おいおい このまま終了か?あげとくぞ
73 名前:デフォルトの名無しさん [2008/10/08(水) 14:33:08 ] このスレは書き込み少ないんで、age推奨でもいいかもしれんね
74 名前:デフォルトの名無しさん [2008/10/14(火) 13:29:15 ] すいません質問です DirectShowを使用してWMVファイルを再生する際にはWMAudio Decoder DMOとWMVideo Decoder DMO を使用するとよいというのはRender Media Fileを使って理解しました. その上で再生するのとは別個にWMAをファイルとして保存したいのですがWMAudio Decoder DMOの次のフィルターをどのようにすればよいのでしょうか?
75 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 12:19:37 ] 質問で申し訳ないんですがDirect show file reader プラグインのファイルを何度も解凍してもいくつかのファイルがエラーしかでません ds_inputとds_input.auiと読んでね、が解凍できたのですがこれは正常なんでしょうか? それとも解凍できてないファイルがあるのかファイル自体がエラーおこしてるのか教えていただけるとありがたいです
76 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 14:12:50 ] DTV板に池
77 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 14:17:18 ] 「読んでね」は読んだのか?
78 名前:デフォルトの名無しさん [2008/10/24(金) 04:53:39 ] 質問です. Windows SDK v6.1 + VS 2005 Academic Editionを使用しています. DirectShowのSample Filterをビルドしてみたところ以下のエラーが出てビルドが通りません. 解決策はないのでしょうか?
79 名前:78 mailto:sage [2008/10/24(金) 04:58:55 ] 1>wavdest.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall CTransformInputPin::CTransformInputPin(wchar_t const *,class CTransformFilter *,long *,wchar_t const *)" (??0CTransformInputPin@@QAE@PB_WPAVCTransformFilter@@PAJ0@Z) が 関数 "public: __thiscall CWavDestFilter::CWavDestFilter(struct IUnknown *,long *)" (??0CWavDestFilter@@QAE@PAUIUnknown@@PAJ@Z) で参照されました。 このようなerror LNK2019が合計4個で増した.
80 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 12:27:28 ] >>79 DirectShow 基底クラス(自分でビルドする必要あり) がリンクされてない 場所は SDK のフォルダから上記クラス名で検索をかけてみればすぐに見つかる
81 名前:79 mailto:sage [2008/10/24(金) 17:53:57 ] インクルードディレクトリして C:\Program Files\Microsoft SDKs\Windows\v6.1\Samples\Multimedia\DirectShow\BaseClasses を追加で指定したのですが,これだけではないのでしょうか?
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で色々遊んでみな