DirectShowと戦うスレ Part 4

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
DirectShowプログラマーのみなさん。
メソッドのデッドロックとか、わけわからん現象多くないすか。
このスレに怒りやテクをぶつけましょう。

関連スレ
Win32API質問箱 Build67
http://pc11.2ch.net/test/read.cgi/tech/1212931246/
くだすれDirectX(超初心者用) part.3
http://pc11.2ch.net/test/read.cgi/tech/1193605500/
【C++】 DirectX初心者質問スレ Part17 【C】
http://pc11.2ch.net/test/read.cgi/tech/1207702556/
DirectX総合スレ (Part8)
http://pc11.2ch.net/test/read.cgi/gamedev/1205306118/
【PureVideo】DirectX Video Acceleration【AVIVO】
http://pc11.2ch.net/test/read.cgi/tech/1178285897/
2デフォルトの名無しさん:2008/06/22(日) 18:38:51
関連サイト
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
3デフォルトの名無しさん:2008/06/24(火) 20:40:35
新スレたったんだ
4デフォルトの名無しさん:2008/06/28(土) 14:08:40
初カキコ失礼します

今、DirectShowを使用して
画面の一部を切り出して表示する
システムを制作していまして
それでシステムの参考に

http://ship.nime.ac.jp/~osawa/focusShare/

このサイトの「Focus Share」で使用されている
DirectShowフィルターをGraphEditで動かしてみたいのですが
うまく動かすことが出来ずに困ってます

ちなみに開発環境は
Visual C++ 2008 EE、Platform SDK 2003 SP1、DirectX 9.0b SDK です

ご教授の程、よろしくお願いします。
5デフォルトの名無しさん:2008/06/29(日) 21:24:11
過疎ってるなw
6デフォルトの名無しさん:2008/07/02(水) 22:26:47
1乙
ってか、自分でも立てようかと思ったけど、
すぐ落ちるとイヤなので様子見してた・・・

>>4
とりあえずどのフィルタを使ってどんな症状なのか
説明してくれないと困るぞ

ざっと試してみたけどVideo Extraction Filterを使おうとしてるのかな?
ソース見てないからよく分からないけど、確かにちょっとおかしい。
ffdshowで出力フォーマットをいろいろ変えてみたが、
入力可能な正しいフォーマットはなんじゃろな。
暇があったら後でソース見てみる
7デフォルトの名無しさん:2008/07/02(水) 22:53:12
ageとくぜよ
8デフォルトの名無しさん:2008/07/05(土) 13:56:15
hage
9デフォルトの名無しさん:2008/07/17(木) 21:43:58
9
10デフォルトの名無しさん:2008/07/26(土) 18:42:31
あへ
11デフォルトの名無しさん:2008/07/27(日) 04:16:12
過疎と戦うスレ
12デフォルトの名無しさん:2008/07/27(日) 04:22:15
DirectShowはもう終わりだというのか・・・!
13デフォルトの名無しさん:2008/07/27(日) 11:30:33
M$が何考えてるかわからん
14デフォルトの名無しさん:2008/07/29(火) 19:32:10
DirectShowを使って動画から映像だけ抜き出してwmvに変換するプログラムを作成しようと思ってます。
まずフィルタグラフをどう構築すればいいのかと思ってGraphEditで試しているのですが
WM ASF WriterのAUDIOピンを繋がないとエラーになってしまいます。
無音声のwmvファイルを作成する場合AUDIOピンに何をつっこめばいいのでしょうか?
15デフォルトの名無しさん:2008/07/31(木) 23:57:26
cygwin上で,DirectShowを使う方法ご存知の方いらっしゃいますか?

DirectXに関しては以下のページの方法でcygwinから動かすことできました.
http://d.hatena.ne.jp/yanma_4/20080308/1204961113

しかし私の環境の場合,DirectShowは,DirectX SDK内でなく,Platform SDKに入っているためか,
大量のエラー(IID_ICreateDevEnumが定義されていない等,Directshowの変数が見えないというエラー)が出ました.

http://www.okisoft.co.jp/esc/vs-exp/index.html#Cygwin
上記のページを見たところ,
『.NET Framework 2.0 SDK をインストール してある場合,
Cygwin からも C# コンパイラや各種ツールを利用できます』
とあった為,これをインストールしたものの,エラーの数は減りませんでした.

どなたかわかる方いらっしゃいましたら,御教授宜しくお願いします.
16デフォルトの名無しさん:2008/08/01(金) 03:55:12
>>14
確かにエラーになるね。
適当なAudio Capture Sourceを突っ込めば無音のwmvを作ることはできるけど、
ビデオ終端で自動終了できない・・・。

>>15
SDLにDirectShowのラッパーはないんじゃない?
17デフォルトの名無しさん:2008/08/01(金) 03:58:31
あ、.NETがCygwinから使えるならRCW経由でDirectShowを使えるような気がするな。
誰か試してみない?
1815:2008/08/01(金) 18:26:19
>>16さん
>>17さん

レスポンスありがとうございます.
http://support.microsoft.com/kb/436361/ja
頂いたヒントを頼りに,このページを見つけました.
ありがとうございました.
19デフォルトの名無しさん:2008/08/01(金) 22:15:35
Windows SDK (Platform SDK)入れて、その中のVC++コンパイラ使えばいいだろって気もするが。
2015:2008/08/01(金) 22:42:59
>>19
正論です.

カメラを他の装置と同時に使う事情から,
cygwinで動かせたら嬉しいと考えてます.

2115:2008/08/01(金) 22:49:04
cygwin

.NET Framework 2.0 SDK

Directshow.NET 2.0(ラッパー)

Directshow

17さんの言うとおり,
上記の道が考えられますが…,難しいですね.
もう少し頑張ってみます.
22デフォルトの名無しさん:2008/08/01(金) 23:35:21
簡単にやるならVS使えよ
23デフォルトの名無しさん:2008/08/03(日) 14:23:16
>>16
レスどうもです。

プログラム組んでみようと思いますが、
GraphEditだからだめだってことはないんでしょうね。

もう少し悩んでみます。
24デフォルトの名無しさん:2008/08/04(月) 01:24:00
すみません。
yahooチャットのビデオに自作のDirectshowフィルタを挟んで
効果を付けてみたいのですが可能ですか?
例えば文字スーパーを流すようにしてみるとかしてみたいのですが・・・
yahooチャットのビデオがどのようなフィルタ構成になっているかわからず
出力メディアタイプとかわからないです。
接続に関してはインテリジェント接続になっていてくれさえすればメリット値を変更で
なんとかできないかなって思っています
25デフォルトの名無しさん:2008/08/05(火) 08:54:08
Win標準のVideo Rendererって、
アスペクト比が4:3と16:9のものしかまともに再生されないけど、
CIFみたいな中途半端なサイズのせいなの?
それとも適切なパラメータを出力ピンに設定していないから?
誰かわかりませんか。形式はyv12です。
26デフォルトの名無しさん:2008/08/05(火) 13:44:37
yv12
27デフォルトの名無しさん:2008/08/05(火) 23:10:13
yv12に限らず、フレームバッファの確保の仕方次第で
レンダラ側で確保されるバッファのサイズが変わってくるんだね。
ffdshowはどうやってそこらへんを上手く処理してるんだろう…
28デフォルトの名無しさん:2008/08/05(火) 23:26:51
1ピクセル単位で任意のサイズ使えるぜ?
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デフォルトの名無しさん:2008/08/07(木) 00:10:51
相武沙希がかわいすぎてDirectShow
33デフォルトの名無しさん:2008/08/07(木) 14:52:12
>>24
あれは動画と言うより静止画で、鯖から要求されたときに
jpc(Jpeg2k)形式の1フレームの画像ファイルを送ってるだけなので
やろうとしてることを実現したければ、webcam画像取り込み、加工、
エンコード、パケット送信まで丸ごと作っちゃうか
ビデオ入力デバイスとしてwebcamの画像を横取り、加工する何かを
作るしかないと思う。←たぶんやりたいのはこっち?

jpcは写真とかは得意だけど文字とかはボケボケになった気がする。
丸ごと作っちゃうパターンだと圧縮率変えれば文字も綺麗に見えるけど、
受信側のデコードで負荷がかかりすぎて
PCがフリーズする視聴者続出させた記憶があるw
34デフォルトの名無しさん:2008/08/07(木) 20:39:02
>>33
そうですか。
単純にキャプチャフィルタと画像送信フィルタ構成で出来ているとばっかり
思っていました。
画像を横取りできたとしてもエンコード、パケット送信までは作れないから
諦めかな?

んで、フィルタの放出はした方がいいかい?
35デフォルトの名無しさん:2008/08/07(木) 21:07:02
いらん
36デフォルトの名無しさん:2008/08/08(金) 21:10:57
じゃあ、俺の妹(高校生)の寝顔は?
(´・ω・`)?





俺の脳内妹かわいいよ
37デフォルトの名無しさん:2008/08/11(月) 13:27:03
aviファイルの画像と音声を抜き出したいんだけど、どこかにサンプルがないかな?
Video for windows の例はいくつか見つかるんだけどね。
詳しい方、よろしくお願いします。
3837:2008/08/11(月) 13:46:21
補足
業務で使うので、ツールではなくやり方が知りたい。
画像の抜き出しは見つけた。音声の抜き出し方がわからない。
以上、よろしくお願いします。
39デフォルトの名無しさん:2008/08/11(月) 14:40:41
しばらくGraphEditで遊んでみれば分かる。
40デフォルトの名無しさん:2008/08/11(月) 14:45:13
こんなゆとりを飼っている会社も大変だな
41デフォルトの名無しさん:2008/08/11(月) 18:58:30
でも3ヶ月後はお前らぶち抜いてるかもよ
そういうもんだ
42デフォルトの名無しさん:2008/08/12(火) 00:30:53
それも癪なので教えないでおこう
43デフォルトの名無しさん:2008/08/14(木) 11:43:50
>1参照
44デフォルトの名無しさん:2008/08/17(日) 14:26:53
DirectShowを使った録画アプリケーションをサービスとして実装し、
ログインしていない時に録画できるようにする事は可能なのでしょうか?
例えばプレビューは無しでもデスクトップがないとグラフを構築できないといったような制限はあるのでようか?
45デフォルトの名無しさん:2008/08/17(日) 14:34:26
なんでその程度の試す手間を惜しむの?
46デフォルトの名無しさん:2008/08/18(月) 23:00:32
CheckTransformに渡ってくるレンダラからの要求サイズで絵を作って渡しているのに、
YV12形式だとQCIFだけ横幅がおかしく表示されます…
47デフォルトの名無しさん:2008/08/23(土) 12:37:30
DirectShowの質問です。

ムービーの動画をテクスチャに移して加工した上で表示させたいと思い、
ネット上のサンプルを読み漁ってとりあえず組んでみたのですが
以下の疑問点が発生しました。
どなたかわかる方が居ましたら、答えていただければありがたいです。

1. ムービーファイルの画像を「1枚ずつ」「任意のタイミングで」取得する方法はありますか?
 現在のコードでは、DirectDrawに再生させておいて
 描画時にテクスチャを取得して再生する、という構造になっています。
 おそらく別のスレッドで再生させているのだとは思いますが
 このシステムでは、負荷でメインスレッドのFPSが落ちた場合などに
 当然ながら同期のズレが発生してしまいます。
 (動画とメインループのフレームの比率が変化してしまうため)
 アプリ側から任意のタイミングでフレームを進めることはできますでしょうか?
 
2. 実際に再生させるルーチンまでは作れたのですが
  動画ファイルの読み込みに250msほど時間がかかってしまいます。
  特にIGraphBuilderのRenderFileメソッドが非常に重く、
  ここだけで200ms持って行かれてしまいます。
  これはムービーファイルを再生する上で回避できない時間なのでしょうか?
  ちなみに、ムービー形式はサンプルに沿ってwmvを使用しています。

DirectShowというと、マイナーでネット上のサンプルも少ないというイメージで
触っている人が少ないかもしれないかと思うのですが、わかる方が居ましたら
よろしくお願いいたします。
48デフォルトの名無しさん:2008/08/23(土) 13:04:32
レンダラの出力がテクスチャになるようなフィルタを作る。

手動でフィルタ接続が速いかも
49デフォルトの名無しさん:2008/08/23(土) 13:25:09
デフォルトのフィルタを使った場合、
変換が二度手間になっているような認識でいいのでしょうか?

ありがとうございました。ちょっと色々とやってみます。
50デフォルトの名無しさん:2008/08/28(木) 11:00:10
51デフォルトの名無しさん:2008/09/29(月) 18:50:07
DirectShowでマルチチューナに対応したTVクライアントを書こうとして最初で躓いてしまいました。
あるBDAチューナデバイスAがサポートするチューニング空間を列挙する方法が知りたいのですが、
何かいい方法はないでしょうか?
52デフォルトの名無しさん:2008/09/29(月) 23:27:51
COMの質問なのか
COMは分かってるけど適当なAPIが見つからないのか
APIも分かってるけど挙動がおかしいのか、などなど
53デフォルトの名無しさん: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デフォルトの名無しさん:2008/09/30(火) 19:58:20
CBaseVideoRendererを使って
テクスチャにレンダリング、DirectXで表示という
いわゆるムービーテクスチャー方式で再生しているのですが
Vistaのフルスクリーン時のみフリーズする現象にぶち当たってます
VistaウインドウモードやXPでは問題ないようなのですが・・・
DoRenderSample内のテクスチャのロックが
癌なような気がしないでもないですが対処法がわかりません
なにか解決方法はありますか?
55デフォルトの名無しさん:2008/09/30(火) 20:04:13
デバッグしろ
56デフォルトの名無しさん:2008/09/30(火) 20:09:22
リモートデバッグ環境がないので
フルスクリーン時のデバッグができないのです
57デフォルトの名無しさん:2008/10/01(水) 00:43:59
マルチスレッドのフラグ立ててデバイス作っていないのに、複数のスレッドでアクセスしてデッドロックしている感じもする。

つーか、お前の環境なんて知ったこっちゃない。マルチモニタでやるなりログ出力するなり好きにしろ。
最低限の道具も揃えられないようだと話にならない。
58デフォルトの名無しさん:2008/10/02(木) 02:02:13
VB.net2005でDirect Show を使用し動画から音声を抽出→音声波形を作成
ということをしたいのですが,どのようにしたらよいのでしょうか?
Direct Showの使い方もわからず,教えていただけないでしょうか?
59デフォルトの名無しさん:2008/10/02(木) 02:12:40
まずはC++を使ってください。C++以外の言語でDirectShowを扱うのは愚かな行為です。
次にサンプルやドキュメントを読んで基本的な仕組みを理解してください。
60デフォルトの名無しさん:2008/10/02(木) 03:05:24
>>59さん
ありがとうございます,VC++でやるのが普通なのですか・・・
vb.netでやるのが仕事の条件だったもので結構探してみたんですがなかったのはそういことだったんですね.
ありがとうございます.
61デフォルトの名無しさん: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デフォルトの名無しさん:2008/10/03(金) 00:00:16
その辺のいろいろな手間考えるとまあ>>59だろうなあ
63デフォルトの名無しさん:2008/10/03(金) 00:10:43
>>61さん
ありがとうございます.

皮がvb.net2005で作らざるを得ないのでできれば閉じた環境で作りたかったもので・・・

とりあえず,真剣に無理そうならvc++でdllを作成するという方向になるかと思われます.
64デフォルトの名無しさん:2008/10/03(金) 01:49:27
.NET環境はCOMの扱いが面倒なんで、結局C++なDLLでやって値だけ得るのがいい。
VSなら言語やモジュールが分かれていてもシームレスにデバッグできるよ。
GUI(C#)+DLL(C++)も簡単。
65デフォルトの名無しさん:2008/10/03(金) 09:19:05
最新のDirectX SDKをインストールしたのですが
GraphEditが見当たらないのですがどこにあるのでしょうか?
66デフォルトの名無しさん:2008/10/03(金) 10:14:06
今はWindows SDK for VISTAのほうにあるんじゃないかな。
67デフォルトの名無しさん:2008/10/03(金) 10:40:23
なんですとー!
68デフォルトの名無しさん:2008/10/03(金) 11:04:46
http://msdn.microsoft.com/ja-jp/library/cc352285.aspx
このBDAサンプルが動く地デジ・ワンセグチューナってありますか?
69デフォルトの名無しさん:2008/10/07(火) 18:22:12
DirectShowつかって、Form上に動画を表示しています。
その画面上にlabelやtextboxを表示したいのですが、動画の下に隠れて(?)しまってみえません。

隠れない方法はあるのでしょうか?

VS2005 C#です。
70デフォルトの名無しさん:2008/10/07(火) 19:16:19
コントロールを最前面に移動させるとかフォームじゃなくてパネルにして最背面にするとか
7169: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デフォルトの名無しさん:2008/10/17(金) 12:19:37
質問で申し訳ないんですがDirect show file reader プラグインのファイルを何度も解凍してもいくつかのファイルがエラーしかでません
ds_inputとds_input.auiと読んでね、が解凍できたのですがこれは正常なんでしょうか?
それとも解凍できてないファイルがあるのかファイル自体がエラーおこしてるのか教えていただけるとありがたいです
76デフォルトの名無しさん:2008/10/17(金) 14:12:50
DTV板に池
77デフォルトの名無しさん:2008/10/17(金) 14:17:18
「読んでね」は読んだのか?
78デフォルトの名無しさん:2008/10/24(金) 04:53:39
質問です.
Windows SDK v6.1 + VS 2005 Academic Editionを使用しています.
DirectShowのSample Filterをビルドしてみたところ以下のエラーが出てビルドが通りません.
解決策はないのでしょうか?
7978: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デフォルトの名無しさん:2008/10/24(金) 12:27:28
>>79
DirectShow 基底クラス(自分でビルドする必要あり) がリンクされてない
場所は SDK のフォルダから上記クラス名で検索をかけてみればすぐに見つかる
8179:2008/10/24(金) 17:53:57
インクルードディレクトリして
C:\Program Files\Microsoft SDKs\Windows\v6.1\Samples\Multimedia\DirectShow\BaseClasses
を追加で指定したのですが,これだけではないのでしょうか?
82デフォルトの名無しさん: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デフォルトの名無しさん:2008/10/26(日) 13:59:49
3秒分だけをリアルタイム処理したいの?
ソースは何を想定してるの?
85デフォルトの名無しさん:2008/10/26(日) 14:40:40
クロック無視してデータをなるべく早く流したいときはフィルタグラフのIMediaFilter::SetSyncSourceにNULLを渡す。
ヘルプのReference Clocksを参照。
しかし>>83のWaitForCompletionの使い方は何か勘違いしてる予感。
86デフォルトの名無しさん:2008/10/26(日) 22:34:40
シューティングゲームなどで複数の効果音を連続で再生させるような場合、
DirectShowは不向きですか?
87デフォルトの名無しさん: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 返信をありがとうございました。
8979: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デフォルトの名無しさん:2008/10/27(月) 19:31:08
>>89
LPCTSTR がどこのヘッダで定義されているか検索してみるよろし
91デフォルトの名無しさん:2008/10/27(月) 21:33:00
どんどんすれ違いな方向へ・・・
92メモ: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

http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=129&SiteID=1
93デフォルトの名無しさん:2008/11/05(水) 18:42:42
79の書き込みを見てビルドしてみたんだが,なんかビルド通らねえな
文字セットもマルチバイト文字セットを使用するにしたし,
Windows.hもインクルードしたんだが・・・
refclock.hの80/139/178/166とsyclock.hの25行目でエラー出る

何が問題なんだろう・・・

そして79の子は投げたのだろうか?

94デフォルトの名無しさん:2008/11/05(水) 19:30:21
>>79ってサンプル?
>>82だけど、実際にビルドできるの確認して書いたんだけど。
95デフォルトの名無しさん:2008/11/05(水) 19:31:09
>>93
マジですか
Ver6.0 しか使ってなかったので
帰宅したら 6.1 で試してみよう
9694:2008/11/05(水) 19:31:47
ググってみたけど、Dshow.hが複数あって別のやつがincludeされてた、というのがあったが
9795: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デフォルトの名無しさん:2008/11/07(金) 00:23:02
BaseClassesのStreams.hをインクルードしたつもりが
別のStreams.hがインクルードされてしまっていたことがあった(>>93みたいなコンパイルエラーが出てたはず)
BaseClassesが先頭になるように、インクルードの優先順も見直してみるといいかもね。
9993:2008/11/07(金) 14:21:42
文字セットがUNICODE版じゃなかったのが問題だったぽい.騒がしてすまん
後,BaseClassesを先頭に持ってくるようにしたら,すんなりとコンパイルできた
とりあえず,BaseClassesは先頭に持ってこないとコンパイルエラーでるっぽい.

>>79
97氏がやってるようにして,すべての文字セットがUNICODEであることを確認して,
追加のインクルードディレクトリでBaseClassesを先頭にしたらコンパイルは通るともう.

100sage: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デフォルトの名無しさん:2008/11/21(金) 15:51:52
>>100
ピッチの指定ができなかったから結局は自前コピーが必要かもしれない。
自前のアロケータ(ISampleAllocator)を返してやればそれを使ってくれることもあるけど使用するとは限らない。
個人的にはFBOのほうが好きだ。PBOよりパフォーマンスがいい気がする。
まあこのくらいのメモリコピーなんて気にするな。こういう状況はよくあること。
102デフォルトの名無しさん:2008/11/21(金) 19:24:32
>>101
情報ありがとうございます。
無理っぽいですか・・。
とりあえず、教えていただいたアロケータ関連を調べてみます。
運よくつかってくれればラッキーってことで。

処理すべき、動画のサイズが4K用と馬鹿にならないサイズなので少しでも
オーバーヘッドが減るとうれしいんです。MediaPlayerClassicあたりだと
そこそこのフレームレートで再生されていますし。

あと、ここでする話しじゃないですけど、PBOを使用しているのは、
テクスチャとしてポリゴンに貼り付けて使いたいからです。
FBOでもテクスチャの転送用として使えるんでしょうか?

103デフォルトの名無しさん:2008/11/21(金) 20:51:18
ふと思ったけどPBOじゃなくて普通に受け取ったサンプルのバッファでglTexSubImage2Dするのが簡単だな。コピー量同じじゃね?
FBOは主にオフスクリーンレンダリング用途だけど↑の理由から使う意味があんまりない。どっちかというと逆の用途用。
以前ベンチマークしてみたことがあるんだが、FBO実装のほうが速い結果を得た。
ついでに将来的にPBOは消えるというかサポートされなくなる話も聞いたり。
104デフォルトの名無しさん: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デフォルトの名無しさん:2008/11/21(金) 23:01:46
上に便乗なんですが、GetCurrentImageでバッファサイズを取得すると40バイトほど大きくなってしまいます。
まあ、使った動画がどちらも160×112の動画なので、他の場合はどうなるのか分からないんですが
この大きくなってしまうのは何が原因と考えられるのでしょうか?
106デフォルトの名無しさん: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のことじゃないか?
107104: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. それ以外の何か
108106: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デフォルトの名無しさん:2008/11/22(土) 00:49:41
>>107
RGB32
110104: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デフォルトの名無しさん:2008/11/22(土) 14:50:54
Geekなページを参考にDirectShowを勉強してみようと思ったのですが、
『GraphEdit』が見つかりません
もしかして、今はGraphEditは無いのでしょうが?
112デフォルトの名無しさん:2008/11/22(土) 15:14:16
113デフォルトの名無しさん:2008/11/22(土) 15:33:03
あ・・・れ・・・?
もしかしてインストールするのを間違えたという事なんでしょうか?
アンインストールはSDKのフォルダを削除すればいいんですよね?
114デフォルトの名無しさん:2008/11/22(土) 16:13:20
SDKのbinの中にあるよ
115デフォルトの名無しさん:2008/11/22(土) 21:48:46
若干スレ違いかもしれませんが、お邪魔します。

他人の作ったVMRを利用した動画再生ソフトの再生画面に、自前の絵・文字を合成したい場合、
CoCreateInstanceをAPIフックして、IBaseFilterが作成される時にIVMRMixerBitmapを勝手に作成
という流れで問題はないでしょうか?
試してみたところ、一応思い通りには動いてくれているようなのですが、
APIフックやDirectShowに対する知識があまりないため、もっと簡単にやる方法があるんじゃないかとか、
この方法だと(予期せぬ)問題が生じるんじゃないかとか思っているのですが、
そのあたりのご意見いただければ幸いです。
116105:2008/11/22(土) 22:45:15
>>106
どうもありがとうございました。コピペしたのでそこに気づいてませんでした・・・ww
117デフォルトの名無しさん:2008/11/23(日) 00:41:02
DirectShowにもっと簡単にやるという概念などない
ひたすら泥臭い
118106: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デフォルトの名無しさん:2008/11/23(日) 04:07:11
デコーダのハードウェアアクセラレータの設定を切ると大丈夫、
とかないかな。
120106:2008/11/23(日) 07:28:16
ソレダ!!
後でやってみよう
121106:2008/11/24(月) 00:28:42
いやはや、普通に "Use Hardware Accelerator" というオプションがありましたな。
それを切ればYUY2で接続することができました。

[Cyberlink S/P decoder]のプロパティ設定方法については調べていません。
おそらくIPropertyBagインターフェイスが実装されていると思うんですがどうなんでしょう?

では、おやすみなさいませ
122104: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デフォルトの名無しさん:2008/12/01(月) 10:14:41
フィルタを登録する時はどうすればいいんですか?

CComPtr<IBaseFilter> WAVE_Filter;
WAVE_Filter.CoCreateInstance(CLSID_MPEG1Splitter); // ここでエラー
DS_graph->AddFilter(WAVE_Filter, _T("aaaa");

フィルタ CLSIDの項目をいれたんですが、)が無いとか言われるんです。
124デフォルトの名無しさん: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デフォルトの名無しさん:2008/12/03(水) 04:46:50
FileWriterは AVI ファイル用だったきがす。mux挟まないと駄目。
Waveファイル出力フィルタは標準で存在しない。SDKに WavDest というサンプルがある。
まずはドキュメントを一通り読むことだ。
127デフォルトの名無しさん:2008/12/03(水) 06:45:19
ためしにAVIMuxを間に入れたらAVIのファイルコピーができあがりました。
ずっと行き止まりで助かりました。
ありがとうございました。
128デフォルトの名無しさん:2008/12/10(水) 21:39:36
再生中の動画から静止画をキャプチャしてDirect3Dのテクスチャに書き込みたいんですが、
どうやって画像を取得すればいいですか?なるべく高速に動作する方法を使いたいです。
ビデオウィンドウも表示されないようにしたいです。
129デフォルトの名無しさん:2008/12/10(水) 21:44:02
GraphEditで色々遊んでみな
130デフォルトの名無しさん:2008/12/13(土) 22:06:21
MSのDirectShowのドキュメントは何処にあるんですか?
MSDNで検索してもいいんですが、インターネットに接続できないことが多いので・・・
131デフォルトの名無しさん:2008/12/13(土) 22:38:15
132デフォルトの名無しさん:2008/12/14(日) 16:41:58
すいません。質問です
mpeg2デコーダの出力ピンがDirectX Video Acceleration (DXVA)でビデオレンダラに接続されている状態で、
自作した変換フィルタをその出力ピンとビデオレンダラの間に接続したいのですが、何か方法ありますか?
変換フィルタの入力ピンのMediaのSubTypeがRGBやYV12では接続できませんでした
DXVAのビデオアクセラレーションが効いている状態では変換フィルタを接続することはできないということでしょうか?
133デフォルトの名無しさん:2008/12/14(日) 20:49:49
GraphEditで色々遊んでみな
134130: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デフォルトの名無しさん:2008/12/14(日) 21:36:45
>>133
GraphEditでいろいろ遊んでみました
DXVAを使うmpeg2デコーダの場合は「接続に必要な中間フィルタの組み合わせが見つかりませんでした」で変換フィルタが接続できませんでした
DXVAを使わないmpeg2デコーダにすれば変換フィルタを入れられるのですが、ハードウェアの再生支援がなくなるのでCPU負荷が高くなります・・・
DXVAを使うデコーダのメリット値が一番高い場合、自動的な組み合わせではなく、変換フィルタと接続できるデコーダを自力で探さないといけないのが少々面倒ですね
H264のデコーダでもDXVAが使われることがあるので、DXVAに対応させるように変換フィルタを組み合わせるのは結構大変ですねオワタ\(^O^)/
136130:2008/12/14(日) 22:02:30
Streams.hも探しているんですが無いです・・
いったい何処にあるんだ亜!
137デフォルトの名無しさん: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デフォルトの名無しさん:2008/12/14(日) 23:00:23
>>130
こんなとこで、クダまいてないで、ググったほうが早いぞ。
手当たり次第に見ていけば環境構築について書いたHPくらいすぐ見つかるじゃろ。
というか、テンプレの関連サイトくらいは全部のぞいとくべし。
139130: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デフォルトの名無しさん: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デフォルトの名無しさん:2008/12/15(月) 23:57:16
C/C++でプログラム書いたことあるのか???
142デフォルトの名無しさん:2008/12/15(月) 23:58:03
>>135
mpeg2デコーダとDXVAの間に自作フィルタ入れたいんだよね?
サンプルでさ、NullNullフィルタだかNullInPlaceだか名前忘れたけど
何にもしないフィルタがあるんだわさ。
そいつを改造してmpeg2デコーダとDXVAに入れてみるといいよ。
改造内容はどのメディアタイプで繋がるのかログでも吐かせりゃいいべさ。
143デフォルトの名無しさん:2008/12/16(火) 00:01:12
言い忘れた。
>mpeg2デコーダの出力ピンがDirectX Video Acceleration (DXVA)でビデオレンダラに接続されている状態で

一回接続させた後に接続解除して、Nullフィルタ繋ぐんだわさ
144デフォルトの名無しさん:2008/12/16(火) 00:08:28
>>139
C++かVSスレで質問しろ。
145デフォルトの名無しさん:2008/12/16(火) 01:55:37
>>139
Expressだとatlmfcがないから無理
146130:2008/12/16(火) 15:07:14
>>144
そうすることにします・・
皆さん回答ありがとうございました。
147デフォルトの名無しさん:2008/12/18(木) 23:37:26
フレーム単位でシークするのってどうやるの?
SetTimeFormatでTIME_FORMAT_FRAMEを指定したら
E_NOTIMPLが帰ってきて使えないんだが
148デフォルトの名無しさん:2008/12/18(木) 23:56:16
自分でフレーム数をMediaTimeに変換してシークする。
かな。
149147:2008/12/22(月) 22:57:00
>>148
遅れたがサンクス。
150デフォルトの名無しさん:2008/12/22(月) 23:05:39
・再生処理に使う時間が充分あれば等速で再生し、
間に合わない場合は再生速度を遅くする
(つまり、一切フレームスキップをしないようにしたい)
・音声をリアルタイムに加工、出力する

この2つを実現するにはどうする?
151デフォルトの名無しさん:2008/12/22(月) 23:06:15
かなり下がったし、age
152デフォルトの名無しさん:2008/12/22(月) 23:49:58
C++で作ったフィルタをC#から使うのってどうやるの?
検索しても出ない
153デフォルトの名無しさん:2008/12/23(火) 00:29:33
>>152
フィルタを使うじゃ抽象的過ぎてわからんよ。
154デフォルトの名無しさん:2008/12/23(火) 00:43:57
手とり足とりということです
155デフォルトの名無しさん:2008/12/23(火) 21:00:54
DShow.NETがあるやん。
156デフォルトの名無しさん:2008/12/23(火) 21:33:31
もちろん、DirectShow自体COM Interopでもなんとかなるはず。
157152: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デフォルトの名無しさん:2008/12/23(火) 22:24:21
COMに対応したDLLってのは1のことか?
SDKのサンプルの改造じゃだめなの?
159152:2008/12/23(火) 22:46:59
・・・どのサンプル?
160デフォルトの名無しさん:2008/12/23(火) 22:50:45
SampVidとかだけど。
161デフォルトの名無しさん:2008/12/24(水) 22:33:25
"C# DirectShow"でgoogle検索すると山ほど見つかるわけだが。
何を迷ってる?
162デフォルトの名無しさん:2008/12/25(木) 00:38:38
DirectShowに関係ないところで迷ってるぽい
163デフォルトの名無しさん:2008/12/25(木) 01:33:09
質問なのですが、HDVをDirectShowでキャプチャすることはできますでしょうか?
164152: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デフォルトの名無しさん:2009/01/02(金) 22:21:16
目と指と反射神経を鍛える
167デフォルトの名無しさん:2009/01/02(金) 23:19:34
普通にImediaControl::Runするとビデオが進んでしまうので
そうさせない方法を
168デフォルトの名無しさん:2009/01/03(土) 00:07:03
Pauseでええやん。
169デフォルトの名無しさん: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デフォルトの名無しさん:2009/01/06(火) 15:10:32
>>169
可能です。
ただ、ファイル出力処理で滞ると当然コマが飛びます。
再生優先かファイル出力優先かによってコールバック内の実装をよく考えるべし。

>>170
IMediaControl::GetState()で必要最低限のウェイトを入れられると思います。
デバッグ中ならとりあえずINFINITEを入れてもいいでしょう。
172169:2009/01/06(火) 16:03:26
>>171
ありがとうございます
現在
ttp://www.geekpage.jp/programming/directshow/samplegrabber.php
こちらのページを参考にしているのですが
BMPではなくそのままの動画ファイルにするには
どういった部分を変更すればよいのでしょうか?
173デフォルトの名無しさん: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デフォルトの名無しさん:2009/01/06(火) 17:01:41
>>171
ありがとうございます。
IMediaControl::GetState()で最低限のウェイトにできました。
所でこれはやっぱりウェイトを入れないとダメなものなんですか?
175デフォルトの名無しさん:2009/01/06(火) 17:51:04
>>174
フィルタグラフ自体は別のスレッドで動いているものなので、
スレッド間で同期をとることを考えると仕方のないことですね。
176デフォルトの名無しさん:2009/01/06(火) 18:12:26
>>175
そうなんですか。
ちなみに、最初のフレームから最後のフレームまで
順番に画像を抽出したい場合は>>170以外の方法でもっと効率がいいやり方はありますか?
177デフォルトの名無しさん:2009/01/06(火) 18:41:58
なんか知らんが、普通にエンコードする時の様にフィルタ繋げるだけでいいんでね?
178デフォルトの名無しさん:2009/01/06(火) 18:50:35
やりたい事は、最初のフレームから最後のフレームまで順番に
画像を取り出すだけなんですけどね。特に動画を再生する必要はないんですが
179デフォルトの名無しさん:2009/01/06(火) 18:55:56
>>176
毎フレームSetPositionsをするのは確かに効率が悪いです。
可能であればSampleGrabberのコールバックを使った方がいいでしょう。

自分は以下の記事を参考にしてコールバック処理を実装しました。
ttp://codezine.jp/article/detail/322

GetCurrentBufferに比べると結構面倒ですけどねw


しかし結局自分はSampleGrabberの実装を捨てることになってしまいましたorz
(まあどうでもいいことですが)
180デフォルトの名無しさん:2009/01/06(火) 19:13:34
>>179
ありがとうございます。
参考にさせて頂きます〜
181169:2009/01/06(火) 19:14:29
>>173
度々ありがとうございます
VBはいまいち理解できてないのですがVC++の場合ですと
ttp://www.geekpage.jp/programming/directshow/video-capture-save-avi.php
こちらのページの入力をビデオカメラから動画ファイルに変更するということでよろしいのでしょうか?
的外れな質問でしたらすみません
182デフォルトの名無しさん:2009/01/06(火) 19:41:19
>>181
そこにはキャプチャデバイスからAVIファイルに直接保存する方法が書いてありますが、
169さんの場合対象が(ネットワーク上の)ファイルからの再生だとすると
あまり参考にならないと思います。

とりあえず>>173で挙げたページと同じようにGraphEditでフィルタを繋いでみて、
自分の意図している動作をさせられるか、を確認してはいかがでしょうか。

ほな。
183デフォルトの名無しさん:2009/01/06(火) 21:14:22
 こちらはDirectShowについては全く無知な素人です。
 板違いな質問かもしれませんが、ことはDirectShowに関わる問題なようなので、お詳しい皆さんお助けください。
「Virtual PC」上で、NHKオンデマンドからDLしたWMVファイルをWMPで再生を試みたところ、「DirectShow フィルタ グラフに存在しないピンに操作を実行しようとしました」と表示され、再生できませんでした。
 OSはXP、WMPのバージョンは10です。
 解決法について、ご教示のほど願います。
184167:2009/01/06(火) 22:10:41
>>168
RunしてすぐにPauseするという事?

ttp://www.shader.jp/xoops/html/masafumi/directx9/DShow/dshow001.htm
を参考にレンダラー作ったんだけど
RunしてすぐにPauseすると一回もレンダリングが行われないで
ポーズしてしまう・・・
185169:2009/01/06(火) 22:23:50
>>182
ライブストリーミングの場合はアドレスが「http://IP:ポート番号」になるので
GraphEditではどうやってソースとして指定できるのかがわかりません
再生することはできたので
要は再生している動画を別ファイルに保存するというようなことをしたいのですが
簡単な方法などないでしょうか?
何度も質問ばかりで申し訳ありません
186デフォルトの名無しさん:2009/01/06(火) 23:40:19
>>184
DoRenderSampleで初回のフレームが到着したかどうかチェックして
ポーズをかけてみたらどうでしょう?
(やり方としてマットウかどうかはよく分かりませんが)

>>185
File Source (URL) で・・・、と思ったけどこれで直接URL指定する方法が分かりませんね。
一応適当なテキストファイルにアドレスを書いて File Source (Async) で開くと
勝手に ASX File Parser が繋がってFile Source (URL) で開きなおしてくれるっぽい・・・。

こっち(↓)みてコード書いた方が早いかも。
ttp://www.geekpage.jp/programming/directshow/renderfile-url.php
187デフォルトの名無しさん:2009/01/07(水) 10:13:37
ちょいと質問なんですが。
DirectShowがまだ何かに統合する前に作ったソフトがあるのですが
これ今でもDirectX9にしても普通にコンパイルできて動画がみれるのですが
コンパイルできてるなら特にSDKとかなくてもいいんですよね?
188デフォルトの名無しさん:2009/01/07(水) 10:30:51
VFWでコーディングされているのではないかとエスパー
試しにコードの一部でもうpしてみれ
189デフォルトの名無しさん:2009/01/07(水) 10:50:36
>>188
あ、エスパー的な質問でしたか。
とりあえずファイルをオープンするところをうpります

bool Open( const char *chrFileName )
{
 if( FAILED(CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&GraphBuilder )) ) return false;
 if( FAILED(GraphBuilder->QueryInterface( IID_IMediaControl, (void **)&MediaControl )) ) return false;
 if( FAILED(GraphBuilder->QueryInterface( IID_IMediaEventEx, (void **)&MediaEventEx )) ) return false;
 if( FAILED(GraphBuilder->QueryInterface( IID_IMediaSeeking, (void **)&MediaSeeking )) ) return false;
 if( FAILED(GraphBuilder->QueryInterface( IID_IVideoWindow, (void **)&VideoWindow )) ) return false;
 if( FAILED(GraphBuilder->QueryInterface( IID_IBasicAudio, (void **)&BasicAudio )) ) return false;
 if( FAILED(CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **)&BaseFilter )) ) return false;
 if( FAILED(BaseFilter->QueryInterface( IID_ISampleGrabber, (void **)&SampleGrabber )) ) return false;
 GraphBuilder->AddFilter( BaseFilter, L"Grabber" );
 AM_MEDIA_TYPE mt;
 ZeroMemory( &mt, sizeof( AM_MEDIA_TYPE ) );
 mt.majortype = MEDIATYPE_Video;
 mt.subtype = MEDIASUBTYPE_RGB24;
 mt.formattype = FORMAT_VideoInfo;
 if( SampleGrabber->SetMediaType( &mt ) != S_OK ) return false;
 WCHAR buff[512];
 ::ZeroMemory( buff, sizeof( buff ) );
 ::MultiByteToWideChar( CP_ACP, 0, chrFileName, strlen(chrFileName), buff, sizeof(buff) );
 if( FAILED(GraphBuilder->RenderFile( buff, NULL )) ) return false;
 if( PlayWnd != NULL ){
  VideoWindow->put_Owner( (OAHWND)PlayWnd );
  VideoWindow->put_WindowStyle( WS_CHILD|WS_CLIPSIBLINGS );
  if( FormWnd && MediaEventEx->SetNotifyWindow( (OAHWND)FormWnd, WM_GRAPHNOTIFY, 0 ) != S_OK ) return false;
 }
190デフォルトの名無しさん:2009/01/07(水) 10:51:27
 if( SampleGrabber->GetConnectedMediaType( &mt ) == S_OK ){
  pVideoHeader = (VIDEOINFOHEADER *)mt.pbFormat;
  BITMAPINFO BitmapInfo;
  ZeroMemory( &BitmapInfo, sizeof( BitmapInfo ) );
  CopyMemory( &BitmapInfo.bmiHeader, &(pVideoHeader->bmiHeader), sizeof( BITMAPINFOHEADER ) );
  hBitmap = CreateDIBSection( 0, &BitmapInfo, DIB_RGB_COLORS, &DIBBuffer, NULL, 0 );
  DIBBufferSize = mt.lSampleSize;
  SampleGrabber->SetBufferSamples( TRUE );
 }
 if( MediaSeeking->SetTimeFormat( &(TIME_FORMAT_FRAME) ) != S_OK ) return false;
 return true;
}

こんな感じなのですが・・・
191デフォルトの名無しさん:2009/01/07(水) 12:49:42
おおう、エスパー失敗w
普通にDirectShowね。
「まだ何かに統合する前」てActiveMovie時代のことを言ってるのかな?
当時はActiveMovie SDKのインストールが必要でしたね。

Visual Studio .NET 2003辺りならPlatform SDKのサブセットみたいなのが
同梱されていたと思うので、特にSDKを追加する必要はないはず。
2005以降だとEEであればPlatform SDKかWindows SDKのインストールは
必要になると思いますです、ハイ。
192デフォルトの名無しさん:2009/01/07(水) 13:17:20
>>191
これDirectShow使うのに必要なのって
ヘッダファイル
DShow.h
QEdit.h

strmiids.lib
とDirectXがインスコされていればいいだけですよね?
193デフォルトの名無しさん:2009/01/07(水) 13:34:24
>>192
プログラムとしてインクルード/リンクすべきファイルはそんなもんですが、
各ヘッダからやはり別のWindows(Platform) SDKに含まれるヘッダを
インクルードしている形跡もあるので、注意は必要かと思います。

まあ、コンパイルしてみれば分かることですけどね。
194デフォルトの名無しさん:2009/01/07(水) 13:40:56
>>193
あ、そっか、そうですよね。
とりあえず今は普通にコンパイルが通るって事は
以前にインスコしたのがあるからなんですね。
195デフォルトの名無しさん:2009/01/09(金) 18:04:57
Visual Studio 2008 Standard EditionってSDK入れないとダメですか?
何かExpressは同封されてるって書いてるんですが・・・
196デフォルトの名無しさん:2009/01/09(金) 18:17:50
されてるって書いてあるのに何故インストしない?

BaseClassesの方ならStandardのSDKにすら入ってないよ。
いつもどうり別途Windows SDKが必要。
197デフォルトの名無しさん:2009/01/09(金) 18:22:57
ExpressじゃなくてStandardだから。
Standardはどうなのか知りたかった
198184:2009/01/09(金) 21:51:03
>>186
なるほど
DoRenderSample()
{
...
rendered = true;
...
}

movie->play();
while(!movie->isRendered())
{
}
こんな感じ?確かにあまりまっとうじゃない・・

ttp://www.geekpage.jp/programming/directshow/samplegrabber-3.php

画像の取得はCBaseVideoRendererで、1フレーム目でとめるのには
SampleGrabberを使うということはできるのかな
199デフォルトの名無しさん:2009/01/09(金) 22:34:33
>>184
そのままの意味だ。RunしないでPause。
200デフォルトの名無しさん:2009/01/09(金) 22:37:33
ttp://msdn.microsoft.com/ja-jp/library/cc356923.aspx
つか、全部書いてあるだろ。ドキュメントくらい読め。
201184:2009/01/09(金) 23:53:34
しかし なにもおこらない
Runして初めて表示される・・
202デフォルトの名無しさん:2009/01/10(土) 00:58:38
oops!レンダラ自作してるのか。悪かった。
Pauseでポスターフレーム出す処理はレンダラが実装する必要があるんだわ。

void OnReceiveFirstSample(IMediaSample *pMediaSample) {
DoRenderSample(pMediaSample);
}

これ追加するとよかばってん
203デフォルトの名無しさん:2009/01/10(土) 08:09:02
おー、OnReceiveFirstSampleってそうやって使うんか。
184じゃないけどthx
204169:2009/01/12(月) 19:29:05
とりあえずGraphEditを使ってみた結果
ttp://sageuploader.if.land.to/cgi-bin/1upload/src/sage1_8271.jpg
このようにすることでライブストリーミングが保存できました
あとはこれをプログラムで書くだけなのですがピンのつなぎ方がよくわかりません

再生の場合は
ttp://www.geekpage.jp/programming/directshow/renderfile-url.php
にあるように
pMediaControl->RenderFile(URL);
pMediaControl->Run();
という風にすればよいというのはわかるのですがこの場合はどうすればよいのでしょう?

SetOutputFileNameとRenderStreamを使えばよいのかな?と考えてはいるのですが
サンプルがビデオキャプチャからの取得方法ばかりで
こういった場合にどのような記述をすればよいのかわかりません
205デフォルトの名無しさん:2009/01/12(月) 22:51:43
これ使って作ったツールはWindows2000でも動くかな?
206デフォルトの名無しさん:2009/01/13(火) 01:18:52
>>204
RenderFilleやっちゃいかん。
ソースフィルタ(URL)をフィルタグラフに登録したあと、
出力ピンを列挙してAVI Muxに1つずつ接続すればおk

たぶん。
あ、あとファイル出力も手動で指定してフィルタ繋いでね。
207169:2009/01/13(火) 06:56:07
>>206
ありがとうございます
以下のようなプログラムを作ってみたのですが

ttp://uploaders.ddo.jp/upload/1mb/src/1up5294.txt

コンパイルすれば通るものの実行してもファイルが作成されません
これはピンのつなぎ方などが間違っているのでしょうか?
208デフォルトの名無しさん:2009/01/13(火) 12:50:40
なんでエラー値をチェックしないの?
209デフォルトの名無しさん:2009/01/13(火) 16:10:02
>>206さんのアドバイスが理解されていない・・・・
210デフォルトの名無しさん:2009/01/13(火) 17:18:19
>>208
チェックしてみましたがどこもエラーは返ってきませんでした

>>209
すいません・・・
>>206
ttp://msdn.microsoft.com/ja-jp/library/cc352330.aspx
の辺を参考にしてやってみたんですがどの辺がおかしかったでしょうか?

ソースフィルタ(URL)をフィルタグラフに登録、というのは
pGraph->AddSourceFilter(URL, L"Source Filter", &pSrc);
出力ピンを列挙してAVI Muxに1つずつ接続
というところはRenderStreamを2回行ってみたのですが
根本的に間違っていたりしたらすみません・・・
211169:2009/01/13(火) 18:38:16
あー見返すとなんか滅茶苦茶ですね
一から書き直してきます
212デフォルトの名無しさん:2009/01/13(火) 19:57:05
213デフォルトの名無しさん:2009/01/13(火) 20:29:46
サンプルをビルドして動いたからと言って
安易に一歩踏み込むとすぐに樹海に迷い込むのがDirectShow。
214169:2009/01/13(火) 22:44:13
以下のように作り直してみたのですが、

ttp://uploaders.ddo.jp/upload/1mb/src/1up5301.txt

AddFilterからどうしてもNULLポインタが返ってきたり
GetPinがコンパイルをとおらずPin同士の接続ができなかったりしますが
とりあえずそれらの部分を除外して実行した結果
http://localhost:7144/test.aviのようなファイルは保存に成功できました
しかしライブストリーミングの場合は解像度と再生時間はきちんとできた動画が作成されたのですが
再生しようとしても再生されない動画ファイルでした

やはりAddFilterやPinの接続がきちんとできていないことが原因なのでしょうか?

GraphEditでは簡単にできても実際に作るのは難しいものなのですね
単に私が駄目なだけかもしれませんが
215デフォルトの名無しさん:2009/01/13(火) 22:55:51
確かに、GraphEditの様子をそのままコードにしてくれるツールがあったら欲しいな。
216デフォルトの名無しさん:2009/01/13(火) 23:37:12
>>214
MSDNの通りにプログラムが書けてない。
IGraphBuilderはCoCreateInstanceしない。
ICaptureGraphBuilder2からGetFiltergraphで取得する。
217デフォルトの名無しさん:2009/01/14(水) 01:01:13
>>216
なるほど

hr=CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,
CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2, (void **)&pBuilder);
hr=pBuilder->GetFiltergraph(&pGraph);

こういうことですね
しかしこうやってもGetPinがコンパイルを通らないのは変わらず
そこをコメントアウトして実行すると
hr=pGraph->AddFilter(pAVIMux,L"AVI Mux");の部分で
例外が出て終了する様になりました
これもコメントアウトしたばあいは前回と変わらず解像度と再生時間のみ正しい
再生されない動画ファイルが作成されるだけでした・・・
218デフォルトの名無しさん:2009/01/14(水) 01:21:22
なんだそのGetPinってのはどこからでてきた?自作メソッドなのか?
219デフォルトの名無しさん:2009/01/14(水) 01:38:19
>>218
これ使ってピン同士を接続するのかなと思ってコピペしてきたら
ただの自作メソッドでした
早とちりしてすみません
削っても動かないことに変わりはないのですが・・・
220デフォルトの名無しさん:2009/01/14(水) 01:42:46
>>219
もう少し頑張って勉強してからまたおいで。
エスパーじゃないから、そんなんでコンパイル通らないとか言われても困るわ。
221デフォルトの名無しさん:2009/01/15(木) 15:41:50
VideoWindow->put_OwnerでVFW_E_NOT_CONNECTEDが返ってくるのですが・・・

if( FAILED(CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&GraphBuilder )) ) return false;
if( FAILED(GraphBuilder->QueryInterface( IID_IMediaControl, (void **)&MediaControl )) ) return false;
if( FAILED(GraphBuilder->RenderFile( buff, NULL )) ) return false;
if( FAILED(GraphBuilder->QueryInterface( IID_IVideoWindow, (void **)&VideoWindow )) ) return false;
if( VideoWindow->put_Owner( (OAHWND)PlayWnd ) == S_OK ){ ←ここでS_OKにならない
  VideoWindow->put_WindowStyle( WS_CHILD|WS_CLIPSIBLINGS );
  if( FormWnd && MediaEventEx->SetNotifyWindow( (OAHWND)FormWnd, WM_GRAPHNOTIFY, 0 ) != S_OK ) return false;
}
PlayWnd をNULLにしてもS_OKにはなりませんでした。
何が原因でしょうか?
222221:2009/01/15(木) 19:18:33
対象コンピュータをx64にしてたらエラーがでてx86にすると正常に通りました><

ちなみに上記のコードの後に読み込みと同時に1フレーム目を表示されようと
MediaSeeking->SetPosition  ←上のコードには書いてないですが今はQueryInterfaceしてます
MediaControl->StopWhenReady();
VideoWindow->Visible( OATRUE );
を入れたのですが、何故か1回目の読み込み時には表示されず
2回目以降に表示されるのですが、何が原因ですか?
223デフォルトの名無しさん:2009/01/15(木) 22:57:20
C++で作ったフィルタをC#で使いたいんですが
作ったフィルタをregsvr32で登録しないで使う方法ってありますか?
登録するのは(ユーザーにとって)面倒だし
クラスの型がIBaseFilterにしか出来ないので
アプリケーション側からデータを渡したり出来ません。
224デフォルトの名無しさん:2009/01/15(木) 23:06:15
その程度の事もわからないお前には無理だ。
C#のCOMのラッピングのメカニズムも理解できていないんだろ?
225デフォルトの名無しさん:2009/01/15(木) 23:08:01
Wevdestサンプルで、RenderFileで作成したグラフを最後のDefault DirectSound Deviceだけ切り離して付け替える時
RemoveFilterに失敗します。処理は正常なのですが、RemoveFilterはなぜ失敗なんでしょうか?
この行をいれないとRunで失敗するので入れてるんですが、失敗してるのに意味があるんでしょうか?

CComPtr<IBaseFilter> DS_DefaultDirectSoundDevice;

hr = DS_graph->FindFilterByName(L"Default DirectSound Device", &DS_DefaultDirectSoundDevice);
hr = DS_DefaultDirectSoundDevice->FindPin(L"Audio Input pin (rendered)", &pin_DefaultDirectSoundDevice);
hr = pin_DefaultDirectSoundDevice->ConnectedTo(&pin_DefaultDSDeviceTo);
hr = pin_DefaultDSDeviceTo->Disconnect();
hr = DS_graph->RemoveFilter(DS_DefaultDirectSoundDevice);
hr = DS_graph->ConnectDirect(pin_DefaultDSDeviceTo, pin_WaveDest_In, NULL);
226デフォルトの名無しさん:2009/01/15(木) 23:39:31
もはや時代はMediaFoundation
227デフォルトの名無しさん:2009/01/15(木) 23:52:39
>>225
エラーコードは何ぞ?

試してないから外してるかもしれないけど、
pin_DefaultDSDeviceToをReleaseしてないから、ってなオチはない?
228デフォルトの名無しさん:2009/01/16(金) 00:01:29
hr = pin_DefaultDSDeviceTo->Disconnect();
hr = pin_DefaultDirectSoundDevice->Disconnect();
229デフォルトの名無しさん:2009/01/16(金) 00:43:07
エラーなくなりました。
フィルターを削除する時繋いであったピンを解除。
繋ぎ換えるのにも解除後接続ですね。覚えました
意外と融通きかないんですね・・・
ありがとうございました。
230デフォルトの名無しさん:2009/01/16(金) 03:43:18
wmvが登場したとき wmvのコンテナに対応したソースフィルタを
書けと言われたときはくらくらと眩暈がした。
231デフォルトの名無しさん:2009/01/16(金) 12:36:29
ふうん
232デフォルトの名無しさん:2009/01/16(金) 13:31:35
1フレーム毎にイベントを取りたいのですが
イベント通知コードは何になるんですか?
233221:2009/01/16(金) 15:57:23
>>222で最初のフレームが表示sれないって話なんですが
どうやら一瞬表示してるみたいで
VideoWindow->Visible( OATRUE );の下にSleep( 1000 );と入れると
1秒間最は初のフレームを表示して、1秒後に消えてしまいます。
そして2回目に>>221を走らせた時はずっと最初のフレームを表示した状態になります
何が原因でしょうか・・・
234221:2009/01/16(金) 16:11:44
わかりました。
どうやらStatic Textに描画されてるのがまずかったみたいです。
Picture Controlにしたら消えなくなりますた。。。
なにこれ・・・
235デフォルトの名無しさん:2009/01/16(金) 17:00:57
Windowsの描画の基本的な所を理解していないのが問題
236デフォルトの名無しさん:2009/01/16(金) 17:10:21
>>235が基本を教えてくれるそうです。
では、どうぞw
237デフォルトの名無しさん:2009/01/17(土) 01:24:29
他人が理解できる説明の仕方を意識しよう。あと、日本語を学べ。
238デフォルトの名無しさん:2009/01/19(月) 09:02:44
ではまず国語辞典を勉強したらよろしいでしょうか?わかりません><
239デフォルトの名無しさん:2009/01/19(月) 16:28:00
単語を覚えるだけでは言語を会得できないな。
日本語でも英語でもプログラミング言語でも。
240デフォルトの名無しさん:2009/01/19(月) 17:49:44
GetConnectedMediaTypeでVFW_E_NOT_CONNECTEDが返って来るのですが原因は何でしょうか?
その前にやってるSetMediaTypeはちゃんとS_OKが返ってきてます。
241デフォルトの名無しさん:2009/01/19(月) 18:22:51
VFW_E_NOT_CONNECTED だから
繋げろ!
242デフォルトの名無しさん:2009/01/19(月) 18:30:15
>>241
言い忘れてましたが、VFW_E_NOT_CONNECTEDが出るのはGetConnectedMediaTypeだけで
他は普通にOKなので動画の再生はできています。
243デフォルトの名無しさん:2009/01/19(月) 18:51:39
再生にサンプルグラバは関与してますか?
そうでなければ別にサンプルグラバが繋がってなくても再生に支障はありませんよ。

少々面倒でもROTを登録して外部からフィルタグラフを覗けるようにしておくと
デバッグが便利ですよ。
244243:2009/01/19(月) 18:52:57
× ROTを登録
○ ROTに登録
245デフォルトの名無しさん:2009/01/19(月) 19:03:42
>>243-244
やりたい事はと言うと、再生して指定フレームの画像をbmpとして保存したかったのです。
その為にサンプルグラバでAddFilter後にビデオヘッダを取得したりと・・・
とりあえずGraphEditでみてみようとおもいます・・・

ちなみに、同じソースを別PCで動かすとGetConnectedMediaTypeでエラーはでませんし
正常にbmpファイルに落とすことができています。

246デフォルトの名無しさん:2009/01/20(火) 00:24:24
>指定フレーム
フレームで指定ってできるんだっけ?
○番目のフレームとか。
247デフォルトの名無しさん:2009/01/20(火) 00:41:20
つSetPositions

とはいえ、TIME_MEDIA_TIMEしか使えないストリームだと
ちょっと難しいけど。
248デフォルトの名無しさん:2009/01/21(水) 22:49:54
SetPositionsって時間指定じゃん
249デフォルトの名無しさん:2009/01/21(水) 23:40:38
TIME_FORMAT_FRAMEを指定してから使うよろし。
>>247でも書いてるけど、すべてのストリームでTIME_FORMAT_FRAMEが使えるとは限らない。

本格的にやるならDESを使うんですかね。
自分はやったことないので分からないですが。
250デフォルトの名無しさん:2009/01/22(木) 15:56:17
コーデックの関係でSampleGrabberでの画像抽出ができずBasicVideoを使っているのですが
BasicVideoのGetCurrentImageで画像を取ると3秒もかかってしまうのですが
これをもっと早く取る方法ってありますか?
251デフォルトの名無しさん:2009/01/22(木) 16:27:45
ムリポ

「コーデックの関係でSampleGrabberでの画像抽出ができず」辺りを
もう少し詳しく話した方が、いい話が聞けるかもよ?
252デフォルトの名無しさん:2009/01/22(木) 16:56:00
>>251
そうですね。失礼しました。
カノープス社のコードックであれしてるaviファイルから静止画を取りたいのですが
これが何故かSampleGrabber->GetConnectedMediaTypeでエラーになるんです。
ちなみにほかのaviファイルでは正常に静止画が取得できています。
それで試しにBasicVideoで静止画と取ってみたら取れたのですがこれが遅くて・・・
253デフォルトの名無しさん:2009/01/22(木) 17:57:02
小出しはやめてね
254デフォルトの名無しさん:2009/01/22(木) 18:04:39
カノープスのコーデックといってもHQとかMJPGとかいろいろある
255デフォルトの名無しさん:2009/01/22(木) 18:11:38
HQです。
今色々試してたんですが、SetMediaTypeするときの
サブタイプをMEDIASUBTYPE_RGB32にすると
GetConnectedMediaTypeでエラーが出ずに通ったのですが・・・
これすると、映像がさかさまになってる・・・
256デフォルトの名無しさん:2009/01/22(木) 21:17:22
>>255 さかさまってビットマップか?
257デフォルトの名無しさん:2009/01/22(木) 21:44:12
---------------------------------------------------------------------------
可能な限り速くコマ送りするのってどうするんですか?
IVideoFrameStepを使うと1倍速以上にはならないし、逆方向には進めません。
独自レンダラでレンダリングした画像を
加工して1コマずつ連番BMP出力したいだけなんですが。
(将来的にはDirectShowを使った出力も実装したいが、取りあえずBMPで)

>>255
memcpyを使って画像を自力で反転するしかないのでは。
(画像の横幅*4byteのサイズでコピーを繰り返す)
4byteなのはMEDIASUBTYPE_RGB32で32bitの画像と指定したからです。
もしRGB24なら3byteです。
258デフォルトの名無しさん:2009/01/23(金) 00:52:55
>>255
BITMAPINFOHEADERか何かで上下反転してるかどうかの判定は
可能じゃなかったかな?

>>257
SampleGrabberを使ってた時の経験だけど、SetSyncSource(NULL)では
うまくいかなくて、SetRateで適当に100倍くらいを設定して全力取得したり
したことはあります。ただ、コーデックによってはうまくいかないかも。
259デフォルトの名無しさん:2009/01/23(金) 09:47:42
MIDIをWAVEに変換する方法はあるんでしょうか?
再生される以上どこかで電圧値に置き換わってると思うんですが、サウンドボードで変換されてるんですか?
MIDIデフォルトOUTを置き換えても不可能でしょうか?WAVE関連のものに置き換えできませんでした
260デフォルトの名無しさん:2009/01/23(金) 10:15:08
>>256
いえRGB32にすると映像の方がさかさまになるんですよ。
RGB24にすると映像は正常なのですがGetConnectedMediaTypeでエラーになりまふ
>>258
あ、そうなんですか?
ちょっとヘルプみてみます。
261デフォルトの名無しさん:2009/01/23(金) 10:32:57
>>260
取得できたAM_MEDIA_TYPEからBITMAPINFOHEADERを引っ張り出して
biHeightの正負を見てみそって。

一応ココ(↓)見とき。
ttp://msdn.microsoft.com/ja-jp/library/cc352308.aspx
ttp://msdn.microsoft.com/ja-jp/library/cc371307.aspx
ttp://msdn.microsoft.com/ja-jp/library/cc352096.aspx

フォーマットによって成功したりしなかったりはColor Space Converterが
途中に入るかどうかによるのかもしれん。
262デフォルトの名無しさん:2009/01/23(金) 10:38:29
>>261
ありがとうございます。
しかしbiHeightが負で判別できた場合はどうやって映像を正常に表示できるんでしょうかこれ。
263デフォルトの名無しさん:2009/01/23(金) 10:56:49
ん?
レンダリング結果も上下反転してるの?
BMPに保存したときだけじゃなくて?
264デフォルトの名無しさん:2009/01/23(金) 11:02:18
BMPファイルのヘッダの高さもそのままマイナスにすれば普通は問題ない
まれに対応していないソフトもある
265デフォルトの名無しさん:2009/01/23(金) 11:32:50
>>263-264
静止画は正常で動画の方が逆になるんですよね・・・
でもRGB24にすると動画は正常になるけど
GetConnectedMediaTypeでエラーになって・・・
266デフォルトの名無しさん:2009/01/23(金) 12:47:44
それがDirectShowの仕様です
267デフォルトの名無しさん:2009/01/23(金) 18:26:01
全フレームの画像を取得したいのですが
SetPositionsでフレームを移動して取ると時間がかかるので
もっと効率的な方法はどうしたらいいですか?
268デフォルトの名無しさん:2009/01/23(金) 20:41:02
>>259
WavDestとFileWriterでよかばってん
>>267
ストリーム流しながらのサンプルグラバでよかばってん
269デフォルトの名無しさん:2009/01/23(金) 20:52:30
ばってん何?
270257:2009/01/23(金) 22:24:25
>>258
SetRateは(貴方が書いているように)コーデックによっては使えないので・・
SetSyncSource(NULL)しても再生は別スレッドで行われているのに
どうやって
レンダリング→BMP出力→レンダリング→BMP出力→...
のように同期させられるんでしょうか。
271デフォルトの名無しさん:2009/01/23(金) 22:27:17
基本的な事だけどpushとpullモデル理解しているか?
272デフォルトの名無しさん:2009/01/23(金) 22:37:32
>>257
サンプルグラバとNullRenderer使えよ
273257:2009/01/23(金) 23:17:54
>>271
push??pull?
ttp://unkar.jp/read/pc11.2ch.net/tech/1162913156
色々調べてみたら、これがヒットしました。
・・・ソースフィルタを作って加工したデータをこのフィルタに送るんでしょうか
274デフォルトの名無しさん:2009/01/23(金) 23:20:49
MSのドキュメントも読んでいないなんて死んだほうがいい
275デフォルトの名無しさん:2009/01/24(土) 11:38:54
>>268
ダメです、MIDIParsaとWevDestがつながりません。
pMediaType->SetType(&MEDIATYPE_Midi);
の変更もしてみたんですがダメです。グラフエディタでつながらないと出ます
お願いします
276デフォルトの名無しさん:2009/01/24(土) 13:47:34
>>275
情報少なすぎてわかるわけがないよ。エスパーじゃないし。
わかるように書いてよ。
277デフォルトの名無しさん:2009/01/24(土) 15:04:31
MIDIのトランスフォームフィルタを自作するか見つけてくる必要がある。
278デフォルトの名無しさん:2009/01/25(日) 17:51:50
まったく作れそうな気がしません
音源はどこから引っ張ってくればいいんですか?
279267:2009/01/26(月) 11:45:44
>>268
再生しながらはどのようにゲットすればいいですか?
イベントですか?
でもイベントでは1フレームずつ入ってこなかったしなあ
280デフォルトの名無しさん:2009/01/26(月) 18:15:47
コールバックですよコールバック
このスレでも何度か話題に出てるんで探してみれ
281デフォルトの名無しさん:2009/01/29(木) 21:59:01
COutputQueueを使ってコマ送りって可能?
282デフォルトの名無しさん:2009/01/30(金) 13:26:27
サンプルグラバのGetCurrentBufferで静止画を取得する時に
動画サイズのまんまではなくて縮小して取得したい時はどうしたらいいですか?
283デフォルトの名無しさん:2009/01/31(土) 15:50:00
自分で縮小でも拡大でも好きにすればいいんじゃない?
284デフォルトの名無しさん:2009/02/02(月) 03:20:48
複数の音楽ファイル(mp3とWMA)の一部ずつ(サビの部分)を繋いで、一つのWAVにしたいのですが、
どう作ればいいのか判りません。
最初の曲は、サビまでシークしてしてから、WAVEファイルにはできているようです。
ですが、2曲目を処理しようとすると、グラフを停止しないと、接続できないという現状です。
例えば、2つの曲をフェードインアウトで繋げる処理はどう書けばいいのでしょうか?
なにかヒントやサンプルなど教えてもらえるとありがたいです。
285デフォルトの名無しさん:2009/02/02(月) 04:29:59
高校の物理をちゃんと勉強していれば簡単な事なんだけどね
286デフォルトの名無しさん:2009/02/02(月) 10:56:55
DESじゃないのん?
287デフォルトの名無しさん:2009/02/03(火) 01:16:38
>>286
DESってDirectshow編集サービスのことですよね。
ちょっと調べてみます。 ありがとうございました。
288デフォルトの名無しさん:2009/02/05(木) 14:32:39
質問です。
MP4ファイルの頭に5Kほどのデータを付加したファイルを再生する
フィルターをASyncサンプルに手を加えて作りました。
GraphEditではファイルを選択して、VideoRendererとPIN接続すると、
MP4Splitterとffdshow codecが間に入り再生できます。
このファイルをGraphEditにD&Dするとはじかれます。

これをIGraphBuiderでグラフを作って再生したいのですが、
どうしても自作フィルターとMP4SplitterとのConnectで
CANNOT_CONNECTが帰ってきてしまいます。
自作フィルタにファイルパスを与えてグラフに追加するという、
GraphEditでの動作をどのようにプログラムしていいのかわかりません。
方法をご存知の方、ご教授ください。
ベースとするフィルタを間違えているのでしょうか?


289デフォルトの名無しさん:2009/02/05(木) 15:14:59
デバッグすりゃ原因がわかるだろ
290デフォルトの名無しさん:2009/02/05(木) 15:17:29
>>289
知らないならレスしないで下さい。ウザいだけです。。
291デフォルトの名無しさん:2009/02/05(木) 16:01:11
俺もデバッグすりゃ原因が分かると思う。
292デフォルトの名無しさん:2009/02/05(木) 16:50:34
IGraphBuilder::RenderFile() を使っちゃってる、に1票

・・・じゃないよね。
自作フィルタはちゃんと自前でCoCreateInstanceしてる?
293デフォルトの名無しさん:2009/02/05(木) 16:51:15
あ、メリット値を適切に設定してるなら別ね。
294デフォルトの名無しさん:2009/02/05(木) 17:14:08
GraphBuilderに自作SourceFilterとVideoRendarerだけ追加したら
後はRendaerFileでいいんじゃないの?
そうすりゃMP4Splitterとffdshow codecが勝手に間に入るだろ
295デフォルトの名無しさん:2009/02/05(木) 23:36:50
LONGLONG tmp = (LONGLONG)(frame * Renderer->getATPF());
pMediaSeeking->SetPositions(&tmp,AM_SEEKING_AbsolutePositioning,
NULL,AM_SEEKING_NoPositioning);

AverageTimePerFrameを使ってシークするのって駄目なんですか?
たまに思った位置にシークできないファイルがあります。
296デフォルトの名無しさん:2009/02/07(土) 01:54:57
ISampleGrabberについての質問です。
DirectShowでmp3を再生中にISampleGrabberのGetCurrentBufferを行うと、
再生中の場所の波形データが取得できると思うのですが、
毎回GetCurrentBufferを行っても、1秒間に約3回ほどしか取得するデータに変化がありません。
リアルタイムに現在再生中の場所の波形データを取得するにはどうしたらよいのでしょうか。
297デフォルトの名無しさん:2009/02/07(土) 15:37:21
298デフォルトの名無しさん:2009/02/08(日) 10:12:29
>>297
ありがとうございます。
解決しました。
299デフォルトの名無しさん:2009/02/08(日) 11:17:10
質問したなら、どう解決したのか書いて欲しい。
それにしてもマルチポストなんて今時珍しいね。
回答が付いているところにも驚いた。
300デフォルトの名無しさん:2009/02/08(日) 13:21:49
初歩的な質問ですが
キャプチャーボードにチューナ・S端子・コンポジットがあるのですが
その切り替えはDirectShowでできるのでしょうか?
カメラで入力した映像を解析ソフトを作ってみたのですがWebカメラでは物足りなくて
手元にあったボードを使ってみたのですが初期でチューナーになってしまうので
お願いします
301デフォルトの名無しさん:2009/02/08(日) 16:32:30
映像解析ソフトを作るとはハイレベルだ
302デフォルトの名無しさん:2009/02/08(日) 17:28:15
>>300
つ Crossbar
303300:2009/02/08(日) 17:55:56
できるんですね。ありがとうございます
304デフォルトの名無しさん:2009/02/09(月) 09:54:17
2つの動画を同時再生したいんですが、2回同じ表示手続きをしないとダメですか?
305デフォルトの名無しさん:2009/02/09(月) 10:42:16
グラフ2つ作れば良いだけの話では?
306デフォルトの名無しさん:2009/02/09(月) 11:58:32
>>305
あ、すみません。
そこの所をもうちょっと教えてください。
どこか参考になるサイトとかもあったらお願いしまふ
307デフォルトの名無しさん:2009/02/09(月) 12:54:37
>>306
1つのソースでレンダラ2つ出したいならスプリッタを使う。
別々のソースを表示したいならグラフビルダ2つ用意する。
308デフォルトの名無しさん:2009/02/09(月) 13:45:22
>>307
別の動画を再生したいからグラフを2つ作るんですね。
それで再生とかする場合はMediaControlも2つですよね?
309デフォルトの名無しさん:2009/02/09(月) 15:24:10
質問です。

IMediaDet::get_StreamLength() および get_FrameRate() で得られた値を使って
非圧縮AVIファイルの総フレーム数を取得するコードを書いていますが、
あるVista環境にて総フレーム数を間違うことがあります。
(822フレームと算出してもらいたいところ、830となったりします。)

何か特殊なフィルタがインストールされているのではないかと思うのですが、
客先環境のため、簡単にチェックできません。
とりあえず不具合回避策は準備したので緊急度は低いのですが、
このようなことが起こるケースについて何かご存知の方がいらっしゃいましたら、
ご教示ください。
310デフォルトの名無しさん:2009/02/09(月) 16:11:46
>>308 いえす
311デフォルトの名無しさん:2009/02/09(月) 16:16:20
>>310
ですよね。
と、言う事はやはり再生等に必要なアレは2つずつ用意しないといけないんですね。
ちなみに、同じコールバック関数を呼ぶようにした場合ってどっちの動画か見分ける術ってありますか?
312デフォルトの名無しさん:2009/02/09(月) 16:24:04
>>311
アレじゃわかんない。
コールバックって何よ。ISampleGrabberCB::SampleCBだったら
パラメータのIMediaSample で区別ができるかもしれない。
が、流す動画による。
313デフォルトの名無しさん:2009/02/09(月) 16:27:03
>>312
BufferCBを使ってるんです><
ちなみにアレとは
MediaControl、MediaEventEx、SampleGrabber、VideoWindowです。。。
314デフォルトの名無しさん:2009/02/19(木) 17:11:04
クズ共ちょっと教えてください。
XP64ビットOSでVC2009で32ビット用でコンパイルすると正常に動画再生ができるが
64ビット用でコンパイルすると音だけでて映像が表示されないんです。
お前達のようなゴミにはわからないかもしれませんが宜しくお願いします。
315デフォルトの名無しさん:2009/02/19(木) 17:16:53
VC2009
316デフォルトの名無しさん:2009/02/19(木) 17:26:03
コーデック
317デフォルトの名無しさん:2009/02/19(木) 17:33:45
思ったとおり役に立たないクズしかいないですね
318デフォルトの名無しさん:2009/02/19(木) 17:35:46
319デフォルトの名無しさん:2009/02/19(木) 23:58:51
ここはエスパー板じゃないんで、314の期待するような能力者は居ません。

もうちょっとヒントが多ければ優秀な推理マニアが現れるかもね。
320デフォルトの名無しさん:2009/02/20(金) 00:53:51
だからさ、64bitプロセスには64bit版コーデックが要るんだよ。
321デフォルトの名無しさん:2009/02/20(金) 02:26:18
知ってるがおまえの程度がAA略
322デフォルトの名無しさん:2009/02/20(金) 08:21:22
64ビットアプリにゃ64ビットDLL(この場合コーデック)が必要という常識も知らず
クズ呼ばわりってどんだけおめでたいんだ・・・。
コピペ厨房の俺でさえ知ってるわ。
323デフォルトの名無しさん:2009/02/20(金) 09:56:16
>>322
その程度の知識しかないから役立たずのクズって言ってるの
だから知らないならレスするなって
324デフォルトの名無しさん:2009/02/20(金) 10:14:37
64bit Windowsが普及しない原因を知ってれば、
容易に気が付くだろ。知識なんかほとんどいらね。
バカじゃねーの?
325デフォルトの名無しさん:2009/02/20(金) 10:36:15
知らないからって必死になるなって
326デフォルトの名無しさん:2009/02/20(金) 11:09:56
>>314
が必死になってるのか。
327デフォルトの名無しさん:2009/02/24(火) 11:30:20
VideoWindow->put_OwnerにHBitmapを与えて再生した時に
ウィンドウフレーム無しの動画が画面上に表示されるのですが
これHBitmapだからそのまま変換して画像としてファイルに保存できますか?
328デフォルトの名無しさん:2009/02/24(火) 12:05:30
ISampleGrabbberCBコールバックのBufferCBで受け取るDIBデータを
指定したサイズで受け取るにはどうしたらいいですか?
329328:2009/02/24(火) 15:01:36
現状では動画のオリジナルサイズになっているのですが
これをVideoWindowで再生させてるウィンドウサイズと同じ大きさにしたいです
330デフォルトの名無しさん:2009/02/24(火) 16:02:56
リサイズ機能なんてねーよw
普通はレンダーが勝手に表示サイズ合わせるだろ
331328:2009/02/24(火) 16:08:50
そうですか。やっぱり無いですか・・・
332デフォルトの名無しさん:2009/02/24(火) 22:55:54
すみません。最近ARIBの仕様書がWebで閲覧できることをしったので、
地デジチューナーからSI情報を取得して、中身をさわってみたいと
思いました。
DirectShowでそんなかんじのことができるのでしょうか?
(SIのパースまで、という意味ではなく、データセクションが
抜ければ十分うれしいです)

参考になるURLなどございましたらご教授の程お願いできますでしょうか?
よろしくお願いいたします。
333デフォルトの名無しさん:2009/02/24(火) 23:33:05
>328
質問の内容を十分理解せず、脊髄反射的回答しちゃうけど、
動画のリサイズはDESでできた気がするデス。
334328:2009/02/25(水) 10:01:30
>>333
あ、すみません。
DESってどんなのでしょうか?
何か参考になるサイトとかあったら教えてください><
335デフォルトの名無しさん:2009/02/26(木) 00:27:55
Directshow Editing Servicesの略DES。
この辺を参考にすると良いDES。
ttp://msdn.microsoft.com/ja-jp/library/ms867700.aspx
ttp://msdn.microsoft.com/ja-jp/library/dd148668.aspx

ほとんど329しか読まずに応えてしまったけど、
・ソースそのものが変化してしまう
・再生中にサイズを変えるとかは不可能
なんで要注意。
336デフォルトの名無しさん:2009/02/26(木) 01:13:01
質問失礼します。
4chの音声を同期を取りながら再生する方法を一週間ほど考えているのですが、やり方が全くわかりません。
2つのオーディオチャンネルを結合して、ステレオにするフィルタはCodeZineで見つけたので作ってみました。
ただ、これだと(当然ですが)LとRから再生されてしまうので・・・。
単純にLとL、RとRを加算して一つのステレオとして出したいのですが、どうすれば良いのでしょうか?
お知恵を貸して下さい、よろしくお願いします。
337デフォルトの名無しさん:2009/02/26(木) 02:20:38
意味がわからん
338デフォルトの名無しさん:2009/02/26(木) 08:40:43
Codezineのサンプルソースをベースに、そういうフィルタをつくればいいじゃん。
339デフォルトの名無しさん:2009/02/26(木) 10:39:12
ミキシングしたいとか?
340デフォルトの名無しさん:2009/02/26(木) 15:19:59
最終的に何がしたいのだろうね?
自分でMTRつくりたいのか?w
341デフォルトの名無しさん:2009/02/26(木) 15:27:11
>>340
お前みたいなクズはレスするな。
342デフォルトの名無しさん:2009/03/18(水) 03:08:51
あげ
ミキシングしたいのかな?質問が意味不明
343デフォルトの名無しさん:2009/03/18(水) 14:10:56
有識者の皆様に質問です。

デバッグビルド時にフィルタグラフをROTに登録しています。
ttp://msdn.microsoft.com/ja-jp/library/cc370087.aspx

以前は普通に GraphEdit から "Connect to Remote Graph" で接続できていたのですが、
今日久しぶりに当該コードをメンテナンスしようとしたら接続できなくなっていました。

[症状]
 - "Connect to Remote Graph" でリストには表示される。
 - 選択してOKをクリックしても、何もグラフ上に表示されず。
 - 再度 "Connect to Remote Graph" でリストを表示すると、見えなくなっている。
 - デバッグ実行でも、コマンドラインからの実行でも症状変わらず。

この問題について、何か心当たりのある方はいらっしゃいますか?
344デフォルトの名無しさん:2009/03/18(水) 15:17:56
>>343
Vista で実行して困っているのなら
http://msdn.microsoft.com/en-us/library/ms787252.aspx
345343:2009/03/18(水) 16:45:18
>>344
ありがとうございます。
環境書いてませんでした。OSはXP(32bit)です。
念のためこの環境でも proppage.dll を登録してみましたが、やはり変わりませんでした。

なお、ひとつ間違いがありました。
pROT->Register() の第1引数になぜか 0 を指定してました。
ROTFLAGS_REGISTRATIONKEEPSALIVE に変更することで、何度 "Connect to Remote Graph" を
選択してもリストに "pid 0xXXX(ddd) IFilterGraph = XXXXXXXX" が出てくるようにはなりました。
ただ、やはり選択→OKしてもフィルタ構成は表示されません。うーむ・・・。

ちなみに、Windows SDK 6.0A/6.1 に含まれる GraphEdt ではリストにすら
表示されませんでした。
指定すべきモニカの文字列フォーマットが変わってたりするのでしょうか・・・。
346343:2009/03/18(水) 17:07:55
解決しました。
きっかけはこちら。
ttp://questionbox.jp.msn.com/qa1612988.html

quartz.dll を登録したら治りました。
ええー、quartz.dll ってデフォルトで登録されてませんでしたっけ?って感じですが・・・。

なお、この状態なら Windows SDK 6.0A/6.1 に含まれる GraphEdt でも接続できました。
でもタイミングによってなぜか Runtime Error が出ます。


どうもお騒がせしました。
347デフォルトの名無しさん:2009/03/18(水) 17:11:09
>>345
regsvr32 "C:\WINDOWS\system32\quartz.dll"
348デフォルトの名無しさん:2009/03/18(水) 17:11:39
orz
349デフォルトの名無しさん:2009/03/19(木) 02:31:25
347
明日はいいことあるさ
350デフォルトの名無しさん:2009/03/23(月) 11:02:01
RenderFileの戻りが遅いのですがこれを早くする方法を教えてください
351デフォルトの名無しさん:2009/03/23(月) 11:53:31
なぜ遅いか考えたことある?

352デフォルトの名無しさん:2009/03/23(月) 12:24:34
俺のRenderFileは早いよ
353デフォルトの名無しさん:2009/03/23(月) 13:13:05
早くする方法があったら教えてください
354デフォルトの名無しさん:2009/03/23(月) 13:17:47
お前、馬鹿だろ

355デフォルトの名無しさん:2009/03/23(月) 15:05:10
「RenderFileの戻りが遅い」と判断する根拠がよく分からないよ。
サンプルプログラムやWMPに比べて異常に遅いと体感できる、
もしくは実測してこうだった、などの比較はできてますか?


とりあえずエスパーで二つほど。

 ・インストールされているコーデック(パック)を片っ端からアンインストールする
 ・予め使うことが予定されているフィルタをフィルタグラフに登録しておく

あとはもう少し詳しい状況を教えてもらえれば、他にも何か言えることがあるかも。
356デフォルトの名無しさん:2009/03/23(月) 15:23:29
RenderFile関数から抜けてくるまで2秒くらいかかります。
早くする方法があったら教えてください
357デフォルトの名無しさん:2009/03/23(月) 15:25:57
速くするためには、まず何の理由で遅いのかを調べようぜ
358デフォルトの名無しさん:2009/03/23(月) 17:56:43
RenderFileの戻りが遅い理由って舞い糞ソフトに聞けばいいんですかね?
関数の内部事情なんて僕には検討もつきませんが。
っていうか、知らない人はレスしないで下さい。ウザイだけですよっと。
359デフォルトの名無しさん:2009/03/23(月) 18:11:52
うちじゃ2秒もかからないからな。
お前のとこだけで遅いのに理由がわかるわけないだろう。
360デフォルトの名無しさん:2009/03/23(月) 18:16:06
ごめん2秒じゃなかった1秒ちょいだった
ちなみにファイルサイズは4GBくらい
まあ、どうせお前らの持ってるエロ動画なんて100MB前後だろ?
361デフォルトの名無しさん:2009/03/23(月) 18:35:09
お前の持ってるちんこ同士がけこーんしてるような動画は1ビットも要りません
362デフォルトの名無しさん:2009/03/23(月) 18:51:50
どうせDVDでも引っこ抜いて4GBなんだろ、

363デフォルトの名無しさん:2009/03/23(月) 19:02:34
しかたないなあ。
たまたまシンプルな再生プログラム書いてたのでテストしてみたよ。
6GB超のAVIファイルを RenderFile() に突っ込んで要した時間は 169[ms] でした。

はい、次の情報どうぞ。
364デフォルトの名無しさん:2009/03/23(月) 19:05:04
すんませんでしたとしか言いようがありませんよ

んー、とりあえずお前らのソースみてやるからスレに貼ってください。
365デフォルトの名無しさん:2009/03/23(月) 19:15:01
HRESULT SimplePlay(LPCWSTR lpwstrFile)
{
CComPtr<IGraphBuilder> m_pGraph;
CComQIPtr<IMediaControl, &IID_IMediaControl> m_pControl;
CComQIPtr<IMediaEvent, &IID_IMediaEvent> m_pEvent;

HRESULT hr = CoInitialize(NULL);
if (FAILED(hr)) return hr;
hr = m_pGraph.CoCreateInstance(CLSID_FilterGraph);
if (FAILED(hr)) return hr;
hr = m_pGraph.QueryInterface(&m_pControl);
if (FAILED(hr)) return hr;
hr = m_pGraph.QueryInterface(&m_pEvent);
if (FAILED(hr)) return hr;
366デフォルトの名無しさん:2009/03/23(月) 19:16:22
DWORD tTmp = timeGetTime();
hr = m_pGraph->RenderFile(lpwstrFile, NULL);
tTmp = timeGetTime() - tTmp;
if (FAILED(hr)) return hr;

hr = m_pControl->Run();
if (FAILED(hr)) return hr;

for (;;) {
long code = 0;
hr = m_pEvent->WaitForCompletion(0, &code);
if ((FAILED(hr) && hr != E_ABORT) || code == EC_COMPLETE) {
break;
}
}
367デフォルトの名無しさん:2009/03/23(月) 19:17:27
CoUninitialize();
return S_OK;
}

>>365-367 まとめてみてください。
RenderFile()を抜けた後の tTmp の値を教えてね。
エラー処理に関するコメントは No thank you です。
368デフォルトの名無しさん:2009/03/23(月) 19:24:45
>>365-367
ありがとうございます。
やってることはお前いや貴様と一緒ですね
やっぱその他の環境の問題なんですかねこれ。
あ、ちなみにOSはXP64ですよですよ。
もうちょい調べてみます。わざわざありがとうございました、
369デフォルトの名無しさん:2009/03/23(月) 22:34:07
EnumPins グラフ 構築
で検索
370デフォルトの名無しさん:2009/03/24(火) 10:53:26
つーか情報の小出しに付き合ってられんわ
371デフォルトの名無しさん:2009/03/24(火) 11:38:52
>>370みたいな奴って知らないのにレスするタイプだよね
372デフォルトの名無しさん:2009/03/24(火) 11:47:37
>>371みたいな奴って煽りのしかレスできないタイプだよね

373デフォルトの名無しさん:2009/03/24(火) 11:50:58
最初の情報は遅いってだけ
次に2秒かかると出て
次に4GBと出て
自分のソースは出さずに人に要求して
それからOSがXP64と出た

で、>>355のレスには何も反応していない。
これで原因分かるのに間抜けだよな。
374デフォルトの名無しさん:2009/03/24(火) 12:26:25
単細胞って幸せだと思った
375デフォルトの名無しさん:2009/03/24(火) 14:44:08
最初の書き込みでゴミって判るのに、反応する奴がいるのが不思議
376デフォルトの名無しさん:2009/03/24(火) 14:59:53
過疎るくらいなら枯れ木も山の賑わいくらいに思ってた方がいいかな、と思って。
不快だったらゴメンね。
377デフォルトの名無しさん:2009/03/24(火) 15:05:55
ごめんねほんと
378デフォルトの名無しさん:2009/03/26(木) 15:17:44
動画を1フレームずつSetPositionsで動かして
コールバックで画像を取るのを作っているんですが
最初の1,2フレームでコールバックが来ないときがあるのですが
何が原因ですか?
379デフォルトの名無しさん:2009/03/27(金) 08:11:59
ヒント:CODEC
380デフォルトの名無しさん:2009/03/28(土) 13:59:38
SonicStageについてくるフィルタを使って、Atrac3(oma)の再生がやりたいんですが
デバッガで実行するとRenderFileの所で、「現在の場所のソースコードを表示できません」と出て止まってしまいます。
デバッガ無しで普通に実行すると問題なく再生できるんですが、原因分かる方いますか?
mp3やaviなどその他のファイルはデバッガでも問題ないです。

環境はVCEE2008、XP32SP3、DXSDK(April 2007)です。

もしかしたらソニーがリバエン対策でアンチデバッグしかけてるのかな?とか妄想したりしてます…
381デフォルトの名無しさん:2009/03/28(土) 14:16:28
よくわからんけど、そのフィルタがデバッグビルドされてて、ブレークするけどソースがないからそうなるとか?
382デフォルトの名無しさん:2009/03/28(土) 14:58:48
>>381
デバッグビルドですか、それは考えて無かったです
しかし、ブレークした後続行をするとAVが発生してしまうのです
383デフォルトの名無しさん:2009/03/28(土) 23:53:54
単純にソースの置いてあるパスの問題じゃねーの?
デバッカで動かす時、ソースファイル(再生したいファイル)どこに置いてる?
そんな基本的ミスする奴がDirectShowいじるわけねーか。
384デフォルトの名無しさん:2009/03/29(日) 00:12:25
>>383
>mp3やaviなどその他のファイルはデバッガでも問題ないです。
なのでパスの問題ではないです
寧ろ存在しないパス渡してもエラー吐かないみたいですが
できればSS入れている方で試された方いましたら情報頂けるとありがたいです
385デフォルトの名無しさん:2009/03/29(日) 00:40:47
ヒント;プロジェクトのプロパティ
386デフォルトの名無しさん:2009/03/29(日) 00:45:43
「現在の場所のソースコードを表示できません」は問題そのものじゃないでしょ。
デバッグビルド時に有効になるASSERTか何かで引っかかってるんでは?

根本的な問題が何かはよく分からんですが・・・。
387デフォルトの名無しさん:2009/04/01(水) 14:50:10
DirectShowで動画のオープン、クローズを繰り返すと
オープンとクローズ(GraphBuilderの破棄)にだんだん時間がかかるようになってしまいます。
2回目はだいたい200ms(前のをreleaseしてopenするまでの時間)なのですが、
これを20回もすると1秒はかかるようになってしまいます。
更に繰り返すとどんどん増えていくのですが、どうしたら増えずに一定で保てますか?
388デフォルトの名無しさん:2009/04/01(水) 18:03:39
>>387
>>365-367で示したコードで m_pGraph.CoCreateInstance() から CoUninitialize() の手前までを
forループでグルグル回してみたけど、特にGraphBuilderの破棄に時間がかかるような現象は
起きませんでした。(m_pGraph, m_pControl, m_pEventはループ終端で自力Releaseすること)

 ・>>365-367のコードで使用されているファイルを再生するとどうなりますか?
 ・>>365-367のコードとそちらのコードの違いがあれば簡単に教えてください。
 ・もし手持ちに複数のPC環境がある場合、どこで実行しても同じ結果ですか?
389デフォルトの名無しさん:2009/04/01(水) 18:07:43
こちらにDxVA1.0をバリバリ利用してるぜ、という猛者はいらっしゃいますか?

DxVA2.0だと大体メドは立ってるんですが、DxVA1.0で自由に表示位置や
タイミングをコントロールする(自前のテクスチャにデコード結果を書き出す)
方法がいま一つ分かりません。
VMR9のメソッドをこうすれ、等アドバイスをいただけないでしょうか。
390デフォルトの名無しさん:2009/04/01(水) 18:08:04
>>388
試験ありがとうございます。。。
C++Builder2007を使っていたのですが、
どうやらデバッグモードでコンパイルしてるexeだと>>387の現象になるみたいでした。
リリースモードでコンパイルしたexeでは現象は出ませんでした。
ほんとすんませんでした。
391388:2009/04/01(水) 18:33:43
>>390
えー、自分とこもDebugビルドでテストしてますがね。
C++Builder2007でどうなるかまでは試せませんが・・・。
392デフォルトの名無しさん:2009/04/03(金) 15:51:54
コールバック(BufferCB)で画像を取得してるのですが
2フレーム目のSampleTimeが0になる時があります。
どういう場合に0になりますか?
393デフォルトの名無しさん:2009/04/03(金) 18:48:56
環境もフィルタグラフの状態も書かずに答えられる人は神だけ
394デフォルトの名無しさん:2009/04/04(土) 10:17:53
環境とフィルタグラフを書いただけで答えられる人は神だけ
395デフォルトの名無しさん:2009/04/04(土) 16:06:23
全部書かかれてて答えられる人はただの人。

というわけでただの人向けに書いてください。
396デフォルトの名無しさん:2009/04/04(土) 16:33:49
わからない奴に限ってうだうだうるせー事言うよね。
397デフォルトの名無しさん:2009/04/04(土) 17:02:29
>>392
サンプルタイムはパーサがつけることが多いから、グラフ構成は
記しておいた方が良いね。
1フレーム目は0じゃないの?
398デフォルトの名無しさん:2009/04/05(日) 12:50:56
遺憾の意はイカン
399デフォルトの名無しさん:2009/04/05(日) 14:45:33
IGraphBuilder::RenderFile()にファイル名を指定すればファイルを読み込ませることは
できるんですが、バッファ上に置かれたファイルを読み込ませるにはどうしたらいいですか?
400デフォルトの名無しさん:2009/04/05(日) 15:14:10
IGraphBuilder::Render()で
401デフォルトの名無しさん:2009/04/05(日) 16:50:46
IGraphBuilder::Render()についてMSDNで調べて見ましたがバッファのデータを渡す方法が分かりませんでした

以下MSDNから引用
RenderFile メソッドは、ファイル名からデフォルトの再生グラフを作成する。
内部的には、このメソッドは AddSourceFilter を使って適切なソース フィルタを探し、
Render を使ってグラフの残りを作成する。
引用ここまで

要するにAddSourceFilterでソースフィルタ構築してソースフィルタの出力ピンを
Renderに渡して中間フィルタや出力フィルタを構築って事だと思うんですが、
AddSourceFilterに指定できるのもファイル名のみでバッファのポインタを渡せる場所がありませんでした
402デフォルトの名無しさん:2009/04/07(火) 14:11:59
ソースフィルタ作ればいいじゃん
403デフォルトの名無しさん:2009/04/07(火) 15:24:48
知らないならレスしないで下さい。ウザいだけです。
404デフォルトの名無しさん:2009/04/07(火) 17:00:09
まだ春休みか?それとも頭の中はずっと春休みなのか?>>403

405デフォルトの名無しさん:2009/04/07(火) 17:16:34
>>403 またお前か
406デフォルトの名無しさん:2009/04/07(火) 17:55:26
またお前らか
407デフォルトの名無しさん:2009/04/07(火) 17:56:15
またおれか
408デフォルトの名無しさん:2009/04/07(火) 18:11:00
またお前らだ
409デフォルトの名無しさん:2009/04/08(水) 00:18:18
>>403
ゆとり、って奴ですか?
410デフォルトの名無しさん:2009/04/08(水) 16:51:10
は?
411デフォルトの名無しさん:2009/04/08(水) 17:58:55
株式会社 ゆとり
412デフォルトの名無しさん:2009/04/08(水) 18:05:15
は?
413デフォルトの名無しさん:2009/04/09(木) 16:22:04
なあブタ共ちょっと教えてくれや
RenderFileで動画読み込んでからGraphBuilderとかを破棄せずにまた
RenderFileで読み込んでもいいのか?ああん?
414デフォルトの名無しさん:2009/04/09(木) 16:54:58
ブヒヒ
415デフォルトの名無しさん:2009/04/09(木) 17:29:35
ブタがっ!このブタがああゅ!
416デフォルトの名無しさん:2009/04/10(金) 00:07:53
>>413
大丈夫、OK、全然、ほんとだってwww
417デフォルトの名無しさん:2009/04/10(金) 10:19:39
>>413
いいよ、CPU負荷とか気にしないなら
あ、動画支援機能は1本限定、これ豆知識な

             飛べない豚より
418デフォルトの名無しさん:2009/04/10(金) 10:25:30
>>416-417
おお、きちんとできたぜ!
これいちいちcreateやreleaseしなくていいから早くて最高だぜ!
お前達ブタって知識はないけどたまには役に立つんだんだなwww
419デフォルトの名無しさん:2009/04/10(金) 13:45:09
動画のオープン、クローズを繰り返すと毎回391回目でRenderFileがエラーになるのですが何が原因なのでしょうか?
タスクマネージャのメモリ使用量を見てるとちゃんと開放されてないみたいで、どんどん使用量が増えているので
そこら辺が問題だとおもうのですが、以下のソースでどこがダメですか?

Open( )
{
  // ↑省略
  CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&GraphBuilder );
  GraphBuilder->QueryInterface( IID_IMediaControl, (void **)&MediaControl );
  GraphBuilder->QueryInterface( IID_IVideoWindow, (void **)&VideoWindow );
  CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **)&BaseFilter );
  BaseFilter->QueryInterface( IID_ISampleGrabber, (void **)&SampleGrabber );
  GraphBuilder->QueryInterface( IID_IMediaSeeking, (void **)&MediaSeeking );
  GraphBuilder->AddFilter( BaseFilter, L"Grabber" );
  GraphBuilder->RenderFile( filename, NULL );
  SampleGrabber->SetCallback( (ISampleGrabberCB *)mySGcall, 1 );
  // ↓省略
}
Close( )
{
  MediaSeeking->Release( );
  SampleGrabber->Release( );
  BaseFilter->Release( );
  VideoWindow->Release( );
  MediaControl->Release( );
  GraphBuilder->Release( );
}
420デフォルトの名無しさん:2009/04/10(金) 18:30:00
インタフェースの解放はよさそう。
RenderFileコール時のエラーコード値はいくつ?
421デフォルトの名無しさん:2009/04/10(金) 23:26:17
映像と音声の両方をサンプルグラバで取得したいんですがうまくいきません。
どうしてでしょうか?どちらか片方だけならうまくいきます。
ソースフィルタ→サンプルグラバ(Video)→レンダラ(video)
         \→サンプルグラバ(Audio)→レンダラ(Audio)のように接続しようとしています

// GraphにSampleGrabber Filterを追加
pGraphBuilder->AddFilter(pSampleGrabberFilterV,
L"Sample Grabber(Video)");

pGraphBuilder->AddFilter(pSampleGrabberFilterA,
L"Sample Grabber(Audio)");

// ソースフィルタを追加
IBaseFilter *pSrc;
if (FAILED(hr = pGraphBuilder->AddSourceFilter(fileName, L"Source", &pSrc)))
{
printf("AddSourceFilterに失敗:%d\n", hr);
return false;
}
ConnectFilters(pGraphBuilder, pSrc, pSampleGrabberFilterV);
if (FAILED(hr = ConnectFilters(pGraphBuilder, pSrc, pSampleGrabberFilterA)))
{
printf("ConnectFiltersに失敗:%d\n", hr);
return false;
}

//NullRendererフィルタを生成、挿入
CoCreateInstance(CLSID_NullRenderer,NULL,CLSCTX_INPROC,IID_IBaseFilter,(LPVOID *)&pNullRendererV);
CoCreateInstance(CLSID_NullRenderer,NULL,CLSCTX_INPROC,IID_IBaseFilter,(LPVOID *)&pNullRendererA);

ConnectFilters(pGraphBuilder, pSampleGrabberFilterV, pNullRendererV);
ConnectFilters(pGraphBuilder, pSampleGrabberFilterA, pNullRendererA);
422デフォルトの名無しさん:2009/04/21(火) 15:02:53
遅レスですが。
どこでエラーが起きてるんでしょうか?
エラーコードは?
423デフォルトの名無しさん:2009/04/22(水) 13:06:44
教えて下さい。
ほとんど全くのDirectShow初心者です。
ビデオ編集ソフトを作りたいと思っています。
そこで、複数のビデオを合成するトランジションフィルターみたいなものを
作りたいのですが、Sample Grabberみたいなものを使って、それぞれ1フレームずつ
持ってきて、例えばα合成してやるみたいな方法が一般的なのでしょうか?
それとも、2つを入力を持つトランジションフィルタを作って、グラフでつないで
レンダリングして終わり?
速度的に前者は厳しいように思いますが、フィルターの形で実装しないで済む分、
作りやすいのかなと思ったり。
どういう実現方法が一般的でしょうか?
424デフォルトの名無しさん:2009/04/22(水) 13:18:56
>>423
あれこれ一からココで教えるのもナンなので、このスレでも何度か名前が挙がっている
とりあえずDES(DirectShow編集サービス)についてお勉強するとよろしいかと。
ttp://msdn.microsoft.com/ja-jp/library/dd148668.aspx

"DirectShow DES"でググるだけでもアルファブレンディングのサンプルを
公開しているサイトに行き当たりますが、まずはDirectShowを使って
多少なりともプログラムが書けるようになってからの方が理解しやすいでしょう。
425デフォルトの名無しさん:2009/04/22(水) 13:30:26
>>424
すばやいご回答、有難うございます!!
勉強します!!
426デフォルトの名無しさん:2009/04/22(水) 14:31:50
たびたびすみません。
DESのサンプルを見ようと思い、色々探したんですが、
DirectShowって、今はDirectX→Platform SDK(Windows SDK)に移動してますよね?
DESのサンプルは、DirectX 9.0 Extrasのものでいいのでしょうか?
427デフォルトの名無しさん:2009/04/22(水) 14:54:48
>>426
基本的にはExtrasでも問題ないと思うけど、VisualStudio 2005以降でのコンパイルでひっかかった気がする。
手作業で修正すればいいと思うけど。

たしかWindows SDKにも収録されてたと思うんだけどなあ、なかった?
この辺とか(↓)

Windows SDK 6.1(英語版)
ttp://www.microsoft.com/downloads/details.aspx?FamilyID=f26b1aa4-741a-433a-9be5-fa919850bdbf&DisplayLang=en

Windows SDK 6.0.6000(日本語版)
ttp://www.microsoft.com/downloads/details.aspx?FamilyID=7614FE22-8A64-4DFB-AA0C-DB53035F40A0&displaylang=ja


Windows 7対応で 7.0.7000.0.4011 ってのがでてるねえ・・・。
428デフォルトの名無しさん:2009/04/22(水) 15:07:08
どもども。
VS2008ではコンパイル通らなかったです。
Windows SDKの中を探したのですが、見つからず...orz
もうちょっと探してみます。
有難うございます!!
429デフォルトの名無しさん:2009/04/23(木) 23:55:43
C#からDirectShowを使って動画を表示するソフトを作成しているのですが、
再生中の動画上に文字をオーバーレイする方法がわからず苦慮しています。
再生自体は下記のページと同じようなやり方で行っているのですが、
お知恵を貸してください。よろしくお願いします。
ttp://www.independence-sys.com/weblog/item/88
430デフォルトの名無しさん:2009/04/24(金) 00:09:01
DirectShow.Netに丁度良いサンプル込みであるよ
431デフォルトの名無しさん:2009/04/24(金) 01:33:37
>>430
サンプルのDxTextが使えそうです。
どうもありがとうございました!
432デフォルトの名無しさん:2009/04/26(日) 04:21:26
わけもわからずサンプルをつぎはぎしながらC#で動画プレーヤーを作ってます。

現在、ActiveMovie Windowという子ウインドウで動画が再生できるとこまで来ました。
そのウインドウがアクティブの状態でキーボードから再生や停止やらの操作をしたいと
思うのですが、キーダウンのイベントをどう設定すればいいのかわかりません。

IVideoWindowのput_MessageDrainでForm1.Handleを指定してはみたのですが
キーボード入力を転送してくれるものの、子ウインドウを移動させようとしても
親ウインドウが代わりに動いたりするので困ってしまいます。

ActiveMovie Windowに対するキーダウンイベントのやり方、
もしくはMessageDrainでキー入力だけ転送するようなやり方を
どなたかご教授ください。
433デフォルトの名無しさん:2009/04/26(日) 06:27:36
引き続き質問なのですが、一部のWMVファイルが自作プレーヤーで再生できません。

再生できないファイルの音声コーデックは
Windows Media Audio 9.1 Professional 192 kbps, 48 kHz, 2 channel 24 bit 1-pass CBR
となっています。自作プレイヤー以外では問題なく再生できています。

ちなみに、下記の記述をすっとばすと音声なしの状態でファイルの再生が可能です。

IBaseFilter audioFilter = (IBaseFilter)new DSoundRender();
hr = m_FilterGraph.AddFilter(audioFilter, "DirectSound Renderer");
IPin pinOut = DsFindPin.ByDirection(sourceFilter, PinDirection.Output, 0);
hr = m_FilterGraph.RenderEx(pinOut, AMRenderExFlags.RenderToExistingRenderers, IntPtr.Zero);
Marshal.ThrowExceptionForHR(hr);

自作プレーヤーは、DirectShow.NetのサンプルのDxPlayを元に作ってます。
DxPlayというサンプルは画面キャプチャができるけど音声がならなかったのでその辺のソースを
上記の記述のように貼り付て偶然、音がなるようになりましたが理屈は微塵もわかりません。
434432:2009/04/26(日) 07:02:42
>>433の質問変えたほうがいいかもと思い直しました。

DirectShow.Net の Samples\Players\DxPlay で音声を
ちゃんと再生するにはどう記述すればよいのでしょうか?

自分はjavascriptくらいしかまともに触ったことがなく
C++のソースを参考にC#に直すことができません。
IntPtrって何?hrって変数は何してるの?という調子で
C#初心者の自分にはDirectShow.Netはさっぱりです。

それと、>>432の件ですがSetWindowForegroundで常に
最前面に表示させることで中途半端に自己解決しました。
435デフォルトの名無しさん:2009/04/26(日) 22:44:00
PlayWndを元に作った方がいいんじゃないか。

>>434
DirectShowのドキュメントと相互運用マーシャリングのドキュメントを一通り読んだほうがいいよ。
436432:2009/04/27(月) 08:15:49
PlayWndのほうが実用的なカタチにととのっており
ずっと構造も簡単でそうしたかったのですが
PlayWndで静止画保存ができませんでした。

DirectShow.Net以外に静止画保存の手段があれば
というか、せめてNETでまともにDirectXが扱えてれば
ド素人が苦労しなくて済むのに…
437デフォルトの名無しさん:2009/04/27(月) 11:19:49
とりあえずC#ちゃんと書けるようになってから愚痴れよ・・・
438デフォルトの名無しさん:2009/05/15(金) 11:02:29
再生してるAVIの特定の1フレームから
短形を切り出してアルファ付きのtgaファイルとして保存したいのですが
どうやったら良いのでしょうか?
439デフォルトの名無しさん:2009/05/15(金) 11:10:14
ggrks
440デフォルトの名無しさん:2009/05/15(金) 11:40:18
短形ってナニよ?思わずググってしまった。


とりあえずDirectShowにビットマップ保存をする単純なサービスはない。
もしまだググってないならとりあえずココでも見てみよう。
ttp://www.geekpage.jp/programming/directshow/samplegrabber.php

TARGAに落とすとなるとさらに面倒だよ。
VMR9のレンダーレスモードにしてD3DXのサービス関数でTARGAに落とすとか?
32ビットBMPで保存してオフラインでBMP→TARGA処理する方が楽そうだな。


あ、.NETでヤルってのも楽そうね。(Image型を使う)
441デフォルトの名無しさん:2009/05/15(金) 14:08:47
>>439
ありがとうございます
参考にしながら頑張ってみる
442デフォルトの名無しさん:2009/05/28(木) 11:58:51
動画再生時に音声だけを遅らせて再生することはできますか?
443デフォルトの名無しさん:2009/05/29(金) 14:20:37
nullnullフィルタを元にカスタムフィルタを作りたいと思っています。
IGraphBuilder::AddFilter で キャプチャデバイスと nullnull フィルタを
追加しておいてから、ICaptureGraphBuilder2::RenderStream すると
問題なく終了するのですが、nullnullフィルタを RenderStream の後に
追加して、IGraphBuilder の Disconnect と Connect で挿入すると
デバッグモード終了時に、nullnull.axに3オブジェクトがアクティブで
残っていると出ます。参照カウント管理が不正なためだと思うのですが
Disconnect と Connect でフィルタを挿入しているサンプルがどこかに
ありましたら教えてもらえませんでしょうか?
444デフォルトの名無しさん:2009/05/29(金) 15:13:53
>短形
矩形じゃねーの?
だとしてもどうして短形になったのか…
445デフォルトの名無しさん:2009/05/29(金) 15:19:28
>>444
質問と関係ないレスならしないでほしい。ウザ杉
446443:2009/05/29(金) 18:26:57
自己レスです
IPin::QueryPinInfo で取得した PIN_INFO の pFilter を Release していませんでした
お騒がせしました
447デフォルトの名無しさん:2009/05/29(金) 18:31:09
2週間も前のレスに今さらレスするとかもうね。しかもどうでもいい内容だし

>>443
サンプル中をDisconnectやConnectで検索はしてみたの?
・・・と思ったら解決していた
448デフォルトの名無しさん:2009/05/30(土) 21:58:15
現在、SDKは最新の(多分)Microsoft Windows SDK v6.1、Microsoft DirectX SDK(March 2009)、VisualStudio2005 pro という環境で、DirectShowを試しています、
ISampleGrabber インターフェイスっていうのがありますが、MSDNを読みますと
http://msdn.microsoft.com/ja-jp/library/cc369550.aspx
ヘッダー : Qedit.h をインクルードすること。このヘッダー ファイルは、バージョン 7 以降の Microsoft® Direct3D® ヘッダーとは互換性がない。
ライブラリ : strmiids.lib を使うこと。
との記述があります。
最新のSDKでは、ISampleGrabberインターフェースは無くなってしまったのでしょうか、または互換性のある、関数が定義されていうのでしょうか?詳しい人教えてください。
449デフォルトの名無しさん:2009/05/31(日) 03:25:58
あんま詳しくない俺が答えてもいいかい?

qedit.hでググるとわかるが、そのまま#includeしてもエラーがでて使えないってだけ。
詳しくは自分で調べてくれ
450デフォルトの名無しさん:2009/05/31(日) 06:17:59
>>449Thx、その件の対応は下記urlを参考に行い、エラーは出ていないが
ttp://social.msdn.microsoft.com/forums/en-US/windowssdk/thread/ed097d2c-3d68-4f48-8448-277eaaf68252/
こうしとけば、OKってこと?

451デフォルトの名無しさん:2009/05/31(日) 07:21:39
どのレスを参考にしたかわからないけど、どの方法でも大丈夫そうだからOKだと思う

というか、なぜわざわざ英語を。英語得意じゃないんだから困った
MSDNか。公式フォーラムだからか。
452デフォルトの名無しさん:2009/05/31(日) 10:03:08
>>451Thx
そうそう、公式フォーラムだったんで、俺も英語あまり良く分からないけど、参考にしました。
そして、やってみました
To compile qedit.h you must install the DirectX 9 SDK, to obtain the dxtrans.h header.
マニフェストをリソースにコンパイルしています...
Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
Copyright (C) Microsoft Corporation. All rights reserved.
との結果です、要約すると、コンパイラが、DirectX 9 SDKをインストールして、dxtrans.h もインクルーズしているような意味合いですね。
qedit.hの498行でコメントアウトして外したdxtrans.hをインクルーズするなんて、複雑な仕組みですよね??
COMの事をあまりよく知らないので、昨日からDirectShowのライブラリィを作っています、こんな調子で今日中にできるかな(^^;
453デフォルトの名無しさん:2009/06/02(火) 20:18:07
GraphEditを使って、USBカメラのデータを、ASF形式で出力しWMPで見たいのですが、手順を教えてくださいませ。
454デフォルトの名無しさん:2009/06/12(金) 17:08:38
VB.NETでDirectShowで動画を再生しながら
他の処理も行っていると動画が遅くなります。
しかし他の処理の中でDebug.Writelineで
イミディトウィンドウに文字を出し続けていると
動画が遅くならない謎の現象になっています。
これだとリリース出来ません。なにか知っている人が
いたら教えてもらえないでしょうか?
455デフォルトの名無しさん:2009/06/12(金) 17:17:41
再生を別スレッドに別けるとか
456454:2009/06/15(月) 12:33:45
455さんお返事ありがとうございます
別スレッドの中でWhileでDoEventsを呼び続けると
なんとかなりそうでした。まだわかりませんが。
全体の処理時間は少し遅くなりました。
457デフォルトの名無しさん:2009/06/24(水) 13:54:47
DirectShow編集サービス(DES)で、ファイルへレンダリング出来なくて困ってます。
流れ的には以下の様な感じで、Runの後にWaitForCompletion()内で例外発生。。

・IRenderEngineをCoCreateInstance()で作る。
・pRenderEngine->SetTimelineObject()でTimelineをセットする。
・pRenderEngine->ConnectFrontEnd()呼び出し
・ICaptureGraphBuilder2をCoCreateInstance()で作る。
・pRenderEngine->GetFilterGraph( &pGraph );
・pBuilder2->SetFiltergraph(pGraph);
・pBuilder2->SetOutputFileName(&MEDIASUBTYPE_Avi..)で出力先指定
・TimelineのGroupのOuputPinを、Builder2でRenderStream()
・IMediaEvent、IMediaControl取得
・Run()
・IMediaEventのWaitForCompletionで、例外発生...orz

ウィンドウへのレンダリングは成功しています。

最終的にはスマートレンダリングしたいのですが、ISmartRenderEngineの
使い方がほとんど資料が無くて困っています。
458デフォルトの名無しさん:2009/06/25(木) 16:05:52
1フレーム毎の音声データを取得する方法をおしえてください
459デフォルトの名無しさん:2009/06/26(金) 00:04:24
>457
うろ覚えで役に立つか分からんけど…
・直接RenderStreamへ接続したら駄目だったはず。(MUXが必要。)
・Timelineを生成するまでの各段階でのエラー判定で色々悩まされた記憶がある。
460デフォルトの名無しさん:2009/06/26(金) 15:39:02
>>459
ありがとうございます。
DESは資料が少なくて困りますよねー。
またよろしくです。
461デフォルトの名無しさん:2009/07/08(水) 11:02:38
ファイルの変換をしたい。
ICaptureGraphBuilder2::SetOutputFileName()って、MUXを返すけど、
任意のMUXを指定したい場合は、どうするのかな?
AddFilterでMUXとSinkを設定するの?
462デフォルトの名無しさん:2009/07/09(木) 00:58:42
DirectShowでフィルタを作っているんですが、
フィルタを生成時にモーダレスダイアログを表示するサンプルありませんか?
アプリではないため親ウィンドウが存在せず、
hWndも取れないしインスタンスハンドラも取れないもんでやり方ちょっと難しいっす。
463デフォルトの名無しさん:2009/07/09(木) 01:12:59
>>462
コンストラクタかCreateInstanceかQueryInterfaceかでモードレスダイアログを
作るなりポップアップするなりすればいいんでないの?

もしかしてプロパティページの実装の仕方を聞いてる?
464デフォルトの名無しさん:2009/07/09(木) 01:16:47
普通にそのスレッドでメッセージループ作って回せば?
窓の作り方知っていれば特に難しい事でないけど。
465デフォルトの名無しさん:2009/07/09(木) 01:31:07
プロパティページではないです。ちなみにプロパティページは楽に作れます。

こんすとらくたでモーダレスダイアログ作りたい。

ですが、いまいちわからず…
デスクトップからハンドラ引っ張ってメッセージループ処理に飛ばそうとして失敗しました。
そこで参考サイトをみて見比べようと思った次第です
466デフォルトの名無しさん:2009/07/09(木) 10:12:12
メッセージループ処理はどう書いてますか?
ウインドウは作れてるけどウインドウを
うまく動かせないとかなら、
メッセージループ処理に問題があるかもしれない。

もう少し問題点を詳しく書いてみたら?
467デフォルトの名無しさん:2009/07/09(木) 12:18:57
DirectShow編集サービスでTimelineをMPEG2でレンダリング出力したいのですが、うまく出来ません。
ICaptureGraphBuilder2::RenderStream()に、MPEG2のエンコーダーを指定してます。
Muxは、最初はSetOutputFileName()で返ってきたのを使っていましたが、エラーとなったため、
MPEG2のMuxerとMPEGのFileWriterを作り、2つのピンを繋いで、そのMuxを渡していますが、
やっぱりRenderStream()でE_FAILが返ってきます。
Encoder、Muxer、FileWriterは、GraphEditで繋いで動くのは確認しています。
468467続き:2009/07/09(木) 12:20:03
IRenderEngine* pRenderEngine; 事前に作ってあります
ICaptureGraphBuilder2* pBuilder2; 事前に作ってあります

pRenderEngine->SetTimelineObject( pTimeline );
pRenderEngine->ConnectFrontEnd();

IGraphBuilder* pGraph;
pRenderEngine->GetFilterGraph( &pGraph );
m_pBuilder2->SetFiltergraph(pGraph);

// File Writer作成
CComPtr<IBaseFilter> DS_FileWriter;
CComPtr<IFileSinkFilter> DS_FileSink;
DS_FileWriter.CoCreateInstance(CLSID_MpegFileWriter);
DS_FileWriter.QueryInterface<IFileSinkFilter>(&DS_FileSink);
DS_FileSink->SetFileName(L"c:VideoTest.mpg", NULL);
pGraph->AddFilter( DS_FileWriter, L"MPEG File Writer");

// Mux作成
CComPtr<IBaseFilter> DS_Mux;
DS_Mux.CoCreateInstance(CLSID_MPEG2_Muxer);
pGraph->AddFilter( DS_Mux, L"MPEG2 Muxer");

// ピン接続
CComPtr<IPin> p, pin;
DS_Mux->FindPin(L"Output", &p);    // Muxerの出力ピン
DS_FileWriter->FindPin(L"Input", &pin);// Writerの入力ピン
pGraph->Connect(p, pin);        // ピン接続

(続く)
469467続き:2009/07/09(木) 12:21:43
// グループ内をループし、出力ピンを取得する。
long NumGroups;
pTimeline->GetGroupCount(&NumGroups);
for (int i = 0; i < NumGroups; i++)
{
    IAMTimelineGroup* pGroup = NULL;
    pTimeline->GetGroup((IAMTimelineObj**)&pGroup, i);
    IPin *pPin;
    if (pRenderEngine->GetGroupOutputPin(i, &pPin) == S_OK)
    {
        CComPtr<IBaseFilter> DS_Compressor;
        if(i == 0){
          // Videoグループ用のコンプレッサフィルタを作成する。
          DS_Compressor.CoCreateInstance(CLSID_MPEG2_Compressor);
        }
        // ピンを接続する。
        hr = m_pBuilder2->RenderStream(NULL, NULL, pPin, DS_Compressor, DS_Mux); ←これがE_FAIL
        SAFE_RELEASE(pPin);
    }
}
470デフォルトの名無しさん:2009/07/09(木) 13:08:26
DESは使ったことないので見当違いかもしれませんが、
DS_Compressorをフィルタグラフに登録(AddFilter)してないのは問題ないんですか?
471デフォルトの名無しさん:2009/07/09(木) 14:23:02
>>470
それです、それでした!!
とりあえずエラーなしでMPEG2ファイル書き出せました!!
自分でAddFilterしなくちゃダメなんですねー。
有難うございますーm(__)m
472デフォルトの名無しさん:2009/07/10(金) 01:23:12
質問です
DirectShowでGeekなページを参考に動画再生をするプログラムを作りました
http://www.geekpage.jp/programming/directshow/change-rate.php
参考URLでは『put_Rateの引数を2.0などに変更すると倍速再生になります。
put_Rateの引数に負の値(マイナスの値)を渡すと巻き戻し再生になります』
とありますが、

put_Rateの引数を負の値にしても大部分のフィルタは逆再生をサポートしていないため実行されません。

そこでIMediaSeekingかIMediaPositionを用いて巻き戻しをするプログラムを作りたいのですが、
どうすればよいのやら困っています。
何か良い考えはないでしょうか?
是非知恵をおかしください!
473デフォルトの名無しさん:2009/07/10(金) 02:03:09
DirectShowのスレでも質問したのですが、スレの勢いを考えてこちらにも質問させていただきます。

DirectShowでGeekなページを参考に動画再生をするプログラムを作りました
http://www.geekpage.jp/programming/directshow/change-rate.php
参考URLでは『put_Rateの引数を2.0などに変更すると倍速再生になります。
put_Rateの引数に負の値(マイナスの値)を渡すと巻き戻し再生になります』
とありますが、

pMediaPosition->put_Rate(0.5);
のput_Rateの引数を負の値にしても大部分のフィルタは逆再生をサポートしていないため実行されません。

そこでIMediaSeekingかIMediaPositionを用いて、または用いなくてもいいのでdirectshowで
動画の巻き戻しをするプログラムを作りたいのですが、どうすればよいのやら困っています。
何か良い考えはないでしょうか?
是非知恵をおかしください!
474デフォルトの名無しさん:2009/07/10(金) 02:04:06
誤爆しました。すみません
475デフォルトの名無しさん:2009/07/10(金) 04:43:47
どんな動画をどんな風に逆再生するのかわからんけど
自前で逆再生をサポートしたフィルタを作成するか、
適当に逆方向にシークさせていくかぐらいしかないんじゃない?

てかマルチポスト・・・
476デフォルトの名無しさん:2009/07/10(金) 10:41:06
Pause状態にしておいて、10秒、9秒、8秒…てな感じにシークしていけばいいんじゃない?
逆方向再生をサポートしてない限りスムーズには出来ない。
477デフォルトの名無しさん:2009/07/10(金) 11:19:00
なぜ「大部分のフィルタは逆再生をサポートしていない」のかよく考えてください。
キーワードは「MPEG」「フレーム間予測」・・・

これらを理解した上で、あなたならどのように逆方向再生を実現しますか?
たぶんMPEG系ではTIME_FORMAT_FRAMEが使えないので、
1枚ずつシークとか難しいと思います。
478デフォルトの名無しさん:2009/07/10(金) 14:11:33
MPEGならSBE以外でもビデオアナライザフィルタは使えるのかな。
使えてもかなりガックリな結果しか得られないけど。
479デフォルトの名無しさん:2009/07/10(金) 19:57:34
>>466
未だフィルタでモーダレスダイアログを表示するプログラムが出来ない
ので教えてください。

詰まっている箇所はインスタンスハンドルの取得だと思います。

コンソールアプリにて以下のソースでダイアログが表示することを確認。
main()
{
printf("ddd");

g_hDlg = CreateDialog( NULL, (LPCTSTR)IDD_DIALOG1, NULL,(DLGPROC)DlgProc);
ShowWindow( g_hDlg, SW_SHOW );

}

これをそのままDirectShowサンプルのNULLフィルタに移植
CNullNull::CNullNull(TCHAR *tszName, LPUNKNOWN punk, HRESULT *phr)
: CTransformFilter(tszName, punk, CLSID_Algorithm)
{
g_hDlg = CreateDialog( NULL, (LPCTSTR)IDD_DIALOG1, NULL,(DLGPROC)DlgProc);
ShowWindow( g_hDlg, SW_SHOW );
}
すると「g_hDlg」は0になりメッセージループ処理には飛びません
480デフォルトの名無しさん:2009/07/11(土) 00:32:58
そんだけわかってなんで、リファレンスを読まないの?
NULLって何?アフォ?
そしてスレ違い
481デフォルトの名無しさん:2009/07/11(土) 01:19:00
>>480
反応ありがとうございます。
コーディングする前からDirectShowフィルタでの
インスタンスハンドルの取得方法を悩んでいました。

CreateDialogの3つめの引数NULLの
hWndはデスクトップを親にするために0でいいと思う。

1つめの引数はインスタンスハンドルを書けばいいのですが
何を書いたらよいかわかりません。

普通WinAPIではWinMainの引数として与えられていたり
GetWindowLong、GetModuleHandleなどで取得できます。
しかしFilterでは出来ないのです。

よかったら取得方法を教えてください。
482デフォルトの名無しさん:2009/07/11(土) 01:23:23
IDD_DIALOG1 のあるモジュールのハンドルに決まってるだろ。
483デフォルトの名無しさん:2009/07/11(土) 09:27:25
>>482
IDD_DIALOG1 のあるモジュールのハンドル

これがわかりません。
IDD_DIALOG1はフィルタ自身が持っています。

メッセージボックスやオープンCVの窓は表示出来る。なんでダイアログが上手くいかないんだろう
484デフォルトの名無しさん:2009/07/11(土) 10:43:05
たしかdllmainの引数に入ってるからそれをどっかに保存すればいい

正直フィルタにダイアログを生成させる仕様から考え直したほうがいいと思うけど
485デフォルトの名無しさん:2009/07/11(土) 14:30:36
>>484
ありがとう。確認してみます。
仕様についてはデバッグ用であり、グラフエディット上でパケットモニタしたいと考えてました。
フィルタで枠実装しておけばアプリケーションで問題あっても容易にデバッグできるから…
486デフォルトの名無しさん:2009/07/13(月) 12:06:25
質問です。

ハードディスク上ではなく、メモリ上に(ごく小さい)AVIファイルを読み込んでから
再生させたいと思っているのですが、ソースフィルタには何を使えば良いでしょうか?
もしくは、IGraphBuilder::RenderFile()で直接メモリを指定する方法などは
ありますでしょうか?
487デフォルトの名無しさん:2009/07/13(月) 12:42:37
http://msdn.microsoft.com/ja-jp/library/cc354489.aspx
これの互換フィルタ作ればいい
488486:2009/07/13(月) 13:18:35
>>487
それを見てMemFileってサンプルがあったのを思い出しました。
多分それを使えばOKです。
どうもありがとうございました!
489デフォルトの名無しさん:2009/07/17(金) 15:56:39
自分のウィンドウ内に再生表示したいのだが、
IGraphBuilder::put_Owner()が、E_NOINTERFACEを返して来て、
別のウィンドウが開いてしまう、何故だろう?

hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, reinterpret_cast<void **>(&pGraphBuilder));
hr = pGraphBuilder->QueryInterface(IID_IVideoWindow, (LPVOID *)&pVideoWindow);
hr = pVideoWindow->put_Owner((OAHWND)hWnd); <- E_NOINTERFACE

hWndは、自分(Dialog)のハンドル。
490デフォルトの名無しさん:2009/07/17(金) 16:15:59
BDAチューナからの生(MPEG2-TS)データを取得するアプリを作成したく、graphedtで
試行錯誤してます。(DirectShow初挑戦)

まず、グラバを作成する代わりに"Infinit Pin Tee"+"Dump"(SDKのサンプル)を用いて
DVB-S Network Provider
 ↓
DVB-S Tuner
 ↓
DVB-S Capture
 ↓
Infinit Pin Tee → Dump → ファイル
 ↓
MPEG2 Demultiplexer
 ↓
BDAMPEG2 Transport Information Filter
の構成で、生TSデータを(ファイルに)取得するところまではできました。
が、ここで問題発生。記録したデータを見ると、所々でデータが欠落しています。
一度Runした後に"MPEG2 Demultiplexer"/"BDAMPEG2 Transport Information Filter"
を削除してRunすれば、欠落の無いデータが録れることから、これらの処理が重く
Captureからの出力がブロックされデータが失われているのではないかと予想して
います。

アドバイスいただきたいのは、
(1) 欠落原因の確認のため、CaptureとTeeの間にバッファリング(FIFO)してくれる
ようなフィルタを入れたいが、既存の物で何か良い物は無いか?
(2) 以上全体を通して、間違いやもっと良い方法は無いか?
の2点です。

よろしくお願いいたします。
491デフォルトの名無しさん:2009/07/17(金) 16:22:50
>>489
普通はレンダラから、IVMRWindowlessControl や IVMRWindowlessControl9 で設定する。
492デフォルトの名無しさん:2009/07/17(金) 23:55:12
>>490
そもそもTeeを通さず直接Dumpして欠落無いか確認した?
493490:2009/07/18(土) 00:18:46
>>492
Demultiplexer/Transport Information Filterが無いとチューニングが行えない(「Microsoft統合
チューニングモデル」参照)ため、Dumpを接続するには必ずTeeが必要になります。
いったんチューニングが行われた後、Demultiplexer/Transport Information Filterを削除する
とデータ欠落が無くなるのは前記のとおり確認しています。(これが「Teeを通さず直接Dump」
と実質的に同じ状態と思われます。)
494デフォルトの名無しさん:2009/07/18(土) 00:59:10
あとはGraphEditじゃ無理だろうがDemux通したあとのPID指定したのをDumpするとか。
495デフォルトの名無しさん:2009/07/19(日) 01:11:24
スレ違いかもしれないのですが

デコードされた、PCM(5.1ch)を、PCM(2ch)*3に分割すうような
動作をするフィルターを探しています。

用途は、ステレオ*10の出力はあるけど、5.1ch出力は出来ない
オーディオカードから5.1chを吐かせたいのです

何かよいフィルタ(スプリッタ?)はごぞんじないでしょうか?
496デフォルトの名無しさん:2009/07/19(日) 01:38:29
スレ違で、しかもやろうとしている事の意味がわからない。そんなへんてこストリームを再生してもまともな音響にならないと思うが・・・。
仮にpinを3つに分岐させたとして、どうやってレンダラに繋ぐんだ?
ステレオ*10ってのがまず謎だ。
497デフォルトの名無しさん:2009/07/19(日) 01:50:08
ffdshowフィルタを使ったプログラムをくみたいのですが、
フィルタの作り方わかる方、教えてください。

まずこれ↓をやりたいのですが・・・
input.avi -> スプリッタ -> ffdshowデコーダ -> ffdshowエンコダ ->mux ->out.avi
498デフォルトの名無しさん:2009/07/19(日) 02:03:45
>>497
フィルタの作り方、っていうのが何か勘違いされているような・・・
とりあえずGraphEdtで自分のやりたいことができてますか?
499497:2009/07/19(日) 02:09:44
>>498
GraphEditではできています。
それをプログラム上で再現したいのですが、CLSIDなど
どう設定してよいかがわかりません。
500デフォルトの名無しさん:2009/07/19(日) 02:15:38
>>496
レンダラを
ステレオ1,ステレオ2,ステレオ3
に割り振るだけだと思うのですが

http://www.m-audio.jp/products/jp_jp/Delta1010LT.html
http://www.synthax.jp/fireface-800.html
http://www.musetex.co.jp/index.php?option=com_content&task=blogcategory&id=2&Itemid=338


こういう、ステレオ出力が10系統とか15系統ついている奴です
あと、後段でディレイをかけるので問題はないです


501デフォルトの名無しさん:2009/07/19(日) 13:27:21
>>497
既存のフィルタを組み合わせるだけならフィルタを作る必要は無い

なんにせよ大体のことは>>2あたりを見るだけで事足りる
それでもわからないことがあったらまた聞きにきな
502497:2009/07/19(日) 14:08:05
>>501 ありがとうございます。

一応、ここ↓を参考にして、
ttp://geocities.yahoo.co.jp/gl/akt_trade/view/200906

このようにコーディングしてみたのですが、
CoCreateInstance(CLSID_FFDSHOW, NULL,CLSCTX_INPROC_SERVER, IID_IffDecoder, (void**)&iff);
ヘッダはどうしたらよいのか・・・・
そもそもこのコードがあっているのでしょうか?
503デフォルトの名無しさん:2009/07/19(日) 15:11:26
>>502
そのページには
>この辺は、海外のffdshowのソース?みたいなところを漁ったら出てきます。(ライセンス的にどうなのかはわかりません)
って書いてあるからどうやらヘッダはffdshowのソースからとってきてるみたい
使うならちゃんとライセンス確認してから使うこと
ただffdshowっていろんなバージョンがあったと思うけど互換性は大丈夫なのかな
504497:2009/07/19(日) 15:36:47
>>503 なるほど、ありがとうございます。
もう少し調べてみます。

普通、ffdshowのフィルタはプログラム上からはあまり使わない感じなんですかね?
505デフォルトの名無しさん:2009/07/19(日) 17:52:17
>>504
というよりもエンコーダ/デコーダを特定のものに固定することが少ないんじゃないかな
ffdshow固有の機能を使いたいというなら別だけどね

そうでなくて単にAVIを変換したいというだけならこことか見てみるといいかも
AVI ファイルの再圧縮
ttp://msdn.microsoft.com/ja-jp/library/cc370561.aspx
506497:2009/07/19(日) 22:19:55
>>505 ありがとうございます。
考えていたのはaviファイルをリサイズ、音量操作などをしてから再圧縮保存したいと考えていたので
多機能のffdshowをプログラム上で使えれば楽かなっと思っていました。
507デフォルトの名無しさん:2009/07/19(日) 22:37:00
編集フィルタ標準であるやん
508497:2009/07/19(日) 23:37:59
>>507 本当ですか? 調べなおしてみます・・・
509デフォルトの名無しさん:2009/07/21(火) 12:46:44
>>491
Thanks!
510デフォルトの名無しさん:2009/07/27(月) 00:30:28
キャプチャデバイスからの映像を再生するアプリを作っているのですが、
開発が進むにつれて、ブルースクリーンになってOS毎落ちるようになりました。

フィルタ群を一度切り離して、キャプチャデバイスやVMRを切り替えて再度接続する、
という動作をさせるようにしてから落ちるようになりました。(何度か繰り返していると起こる)

原因としては何が考えられそうでしょうか??
はっきりは分からなくても、怪しく感じるところでも良いので、ご助言お願いします。

ピンのアロケータのデータがうまく解放されていないのでしょうか?
また、それを確認もしくは解消する術はあるのでしょうか?

[ 落ちるときの詳細 ]
1. グラフを停止
  ( pMediaControl->Stop() )
2. AVIデコンプレッサや色空間フィルタ、VMRのピンを切断
3. キャプチャデバイスと繋がっているスマートティーフィルタを削除
  ( pGraphBuilder->RemoveFilter( xxx ) )
4. キャプチャデバイスをグラフから削除
  ( pGraphBuilder->RemoveFilter( xxx ) )
5 キャプチャデバイスをグラフに追加
  ( pGraphBuilder->AddFilter( xxx ) )
6. フィルタグラフを再構築
  ( pGraphBuilder->RenderStrem( xxx ) )
7. ビデオ転送矩形を設定
8. グラフを再生
  ( pMediaControl->Run() )
511デフォルトの名無しさん:2009/07/27(月) 01:55:00
再生側でOS落ちるのはレアだから、ソースフィルタ側のドライバの問題でない?
テンプレート使っていないなら、参照カウンタあたりが怪しいけど。
破棄されているのに、更にReleaseしてアドレスがたまたま有効なために不正にコードが実行されてしまったケースを想定。
チェックが甘い実装だとこのケースで落ちそうな気がする。
512510:2009/07/27(月) 02:14:56
>>511
ありがとうございます。

>ソースフィルタ側のドライバの問題でない?
その可能性もあると思います。
使っているキャプチャボードがIntensityProとSAA7103-TVPCIなのですが、
IntensityProのほうはドライバがあまり安定していないという報告をよく聞きますし。

>破棄されているのに、更にReleaseして
一応、以下のようなSAFE_RELEASEマクロでそういったことが起こらないよう心がけています
SAFE_RELEASE( x ) { if( x ) { ( x )->Release(); ( x ) = NULL; } }
しかし、Releaseし忘れの恐れは残りますが・・・(慎重にチェックはしているものの(汗))

もう一つ、少し心配なのが、>>510の3番のスマートティーフィルタのフィルタグラフからの削除です。
このスマートティーはインテリジェント接続により生成されるもので、
基本的にはDirectShow側で生成、解放等の管理をしてくれていると思うのですが、
それに対してアプリ側でRemoveFilterするのは問題ないのだろうか?と・・・

しかし、>>511さんのご意見通り、ドライバの問題が有力な気がします。
もう一枚キャプボがあるので、怪しいIntensityProを外して他の2枚で切替を行うテストをして、
問題がないかを試してみようと思います。
ドライバのせいにできれば、アプリ作成者側としては気が楽になりますので期待してます(笑)

どうもありがとうございました。
513デフォルトの名無しさん:2009/07/27(月) 03:52:51
CComPtrとかで参照を自動化してやると間違いが起きないぜって話
514510:2009/07/28(火) 00:37:34
よく調べてみると、参照カウントが予想外の挙動をしていました。

例えば、

pCaptureGraphBuilder->FindInterface( &PIN_CATEGORY_CAPTURE, 0, pCapDev, IID_IAMStreamConfig, ( void** )&pConfig )

として、pConfigの参照カウントを調べてみると、1ではなく、いきなり2や6になったりするんです。

キャプチャデバイスフィルタ(上のpCapDev)も、
pMoniker->BindToObject()では1上がるだけですが、その直後のpGraphBuilder->AddFilterで
3とかになったりしました。

ここらへんが悪さをしていたようで、どうしたものかと思いましたが、
>>513さんが教えてくださったCComPtrに変えたところ、うまくいきました!

CComPtrを使うと、
ttp://www.hamusuta.net/openbbs/pc/prg/wtl.html#msg9
に書いてあるように、使いまわし利用ができず、プログラムが止まります。
これで問題箇所が分かる上、xxx.Release()とすればちゃんと
解放(おそらく参照カウントを必要なだけ複数下げてくれている)してくれます。
この対処をした後はブルースクリーンクラシュは起こらなくなり、安定して動いています。

とてもよい解決策を教えてくださって、ありがとうございました!
515デフォルトの名無しさん:2009/07/28(火) 00:58:01
ReleaseよりNULL入れるほうが安全。
CComPtr以外にBoostでもテンプレートがあったきがす。
最初から入っているCComPtr使うほうが楽だけどね。
516デフォルトの名無しさん:2009/07/28(火) 01:10:54
直接関係ないけど、CComPtrで使いまわす場合はDetachするとよか
517デフォルトの名無しさん:2009/07/28(火) 02:23:30
>>514
いやCComPtr::Releaseは参照カウント一つしか減らさないぞ…。ヘッダファイルにソース書いてあるから読んでみるといい。
まぁ元のプログラムで参照カウントの増減おかしかったのが正しくなったんだろう。
なんにせよCComPtrを使っておくのは正しい対処だ。

>>515
CComPtrにNULL代入するのとCComPtr::Releaseは全く同じことしかやらないような。
518デフォルトの名無しさん:2009/07/28(火) 03:19:00
>>517
NULLの代入とReleaseが同じなのはその通りだけど、
hoge.Release();は、間違えてhoge->Release();としてもコンパイルが通ってしまうから
避けるべきだと>>515は考えているのだと思う。
519デフォルトの名無しさん:2009/07/28(火) 08:29:06
いつからかわからないけど、
CComPtrで ->AddRef と ->Release はコンパイル通らないようになってるよ。
確かVC6の頃は通ってたな。
520510:2009/07/29(水) 01:35:32
ダメです!再びブルースクリーン炸裂です・・・
CComPtrを使う前よりは耐性(?)は増したか・・・と思うと、
再起動直後、数回のデバッグ起動でガチャン・・・
CComPtrを以ってしても敵わないとは・・・恐るべしDirectShow・・・!

>>516
具体的にはどうするのでしょうか??
Detachだと、CComPtrが対象生ポインタの所有権を棄却するだけで、
解放は施されないようですが・・・

>>517
たしかにそうでした(汗)
となると、例の参照カウント異常上昇分を抑え切れてない可能性もありますね・・・

>>519
その通りで、->Releaseのほうはコンパイラに怒られました。

一度、怪しいCOMポインタについては、CComPtrを使わず、ソフト終了寸前に、
参照カウントが0になるまでRelease()を繰り返すといった方法を試してみようと思います。
521デフォルトの名無しさん:2009/07/29(水) 02:11:03
>>参照カウントが0になるまでRelease()を繰り返すといった方法を試してみようと思います。
これはやってはいけない。そもそもAddRedやReleaseの返す値は使用してはいけないルールです。
参照値なんて自分で作ったもの以外は基本的にわからんよ。

再利用すると挙動不審になるデバイスなんでね。破棄して再生成してしまえ。
実行時間が同じくらいなら安定した方法で手抜き実装。
522デフォルトの名無しさん:2009/07/29(水) 07:27:54
BMDSDKだとキャプチャフィルタは削除せずにグラフ変更やっているみたいだから
それに沿ったら?
523デフォルトの名無しさん:2009/08/02(日) 19:39:32
avi(音声あり)とwavファイルを多重化してaviに保存したいのですが、
directshowの既存のフィルタでプログラムできますか?
aviの音声そのままでwavの音声も重ねたいのですが・・・
524デフォルトの名無しさん:2009/08/02(日) 21:26:39
GraphEditで作れるか試せばいいだろ
525510:2009/08/03(月) 07:37:49
>>521
ありがとうございます!
確かに怖いですねw
>実行時間が同じくらいなら安定した方法で手抜き実装。
DirectShowって、フィルタ開発とかを除けば、基本的に時間を気にしないといけないところは
少ないですし、おっしゃる通り、遠回りでも、じじぐさくても、安定するように組むのがセオリーのようですね。

>>522
ありがとうございます!
その方法でやってみました。
はじめは、それでもOS毎落ちる事態は発生していましたが、どうもセットで生成されるスマートティー
を削除するのがよくないようで、これも残すようにし、再接続の際はスマートティー(在れば)から
接続してグラフを構築するようにしたところ・・・ついにブルースクリーンが出ないようになりました!!
何度も再接続を繰り返し、それまでであればほとんど落ちていたような回数でもぜんぜん落ちる
気配がありません。

みなさん、良いご助言を下さり、ありがとうござました!!
526デフォルトの名無しさん:2009/08/07(金) 16:14:48
自分はCanonのHV10っていうDVカメラしか持ってないんですが
IVideoWindow::SetWindowPosition で、ソース画像の1/2以下の
Windowエリアに割り当てると描画しなくなります(SetWindowPosition はS_OKを返します)
その後 SetWindowPosition で再設定しても描画されず、グラフを再作成するしかないようです。
他のDVカメラでも画像の1/2以下に割り当てると同じようなことが起きますか?

Windowリサイズ時に(ソース画像の1/2+1)ピクセル以上に割り当てるようにしていますが
この1/2で他のDVカメラに通用するのかが知りたいです。
527デフォルトの名無しさん:2009/08/07(金) 21:26:16
サンプルグラバについて、
SetOneShot( true )
でワンショットモードにしてから再生しているのですが、
いつまでたってもグラフが停止しません。
(キャプチャデバイスからのライブソースです)

ワンショットモードでは、サンプルを1枚受け取ると、グラフを停止するとmsdnにも書いています。

WaitForCompletion( INFINITE, &evCode );
を挿入し、この関数から返ってくるのを待っても、一向に返ってこず、再生が続いたままになります。

とりあえず、Sleep( 100 )として対応していますが、
このようなことをせず、ちゃんとサンプルの受信が完了したのを確認してから
サンプルを取得できるようにするにはどうすればよいでしょうか??
528デフォルトの名無しさん:2009/08/08(土) 03:19:27
Intensityをお持ちの方にお聞きしたいのですが、
入力設定を「HD 1080 PsF 24」にして、グラフ構築ができるでしょうか?
GraphEditを使ったのですが、自分の場合、どのフィルタも繋がらりません・・・
「接続に必要な中間フィルタの組み合わせが見つかりませんでした。」
のエラーメッセージが出てしまいます。

構築ができる方や、実際にPS3などからの24p出力を取り込められている方が
おられましたら、フィルタグラフの構成を教えてください。

よろしくお願いします。
529デフォルトの名無しさん:2009/08/10(月) 00:56:04
プログラムを終了する際は、すべてのフィルタをグラフから削除(RemoveFilter)すべきでしょうか?
また、そのときは、インテリジェント接続で自動的に生成されたフィルタについても、
アプリ側で検索して削除すべきでしょうか?

削除しなくても問題は(一見)起こっていませんが、行儀よく終わる方法を知りたいと思いました。
530デフォルトの名無しさん:2009/08/10(月) 01:10:00
>>528
メディアサブタイプがHDYCのはずだから、Blackmagic Designe DecoderDMO挟んでみるとか

>>529
自分で追加したフィルタと、グラフを解放するだけで問題ない、はず。
531デフォルトの名無しさん:2009/08/10(月) 11:31:03
>>529
後片付けのためにRemoveFilterを使う必要はない
532529:2009/08/10(月) 12:26:12
>>530
>>531
ありがとうございます!
安心しました。
533528:2009/08/11(火) 07:26:53
>>530
ありがとうございます。
しかし、24fps設定ではBlackmagic Design Decoder (DMO)すら繋がりませんでした(汗)
534デフォルトの名無しさん:2009/08/14(金) 23:40:51
有識者の皆様にご教授願いたいことがあります。

カメラとマイクそれぞれのキャプチャピンから別々にデータを拾って保管しておき、
あとでそれらをプッシュソースフィルタからAVIMUXフィルターで合体させ、AVIファイルを作ろうと思っています。

キャプチャピンから拾うデータはIMediaSampleのデータ(GetPointer)と開始時間と終了時間(GetTime(Start,Stop))です。

問題は、20秒くらいのAVIデータを作成すると、2秒くらい画像が縮んでいることです。
取得時に実時間を画像に描画していますので、それを見ていると、18秒くらいで20秒目の画像まで来てしまいます。
音声は割りと正確に入っていまして、画像が停止した状態から+2秒できっちり20秒ぶん出来ています。

かなりの時間を割いて調べましたが、良い資料にめぐり合いません。
ちなみに、カメラから取ったデータを仮に(AvgTimePerFrame=)10fpsとすると、GetTimeで取得したStartとStopの間は0.1秒ぶん(1000000)ですが、
データとデータの間が必ずしも連続ではありません。1つ目のデータのstopが100000として、次のデータのstartが102000とかだったりします。(本当は100000が理想ですよね)
ですので、10フレーム分のデータの最初のstartから最後のstopまでが1秒以上になっているようです。(カメラがコマ落ちしているようです。)

(長くなりましたので分割いたしました。次のレスに続きます。)
535デフォルトの名無しさん:2009/08/14(金) 23:43:08
データなどを10個おきに確認したところ、1秒間に10個データを必要とするならば、ちょうど、コマ落ちの遅延分が画像の短縮と同じ割合のような感じでした。
音声のデータは、0.5秒おきに正しく取得できているので、問題がないようです。Stopから次のStartとの間が連続しています。

同じカメラとマイクを直接AVIMUXフィルタに繋げてAVIファイルを作成すると、きちんとしたAVIが出来上がりますので、コマ落ちなどはIMediaSample.SetTimeでちゃんとフレーム補間されるものと思っていましたが、
違うのでしょうか?

直接つなげた場合と、いったんデータを横取りした場合と、何が違うのでしょうか?

ただし、かといって、MediaSample.SetTimeをでたらめな数値にするとだめなことから、一応SampleTimeは参考にされているようですね。
一応、今回はコマ落ち分のフレームを直前のフレームで代用して、サンプルタイムを調整して姑息的に対応しようと思っています。しかし、これが正しい方法でしょうか?きちんとした使い方を知っておきたいのです。

AVIMUXの正しい使い方、同期の取り方等を教えていただける方を待望しております。
八方ふさがりで、このスレに期待しております。
よろしくお願いします。
536デフォルトの名無しさん:2009/08/15(土) 02:00:15
試しに自分でサンプルに時間設定してみれば?または取得時間とサンプルの時間差を計測するとか。
オーディオのタイマーとビデオで使われるタイマーが別なのはよくあること。
本来ずれないものだが、ずれる環境もある。
537デフォルトの名無しさん:2009/08/15(土) 10:26:39
>>536
早速のアドバイスありがとうございます。
サンプルの取得時の時間は、カメラやマイクが起動してからの時間なので、
AVIMUXにかけるときには、各々の頭のタイミングが0になるように各サンプルの時間を差し引いています。
具体的には、画像の取得開始が50000なら、取得したデータの各サンプルの時間を50000減じてからAVIMUXに送っています。
音声データも同じです。ただ、起動時間にずれがあるので、開始が60000とかになります。
しかし今回の問題は、開始時間がずれているのではなく、徐々にずれていくのです。
ビデオでたとえますと、音はそのまま、画像は早送り(0.05倍速くらいの微妙)です。
タイマーは同じPCにマイクとカメラを接続してますので、同じだと思います。

>>534-535で疑っているのは、
カメラでリアルタイムに取得した画像は、10fpsとしても、1秒に10枚取れるときもあれば、8枚や9枚しか取れないときもあります。
10秒で100枚ほしいところ、結局90枚しか取れなかったということが普通にあります。
それをAVIMUXに入れたときにはきっちり10fpsでレンダリングされて9秒しか動画が得られない。
取得時間はきちんとしていますが、AVIMUXであいまいに処理されているんじゃないかと、
疑っています。
538デフォルトの名無しさん:2009/08/15(土) 11:13:17
ちなみにAVIMUXのインターリーブのモードはINTERLEAVE_NONEでした。
これをINTERLEAVE_CAPTUREやINTERLEAVE_FULLにしましたら、固まりました。
このモードはソースがプッシュだとだめでしょうか?
カメラやマイクなどのキャプチャフィルタはプッシュだと思うんですが。

私のAVIMUXに対する期待は、AVIMUXに1秒間に何枚送ろうが、サンプルに付けたタイムを元に、
適当に表示時間を調整してくれることです。
これが過大な期待なのかどうか、機能の正確なところが知りたいです。
よろしくおねがいします。
539デフォルトの名無しさん:2009/08/20(木) 03:36:37
GraphEdit のフィルタ挿入選択ダイアログボックスの様に、フィルタの登録情報を取得する方法を探しています。
具体的には、その中でもPIN情報を取得する方法です。条件としてフィルタの生成は行いません。
何か情報がありましたらお知らせください。
540デフォルトの名無しさん:2009/08/22(土) 17:39:59
directshowって動画をフレーム単位で表示したり総フレーム数や現在の表示フレームナンバーとかで再生制御できる?
541デフォルトの名無しさん:2009/08/22(土) 18:37:12
トランスフォームフィルタのCheckTransformについて質問です。

CheckTransform( const CMediaType *mtIn, const CMediaType *mtOut )

この mtIn と mtOut ですが、

[ UpstreamFilter ][ Out ] -> [ A:In ][ TransformFilter ][ B:Out ] -> [ C:In ][ DownstreamFilter ][ Out ]

上図でいえば、それぞれはA〜Cのどれに対応するのでしょうか?

mtOutはBに違いないと思います。
mtInに関しては、MSDNの例を見ている限りはAを指していそうに思うのですが、
他の個人Webサイトの例などを見ていると、C(ダウンストリーム側が提示)と取れるような記述もありました。

よろしくお願いします。 m(_ _)m
542デフォルトの名無しさん:2009/08/22(土) 20:07:31
ソース読めよ
543541:2009/08/24(月) 22:04:59
>>542
ありがとうございました。 m(_ _)m
544デフォルトの名無しさん:2009/08/24(月) 23:26:02
SampleGrabberを使ってAviUtlのDirect Show File Readerっぽいもの(Aviutl用ではありませんが)
を作りたいんですが、うまくいきません。

なるべく速度が低下しないように、
・動画の1フレーム目を読み出した後、2フレーム目の読み出しが要求されたときは
IMediaControlのRunを呼び出して再生を再開→すぐ一時停止
・1フレーム→10フレームのように読み出すときだけシークする

ようにしたいんですが、一回Runを呼び出すと、SetOneShotをtrueにしても、サンプルグラバのコールバックで
IMediaControl→Pauseを呼び出してもちゃんと止まっていないようなのです。
ポーズした後もBufferCBが呼び出されてるし、
映像だけをデフォルトレンダラに変更してウィンドウを動かすと勝手に映像が進みます。
どうすればいいでしょうか?

*.flv→FLV Splitter→MP3のデコーダー→SampleGrabber(Audio)→NullRenderer
    FLV Splitter→ffdshow Video Decoder→SampleGrabber(Video)→NullRenderer
545デフォルトの名無しさん:2009/08/27(木) 01:13:50
>>543
Aだろ

説明ではアップストリームを基準にトランスフォームフィルタの説明してるんじゃないかな
546541:2009/08/27(木) 07:50:01
>>545
やはりそうですよね。
ありがとうございました。 m(_ _)m
547デフォルトの名無しさん:2009/08/29(土) 20:45:44
Directshowでプログラムを組んだのですが、開発したPC(Microsoft SDKが入っている)以外のPCだと、
.netFrameworkをインストールしないと「構成が正しくない」というようなエラーが出て立ち上がりませんでした。

Directshowプログラムを動かすには.netFrameworkのインストールが必須なのでしょうか?
それとも、Directshowとは関係ないAPIによるものでしょうか?

Ole系関数やatlcomcli.hの関数が怪しいかと思うのですが・・・
548デフォルトの名無しさん:2009/08/29(土) 21:00:17
要るわけない。
549デフォルトの名無しさん:2009/08/29(土) 21:21:29
>>547
まさかCLRプロジェクトにしていないよな?
そうでなければ、本当に必要なのは.NET FrameworkではなくVisual C++ランタイムだと思う。
2005 http://www.microsoft.com/downloads/details.aspx?familyid=766a6af7-ec73-40ff-b072-9112bab119c2&displaylang=ja
2008 http://www.microsoft.com/downloads/details.aspx?familyid=2051a0c1-c9b5-4b0a-a8f5-770a549fd78c&displaylang=ja
550547:2009/08/30(日) 09:39:39
>>548
やはりそうでしたか(汗)

>>549
>まさかCLRプロジェクトにしていないよな?
いえ、Win32プロジェクトで作成していますし、プロジェクトのプロパティでも
「共通言語ランタイムサポートを使用しない」にしています。
.netテクノロジーは噛んでいないはずですよね。

>そうでなければ、本当に必要なのは.NET FrameworkではなくVisual C++ランタイムだと思う。
URLを教えてくださってありがとうございます。
今はソフトを作り直していて、余計なAPIなどが関わっていないか注意しているので、
これが完成したら、配布テストとしてVisual C++ランタイムでちゃんと動作するか試したいと思います。

どうもありがとうございました。
551名無しさん@そうだ選挙に行こう:2009/08/30(日) 11:53:25
フレームワークはいらないよ。インストール必要なライブラリーを仕事で洗い出したから間違いないよ
552名無しさん@そうだ選挙に行こう:2009/08/30(日) 12:34:19
>550
Dependency Walkerかdumpbinで、依存してるdllを洗い出してみるのが手っ取り早いと思うよ。

というか>549の言ってるように、Visual C++ランタイムが無いだけだと思うんだが…
Win32プロジェクトでも純粋にWinAPIだけで組むか、ライブラリをスタティックリンクにしない限り
ランタイムが必要になる。(Cの標準関数(printf等)ですらアウト)
553デフォルトの名無しさん:2009/09/01(火) 18:56:04
今気づいたんだがDirectShowのビデオレンダリングってクロマキー合成なのな

1.メディアプレイヤーで動画を再生
2.ペイントでキャンバスをRGB(16,0,16)で塗りつぶす
3.ペイントをメディアプレイヤーの上に重ねると下の動画が透けて見える

XPクラシックモード&WMP11で確認
554デフォルトの名無しさん:2009/09/01(火) 19:19:38
>>553
ビデオオーバーレイを使ってるときはそうなるかもね。
555547:2009/09/01(火) 19:36:24
>>551
そうでしたか。
.netFrameworkはインストールを要求するには大掛かりで憚られるので、
避けたいと思っていましたし、よかったです。
ありがとうございます。

>>552
便利なツールを教えてくださってありがとうございます。
これで調査して適切なライブラリを洗い出します。
556デフォルトの名無しさん:2009/09/03(木) 23:48:43
>>547
コンパイラはVisualStudioか?
7月28日にATLに当たったセキュリティパッチの影響で、
dllが足りていても更正が正しくないと出ることがあるぞ。
もしそれだったら、最新版の再頒布パッケージ入れないと動かないぞ。
http://www.microsoft.com/japan/technet/security/bulletin/MS09-035.mspx
557デフォルトの名無しさん:2009/09/04(金) 01:03:29
VisualStudioのインストーラープロジェクトで依存洗い出してインストーラー作ってくれるけど、
そういうのは使えないのか?
558デフォルトの名無しさん:2009/09/04(金) 20:28:26
変換フィルタを作っているのですが、720x480を入力し、そのままのメディアタイプでVMR7


出力すると、
ttp://kissho.xii.jp/1/src/1jyou90085.png
こんなふうにおかしな映像が出力されてしまいます。

しかし、自作変換フィルタ後にAVIデコンプレッサを介してVMR7に接続すると、
正しく映像が出力されました。

AVIデコンプレッサは幅768にアラインしているのでしょうか?
その場合、それと同様のことを変換フィルタに組み込むには、
具体的にどこにどう実装すればよいのでしょうか?

よろしくお願いします。
559デフォルトの名無しさん:2009/09/05(土) 14:04:16
>>558
VMRのメディアタイプのbiWidth見れば分かるが、768とかになってるはず。
>その場合、それと同様のことを変換フィルタに組み込むには、
変換時にアライン分飛ばせばいい。
560558:2009/09/05(土) 16:13:23
>>559
なるほど!
ありがとうございました!
561デフォルトの名無しさん:2009/09/06(日) 14:49:43
訳あってdirectshowを学ばなければならなくなった者です
なかなか良い書籍やサイトが見つからないのですが、みなさんはどうやって勉強しているのでしょうか?
562デフォルトの名無しさん:2009/09/06(日) 15:09:36
>>561
SDKのサンプルとドキュメント1択。
563デフォルトの名無しさん:2009/09/09(水) 12:44:39
例えばデスクトップをキャプチャしてaviで保存するアプリを作ったとする
このとき無圧縮だったり、そのほかのコーデックで圧縮したりするようにするにはどうすればいいんだ?
どのフィルタの部分でそのコードを書く?のだね 初心者だから教えてみてみ
564デフォルトの名無しさん:2009/09/09(水) 13:37:02
>>563
VFW使え。それが一番簡単。
565デフォルトの名無しさん:2009/09/10(木) 02:21:14
>564
VFWはファイルサイズ2G以下の壁が…
正直grapheditのが簡単な希ガス。
566デフォルトの名無しさん:2009/09/10(木) 02:32:51
vfwはビデオコーデックの機能だけだカス
567デフォルトの名無しさん:2009/09/10(木) 16:53:30
DirextShow初心者なのですが、
H264のaviファイルの各コマ画像を連続で取り出すことって
簡単に出来るのでしょうか・・・
対応コーデック(フィルタ?)を入れれば再生は簡単に出来そうですが、、
568デフォルトの名無しさん:2009/09/10(木) 18:36:40
directshowでビデオからの映像をグレイスケールにして二値化するにはどうしたらよいのでしょう
569デフォルトの名無しさん:2009/09/10(木) 18:54:40
>>567
余裕

>>568
フィルタ作れ
570デフォルトの名無しさん:2009/09/13(日) 22:09:06
>>568
EZRGB24っていうサンプルが参考になるよ
571デフォルトの名無しさん:2009/09/16(水) 03:11:58
二値化フィルターくらい簡単なら作ったげよか?
輝度でばっさり二値化するのでいいのか?
色で判断して二値化するほうがいいの?
閾値はどうする?プロパティページで変更出来るようにしたい?

スライス方式って上下限の閾値ってのもあるぞ

お好みを指定してくれ。
後、ソースはやらん
572デフォルトの名無しさん:2009/09/17(木) 02:03:11
>>571
適応的二値化でお願いします
cvAdaptiveThreshold()を呼び出すだけより格段に速いやつを
573デフォルトの名無しさん:2009/09/17(木) 09:11:36
周囲の環境から最適に二値化するやつか。
それはまんどくさ
574デフォルトの名無しさん:2009/09/18(金) 22:24:21
cvAdaptiveThreshold()より改善するのは仕事でないと嫌だが、
まんま使うとかはダメなのか?

仕事として受けるなら設計書とソース提出するよ
575デフォルトの名無しさん:2009/09/19(土) 17:35:55
自力で高速化してみます
ありがとうございました
576デフォルトの名無しさん:2009/09/22(火) 14:06:10
Visual C++ 2008 を使用しています。

Microsoft SDKs\Windows\v6.1\Samples\multimedia\directshow\baseclasses
にある Streams.h をインクルードしたら
IReferenceClockTimerControl が定義されてないと出ました。
これはどういった対処をすれば良いのでしょうか?
577デフォルトの名無しさん:2009/09/22(火) 14:10:05
まずはビルドしろよ糞が
578デフォルトの名無しさん:2009/09/22(火) 16:46:07
基本的な事を知らずにDirectShowに手を出すと泣くよ。
俺が昔そうだったから保障するw
579デフォルトの名無しさん:2009/09/22(火) 23:12:02
>>576
ヘッダー全部もってこい。
もしくはちゃんとパスを通せばおk
580デフォルトの名無しさん:2009/09/28(月) 21:56:54
>>576
MicrosoftSDKや、DirectX SDKと、VC++のヘッダファイルで同名のがあるから
インクルードの順番も注意しろ。
581デフォルトの名無しさん:2009/10/09(金) 14:15:28
TChartShapeでchasVertLineにしてマークを表示させてるのですが
マークが上と下(Y1とY0)に2つ表示されてしまいます
これを上1つ(Y1)だけ表示されるのにはどうしたらいいですか?
582デフォルトの名無しさん:2009/10/09(金) 14:16:09
あ、すんません。
誤爆してしまいました
583デフォルトの名無しさん:2009/10/11(日) 07:36:37
同機種のwebカメラを2つ繋げてもグラフエディットでは1つしか表示されない。

調べてみるとPCによってはちゃんと表示されるものもある(カメラのドライバーは同じ物を使用)
USBコントローラの数が関係してるのかと思うんだけどわからない。

ここには解説出来るような人いる?
584デフォルトの名無しさん:2009/10/11(日) 07:47:51
いません
585デフォルトの名無しさん:2009/10/11(日) 13:33:39
やっぱり難しいよね。ごめんなさい
586デフォルトの名無しさん:2009/10/11(日) 14:14:54
態度が気に食わないので教えない
587デフォルトの名無しさん:2009/10/11(日) 14:30:02
588デフォルトの名無しさん:2009/10/12(月) 21:08:27
>>586
>>587
態度を改めます。私程度の力ではわからないため
お願いします教えてください。
【質問】
同機種のカメラ複数台接続してGrapheditで1個しか表示されない
カメラドライバの問題でなく「PC側によって」使えるものと
使えないものがあるが、何が違うのかわかりません。

【現在わかっている事】
ノートPCの一部ではUSBコントローラが複数あり
別々のUSBポートにつないでいれば同機種のWebカメラでも
利用可能。

また、ググると下記の記述があり私が試してみた感じ同じ考えです。
・同じ型番でもドライバが対応していれば大丈夫
・同じメーカーでも型番が違えば大丈夫
・片方のカメラにUSBハブを挟めば大丈夫
・メーカーが違えば大丈夫

http://blogs.yahoo.co.jp/honebuto_honebuto/28960469.html

よろしくお願いします。
589デフォルトの名無しさん:2009/10/16(金) 21:17:21
>>578
よくあるパターンだがDirectShowに限らず初心者はその「基本的なこと」が何なのかすら判らないことが多い
で、ググってもそういう事が書いてあるページがなかなか見つからない罠。結果挫折する・・・
590デフォルトの名無しさん:2009/10/17(土) 01:48:31
キャプチャーカードやカメラの画像サイズの設定で
入力1080と720などの切り替えをしたいのですが、
DirectShow では IAMStreamConfig を使ってできましたが、
WindowMediaEncoderSDK いわゆるWMEncoderLib.dll系を使って
できないでしょうか?
591誰か助けて。:2009/10/18(日) 21:37:48
ISampleGrabberを利用して画面キャプチャを行っています。
mpeg2をビットマップにすることは出来ましたが、
Webカメラで撮影して保存したファイルでは失敗します。
Webカメラの設定ではYUV2で保存されるようで、そのファイルのプロパティーで見ると
MS-YUV(16ビット)と書かれていました。この場合、グラバのSetMediaType()には
一体何を与えればいいのでしょうか? なお、現状で、
media_type.majortype = MEDIATYPE_Video;
media_type.subtype = MEDIASUBTYPE_RGB24;
media_type.formattype = FORMAT_VideoInfo; を与えています。
これだと、GetCurrentBuffer()で失敗します。
そこまでは全部成功します。戻り値はVFW_E_WRONG_STATEでした。
592誰か助けて。:2009/10/18(日) 21:40:53
なお、フレーム読み込み箇所は次の通りにしています。

this->seeking->SetPositions(&ulc,AM_SEEKING_AbsolutePositioning,&ulc,
AM_SEEKING_AbsolutePositioning );

// 1フレームレンダリング、完了を待つ
while(this->control->StopWhenReady() != S_OK){}

// レンダリング完了を待つ(不要か?)
OAFilterState fs;
this->control->GetState( INFINITE, &fs);

// バッファを取得
this->grabber->GetCurrentBuffer(
      (long*)&this->media_type.lSampleSize,
      (long*)**this->load_buffer);
593デフォルトの名無しさん:2009/10/18(日) 22:53:11
>>591>>592です。
解決してないけど解決しました。
どうもよくわかりませんが、そのムービーファイルの数フレームだけ、
GetCurrentBuffer()でVFW_E_WRONG_STATEが返ってくるようです。
しょうもないので、GetCurrentBuffer()でエラーが返ってきても無視すると
うまく行くようになりました。こんなんでええんだろうか・・・
594デフォルトの名無しさん:2009/10/18(日) 23:13:12
ピクセルフォーマットやメディアタイプを理解せずに、ISampleGrabberを使える事にびっくりした。

>Webカメラで撮影して保存したファイルでは失敗します。
このファイルがどんなファイルなのか、作っているGraphがどうなっているのか、等が分からないと、答える事は難しい。

よく分からないんだったら、IVMRWindowlessControl::GetCurrentImageあたりを使ったほうが無難だと思う。
595デフォルトの名無しさん:2009/10/21(水) 18:01:21
基本的な質問で申し訳ないのですが、DirectShowはRenderFile()でファイル名やURLを指定して再生すれば、
自動的にストリーミング再生される、ということでいいのでしょうか?
DirectSound等での再生は自分でストリーミング再生用のプログラムを書く必要があったので、そうならかなり有り難いのですが
596デフォルトの名無しさん:2009/10/21(水) 19:03:51
試してみれば分かるんじゃね?
597デフォルトの名無しさん:2009/10/21(水) 21:47:06
逆に自力でストリーミング処理するためには
ソースフィルタを自作しなければならない

ローレベルなことをやろうとすると途端に厄介なことになるのが
DirectShowの世界
598デフォルトの名無しさん:2009/10/21(水) 22:16:22
なるほど、ではやはりストリーミングは自動で行われるのですね
どうもありがとうございました
599デフォルトの名無しさん:2009/10/21(水) 23:31:38
フィルタを組み立てるだけだろ。自動でやるか手動でやるかの違い。
明示的にやりたいなら、自分でピンを繋げるコードを書く必要がある。
600デフォルトの名無しさん:2009/10/22(木) 03:21:57
>>599
それは質問者の意図している部分とはちょっと違う気がする。
まあ、RenderFile()では思うようにできないことが分かったときに、
>>599の意味が分かるのかもしれないけどね。
601デフォルトの名無しさん:2009/11/30(月) 18:54:12
.NETからDirectshowで動画再生して、VMR9でミキシングしています。
OSDをしたくて一時停止の画像をミキシングしたあとポーズをすると、

osd.pause()
mctrl.pause()

一時停止の画像が表示されたりされなかったりします。
それは非同期で動いているからとわかるのですが、
やっぱりこれは1フレーム待つしかないのでしょうか。
602デフォルトの名無しさん:2009/12/08(火) 00:52:26
WEBカメラから取得した映像をWindowMediaEncoderではなく、DirectShowを使用して
WMVでライブ配信したいのですが、いい資料とかサンプルソースとかありませんか??
603デフォルトの名無しさん:2009/12/15(火) 21:28:59
H264のJMデコーダーで使えるHDサイズのテストストリームか
JMエンコーダーで使えるHDサイズのyuv画像って
ネットにないでしょうか?・・・

自作するしかない?・・・
604デフォルトの名無しさん:2009/12/16(水) 11:17:13
>>603
H.264のエレメンタリストリームでよければ適当な.mp4ファイルを
デマルチプレクスすればいいんでないかな?
「JMデコーダーで使える」って要件が今ひとつ分からんけど。

少なくとも「HDサイズのyuv画像」は転がってないんじゃないかな。
ファイルサイズ考えたら・・・
605デフォルトの名無しさん:2009/12/16(水) 19:58:26
今のマルチコア3GHzのPCって
H264の1920*1080サイズの動画を
コマ落ちなしで再生できるんですか?
606sage:2009/12/18(金) 13:59:14
qedit.hの話題が出てたけど、フォーラムにあるように

#include <qedit.h>

を、

#pragma include_alias( "dxtrans.h", "qedit.h" )
#define __IDxtCompositor_INTERFACE_DEFINED__
#define __IDxtAlphaSetter_INTERFACE_DEFINED__
#define __IDxtJpeg_INTERFACE_DEFINED__
#define __IDxtKey_INTERFACE_DEFINED__
#include <qedit.h>

と書き換えたら、qedit.hで構文エラー。
qedit.hを書き換えなくていいように上記の方法をとったのに、構文エラー。
どういうことなの…
607デフォルトの名無しさん:2009/12/18(金) 14:50:41
unko
608606:2009/12/18(金) 19:40:28
自己解決した。構文エラー該当行の定数"FPS"を新しく定義してしまっていた。不覚だった。
609デフォルトの名無しさん:2009/12/19(土) 20:53:09
フィルタのを設定のやり方を教えてください。
ISpecifyPropertyPages でとってきて、
OleCreatePropertyFrame で、プロパティページを表示して、
変更すれば、できるんですが、毎回やるのは面倒。
プログラムでできませでしょうか?

具体的やりたいのは、Sony MPEG Decoderをノンインタレースにしたいのです。
#最初からノンインタレースをデフォルトにしとけばいいのに。ソニーさん。
610デフォルトの名無しさん:2009/12/21(月) 03:37:16
JMはH264のリファレンスじゃない?
611デフォルトの名無しさん:2010/01/26(火) 11:46:36
>>603,604
ひどい遅レスですまんが標準画像じゃダメなの?
エンコーダーやデコーダー作ってる人とかDTV板のエンコオタは大抵これ使ってるけど
http://media.xiph.org/video/derf/
612デフォルトの名無しさん:2010/01/31(日) 21:30:27
DirectShowを使ってwmaやwmv形式で電話orテレビ電話のようなことを行うアプリケーションを作成しています。
なお、通信部分に関してはフィルタグラフの外で実装しています。

フィルタの流れとしては、
送信部分は  キャプチャ → エンコーダ → 自作レンダラ
受信部分は  自作ソース → デコーダ → レンダラ
という流れにしようと考えています。

送信部分の自作レンダラはエンコーダから受け取ったデータを
ソケットに渡すように実装できたのですが、
受信部分の自作ソースフィルタをデコーダに接続する部分がうまくいきません。

具体的にはwma通信の、
自作フィルタ → WMAudio Decoder DMO → レンダラ
の自作ソースからデコーダへの接続で「共通するメディアの種類が無い」と言われてしまいます。

出力ピンのメディアタイプもメジャータイプをMEDIATYPE_Audio
マイナータイプをWMMEDIASUBTYPE_WMAudioV8 としています。

push、pullの両方を実装して試してみたのですが、どこが悪いのかわからなくなってしまいました。

ご教授お願いします。
613デフォルトの名無しさん:2010/02/01(月) 10:18:13
Pin接続シーケンス中のReceiveConnectionとかで
Decoderが要求するMediaTypeとか取得できたような気がする。
しばらくDirectShowから遠ざかっているので違ったらスマン。
614デフォルトの名無しさん:2010/02/01(月) 13:46:23
CBaseOutputPin的なら、GetMediaTypeとCheckMediaTypeの実装がおかしんじゃね?
615612:2010/02/01(月) 16:26:04
早速レスがついていて驚きました。
ありがとうございます。

>>613
GraphEditで見る限り、WMAudio Decoder DMOの入力ピンが求めているMediaTypeは
Major Type: Audio - Sub Type: {00000160-0000-0010-8000-00AA00389B71} - Format: GUID_NULL
Major Type: Audio - Sub Type: WMAudio V8 - Format: GUID_NULL
Major Type: Audio - Sub Type: WMAudio V9 - Format: GUID_NULL
Major Type: Audio - Sub Type: WMAudio Lossless - Format: GUID_NULL
であり、2番目のWMAudio V8に合わせて実装しています。

>>614
出力ピンのMediaTypeはメンバ変数として持ち、ピンのコンストラクタにて設定しています。
GetMediaTypeではメンバ変数として持っているMediaTypeを引数に代入し、S_OKを返しています。
CheckMediaTypeでは引数とメンバ変数のMediaTypeのメジャータイプとマイナータイプを比較し、
両方が一致した場合にS_OKを返しています。
メッセージボックスを出させて確認したところ、CheckMediaTypeではS_OKを返すパスまで進んでいるようです。
しかし、共通のメディアの種類が無いと言われて接続に失敗します。

そもそも、WMAudio Decoder V8に接続するピンはpushなのかpullなのかすらわからずにいます。
push型でいいのでしょうか?
616デフォルトの名無しさん:2010/02/01(月) 17:58:54
フォーマットの部分も有効なデータがないと駄目な気がする。
メジャーサブの値は、モジュールをロードせずにフィルタ構築のヒントに使われるもの。
列挙で返すメディアタイプはきっちり値を設定していないと、「メディアがないぞゴルァ」エラーが出たような。
ビデオでそんな経験をしたことがある。
617612:2010/02/01(月) 18:14:22
レスありがとうございます。
>>616
書き忘れていましたが、フォーマットに関してもWAVEFORMATEXの型で周波数等すべての
データを設定しています。
GraphEdit上で自作フィルタの出力ピンのプロパティを見ると、
ASF Readerでwmaファイルを指定した場合の出力ピンとと同様になっています。

WMAudio Decoder V8との接続ではメディアタイプ以外のネゴシエイト等も行っているのでしょうか?
618デフォルトの名無しさん:2010/02/01(月) 21:39:51
どんなインターフェイスが問い合わせされているかも調べてみるといいよ。
必要なインターフェイスがないと繋がらないケースもある。
619612:2010/02/01(月) 23:47:39
レスありがとうございます。
>>618
なるほど、インターフェイスに関しては考えていませんでした。調査してみます。
調べ方としてはCUnknown::NonDelegatingQueryInterfaceをオーバーライドして、
引数や返り値を見る方法を考えているのですが、それでいいのでしょうか?
また、もっと簡単な方法等ありましたらご教授お願いします。
620612:2010/02/02(火) 22:54:42
618さんのアドバイスに基づき、WMAudio Decoder V8との接続の際に問い合せられるインターフェイスを調査してみました。
問い合せられて失敗していたのは
IAMOpenProgress
IAMDeviceRemoval
IAMFilterMiscFlags の3つでした。
特に問題になっているのは3つ目のIAMFilterMiscFlagsのような気がするので
インターフェイスを実装して接続を試してみます。
621612:2010/02/03(水) 18:36:40
何度も書き込んですみません。
上の書き込みの通り、問い合わされたインターフェイスを実装し、接続を試してみましたが、
「共通のメディアの種類が無い」と言われて失敗。
CheckMediaTypeでは、formattypeの中身まで完全に一致してS_OKを返しています。(なぜか何回も)

ソースフィルタはCSourceを、出力ピンはCSourceStreamをそれぞれ継承した形で作成していますが、
この構成ではWMAudio Decoder DMOに接続することはできないのでしょうか・・・

本来ならば、上記のデコーダはWM ASF Readerと繋がるもので、
WM ASF Readerはファイルからの読み込みとデマルチプレクサの機能を備えた上でプッシュモデルでデータを流しています。

実装したいもの自体は
「ネットワーク越しに飛んできたWMAデータをバッファから読み出して下流のデコーダへと流す」という単純な仕組みのものなのに、
作るのはこんなにも難しいのかと愕然としています。

解決方法等ご存知の方が居りましたら、ぜひご教授ください。
622デフォルトの名無しさん:2010/02/03(水) 21:12:48
自作フィルタ挟まない場合、グラフの構築は成功してるよね?
理論上、透過的な自作フィルタを作れば上手くいくと思うが、やはり何かが足りないのだろう。
フィルタとピンそれぞれインターフェイスが必要だし、ドキュメントが間違っていることも時々あるので地道に調べよう。
623質問です:2010/02/14(日) 23:44:40
誰か知ってる人いたら教えてください。
AM_MEDIA_TYPE として取得した{73646976-0000-0010-8000-00AA00389B71}のようなGUIDから、
"MEDIATYPE_AnalogVideo"のような文字列を引く方法ってありますか?
VC++2008です。
624デフォルトの名無しさん:2010/02/15(月) 00:28:20
そういった機能は提供されていない
625デフォルトの名無しさん:2010/02/15(月) 00:48:59
ちょっと調べてみた。
Baseclasses\wxdebug.cppが参考になるよ。DisplayTypeメソッドの中で
GuidNames[pmtIn->majortype]
のような形で文字列を得ている。
GuidNames 自体は同ファイル内に実装されているマクロ。
そいつをパクって自分のソースに持ってくればいいんじゃねーの?
ただしuuids.hに記載されているタイプに限る。

実際に動かしてないから保証できないけど参考になれば。
626質問です:2010/02/17(水) 13:48:13
どうもありがとうございます。
Microsoft DirectX SDK (February 2010)をインストールしていますが、
wxdebug.cppファイルがありません。
しかもBaseclassesフォルダもありません。
なぜでしょうか?OSはwin7です

627デフォルトの名無しさん:2010/02/17(水) 14:53:23
DirectShowはかなり昔にDirectXに含まれなくなった。常識だろ。
628デフォルトの名無しさん:2010/02/17(水) 15:08:57
常識かどうかはともかくDirectShowがどうなったかは
Microsoft DirectX SDK (February 2010)のドキュメントのトップ頁に書いてある
629質問です:2010/02/17(水) 21:36:34
Windows SDKをインストールしたところwxdebug.cppなどが入ってました。
どうもありがとうございます^^)
630デフォルトの名無しさん:2010/02/23(火) 11:43:17
DirectShowのFilterを自作しているのだが、MFCを使うとregsvr32登録時にエラー。
#include "afxwin.h"をやらないで、DllEntryPointもDllMainも自作関数ならOKっぽい。
いくつかテストで作ってみたが、登録もGraphEdtへの追加がうまく行っても、
GraphをRunさせると、staticなメンバが異常で落ちるなどなど。
DirectShowのFilter作るのにMFCは使えないのかな?
631デフォルトの名無しさん:2010/02/23(火) 13:22:15
お前の使い方が悪い
632デフォルトの名無しさん:2010/02/26(金) 12:45:17
すいませんでした
633デフォルトの名無しさん:2010/03/05(金) 08:19:06
Microsoft.DirectX.AudioVideoPlayback.Video
動画プレイヤーみたいなのを作ってて
イコライザみたいなことをしたいんだけど
音声データってこれで取り出せるの?
634デフォルトの名無しさん:2010/03/05(金) 23:38:02
昔DShowで動画編集ソフト作ってた頃
映像用の高速なサンプルグラバ書いたけど
DX8.1時代のものだが欲しい人いるかな?
635デフォルトの名無しさん:2010/03/05(金) 23:45:11
高速なサンプルグラバって、具体的にどの処理が高速なの?
636デフォルトの名無しさん:2010/03/05(金) 23:55:07
連続フレーム、または数フレーム飛ばし
デフォルトのと違って処理時間に関係なく
再生しながらコマ送りせずに全コマ取得可能
637デフォルトの名無しさん:2010/03/06(土) 00:07:53
機能はわかった。
サンプルグラバって、コールバック受けて処理するんじゃなかったっけ?
638デフォルトの名無しさん:2010/03/06(土) 00:25:31
デフォルトのはそうだけど
こっちは正確にはサンプルグラバの子クラスじゃなくて
ビデオレンダラの子クラスと補助的な関数で構成してある
要るなら個人情報削除してからソースをアップするよ
639デフォルトの名無しさん:2010/03/06(土) 03:24:04
>>638
DirectShowでmp3とかmidiとかoggの波形データを取得する
プログラムを作ろうと思ってるんだけど、それの参考になりそうだから欲しい
640デフォルトの名無しさん:2010/03/06(土) 14:48:30
641デフォルトの名無しさん:2010/03/06(土) 20:38:36
>>640
あんがと、頂きました。
休日だからと12時間も寝てしまった・・・時間損した気分
642デフォルトの名無しさん:2010/03/06(土) 20:51:00
>>641
CCaptureRenderer::DoRenderSampleとCVideoFile::TryGetFrameがかなり汚いコードですみません
ここがDShowの厄介な部分で試行錯誤の結果なので
mp3のデコード結果ならCCaptureRendererのようにCRenderer系のオーバーロードすれば作れるはず
643デフォルトの名無しさん:2010/03/06(土) 21:46:10
俺ならNULLレンダラ繋いでグラバのコールバックでゴニョゴニョするかな
644デフォルトの名無しさん:2010/03/06(土) 22:01:19
>>643
グラバはコールバックでロックできない
グラバはコマ送りにしないと勝手に再生位置が進むから連続で取れない
グラバはコマ送りにすると連続でいけるがものすごく遅い
もしこれらが解決されてるなら>>634は神
645デフォルトの名無しさん:2010/03/06(土) 23:50:48
ISampleGrabber::GetCurrentBufferって取得するなら言ってることわかるが。

ISampleGrabber::SetCallback
ttp://msdn.microsoft.com/ja-jp/library/cc369545.aspx
「データ処理スレッドは、コールバック メソッドから戻るまで動作を停止する」
って書いてあるが。>644のいうロックって、同じことなんじゃないの?
646デフォルトの名無しさん:2010/03/07(日) 00:07:10
>>645
だが出来なかったんだ
具体的には残り再生時間が1分だとすると
コールバック開始から1分以内に処理しないとコールバックのスレッドが終了する
だから最後のほうのフレームが取れない
しかもフレーム単位のシークが糞
647デフォルトの名無しさん:2010/03/07(日) 10:01:20
そうなんだ。不思議な話だね。
648デフォルトの名無しさん:2010/03/08(月) 06:52:48
グラフにサンプルグラバーフィルターだけ追加して
メディアタイプをメインMEDIATYPE_Audio、サブMEDIATYPE_PCM、にして
mp3ファイルを指定してレンダリングすると
 ソースフィルタ → MPEG1スプリッタ → ffdshowデコーダ → サンプルグラバ → レンダラ
になるのに

NULLレンダラも追加して同じことすると
 ソースフィルタ → MPEG1スプリッタ → サンプルグラバ → NULLレンダラ
ってなるのはなんでなんだぜ?
 ソースフィルタ → MPEG1スプリッタ → ffdshowデコーダ → サンプルグラバ → NULLレンダラ
ってなると思ったんだが
649デフォルトの名無しさん:2010/03/08(月) 12:54:46
レンダラが繋がらないからフィルタが中間に入るんだろ。
NULLレンダラはなんでも繋がる。
650デフォルトの名無しさん:2010/03/08(月) 17:34:39
MPEG1スプリッタがサンプルグラバにPCMで接続してるってことか?
なんかおかしくね?
651デフォルトの名無しさん:2010/03/08(月) 19:03:28
>>648
試してみた。俺は ソースフィルタ → MPEG1スプリッタ → NULLレンダラ だったぞ。
652デフォルトの名無しさん:2010/03/08(月) 19:35:22
>>640
WaitForFreeとSelectPixelQualityって何に使うん?
上の削除して適当に書いたらコンパイル通った
多分元のコード?から削除し忘れたんだろうけど
653デフォルトの名無しさん:2010/03/08(月) 23:19:22
レスありがとう

>>649
んー、そうするとNULLレンダラ使う場合はインテリジェント接続は使用できんってこと?
レンダーしたあとに追加して接続しなおすしかないんかね
もちょっとスマートに行かないもんかね

>>650
そそ、俺もそこがよくわかんなかった
メジャータイプは当然同じなんだが、サブタイプ指定してるから
スプリッタはくっつかないと思ったんだよね
グラフエディットでOUTピンのサブタイプ確認したら
MPEG-Iスプリッタ: MEDIATYPE_MPEG1AudioPayload、MEDIATYPE_MPEG1Packet
ffdshowAudioデコータ: MEDIATYPE_PCM
 ソースフィルタ → MPEG1スプリッタ → NULLレンダラ(サンプルグラバは接続されず)
ならあり得ても
 ソースフィルタ → MPEG1スプリッタ → サンプルグラバ → NULLレンダラ
は無いんじゃないかと

>>651
サンプルグラバとNULLレンダラをグラフに追加してからで?
グラフエディットで特にメディアタイプ指定しないでやっても
サンプルグラバとNULLレンダラを追加してからインテリジェント接続すると
 ソースフィルタ → MPEG1スプリッタ → サンプルグラバ → NULLレンダラ
ってなるんだよなー、個々のPCの環境によるんだろうけど・・・

もそっとインテリジェント接続の仕組み調べないとだな・・・
654デフォルトの名無しさん:2010/03/08(月) 23:21:39
grapheditで調べたら?
655デフォルトの名無しさん:2010/03/08(月) 23:35:27
>>654
もちろん使ってるよ、グラフエディット
でもメディアタイプ変更できないから、完全な再現ができないんよ
俺が知らないだけで、実はできたりする?
656デフォルトの名無しさん:2010/03/08(月) 23:40:03
開発しているアプリケーションのグラフへリモートグラフで繋いで見てるの?
657634:2010/03/08(月) 23:48:48
古いコードをアップしてしまったので修正版
ついでに説明も更新した
ttp://www1.axfc.net/uploader/File/so/40088.zip
658デフォルトの名無しさん:2010/03/09(火) 01:19:29
>>656
それ知らなかった・・・できたんだそんなこと・・・
という訳でやってみたら
 ソースフィルタ → MPEG1スプリッタ → NULLレンダラ (サンプルグラバは接続されず)
となってました。
疑問は全て解けました。ありがとう。
インテリジェント接続を使う場合にNULLレンダラ使いたいなら
NULLレンダラをグラフに追加してない状態でRenderしてから追加→再接続しかないのかな
659デフォルトの名無しさん:2010/03/09(火) 01:24:32
手動で繋げよ。自動構築するから期待した動作にならないんだろ。
660デフォルトの名無しさん:2010/03/09(火) 01:30:40
>>657
こんな時間にわざわざありがとう
これ使ってちょっとサンプルグラバとの比較ベンチマーク作ってみるよ

>>658
CRendererの派生クラス作ってNULLレンダラもどき作ればいいかも
そうすれば接続を限定してインテリジェント出来ると思う
661660:2010/03/09(火) 23:31:35
>>657
簡単な比較ベンチ書いたよ
結論は
無圧縮AVIは同じくらい速い
DivXは数割速い
wmvやflv、mpg、mp4は数倍速い
h264のmp4は速いけどtsはかえって遅い

もしかしたら使い方間違ってるかも…

コードは↓
ttp://hypersugiyama.hp.infoseek.co.jp/uploader/cgi-bin/file/test.zip
662デフォルトの名無しさん:2010/03/10(水) 02:36:58
>>661
コードざっと斜め読みしただけだけど、サンプルグラバの方は、
データがディスクキャッシュ上にのってたりしない?
データのサイズが書かれていないので、はっきりしたことは言えないけど、
>無圧縮AVIは同じくらい速い
とか
>wmvやflv、mpg、mp4は数倍速い
とか
>tsはかえって遅い
とか、へんじゃないかな?
後、出力先が32ビット固定になってるけどデータは他のフォーマットで、
フォーマット変換が発生しているとかもありうる。
そういう意味では、BitBltしなくてもいいんじゃない?>計測
663デフォルトの名無しさん:2010/03/10(水) 03:16:18
>>662
その「へん」なのがDirect Showなのだよワトソン君
ビルドして確かめればいいのでは?
キャッシュ?二回実行すれば?
コードもらったからもう寝るよ
664デフォルトの名無しさん:2010/03/10(水) 12:22:01
>>661
>wmvやflv、mpg、mp4は数倍速い
ニコニコから落としたmp4読ませたら31fpsに対して213fpsとか吹いたw
酷い場合は6対173とかになるし
いくらなんでもサンプルグラバが遅すぎるから使い方間違えてるんだと思う
FFdshowのせいかもしれんがErrorが1とか2ぐらい出るファイルが多い

あとコード汚すぎ
cppインクルードしすぎ
665デフォルトの名無しさん:2010/03/10(水) 19:49:36
>>664
じゃあ正しいサンプルグラバの使い方って何?
666デフォルトの名無しさん:2010/03/10(水) 23:07:23
単に再生するデータの画像形式と出力するサーフェースの形式が異なっていて
コンバートが挟まってるだけなんじゃないの?>バラバラな結果
667デフォルトの名無しさん:2010/03/14(日) 00:07:37
速いらしいのでゲームでサーフェスにHD動画張るのに>>634の使いたいのですが、
どうすればDirectXのサーフェスに直接出力できますか?
テクスチャのアドレスを与えると何故か部分的に透明化したり色が化けるようです。
CVideoFile::GetFrameはDLLに実装して、
ゲーム本体にはDirectShowのヘッダーは入らないようにしました。
668デフォルトの名無しさん:2010/03/14(日) 00:35:00
ステート設定してアルファ無効化して描画しろよw
669デフォルトの名無しさん:2010/03/14(日) 01:09:15
>>668
ありがとうございます。
その点は自己解決しました。
しかし、いろが入れ替わっているような現象と、
画像が前のフレームと重なって切れたようになってテクスチャの描画がうまくいきません。
670デフォルトの名無しさん:2010/03/14(日) 01:23:40
お騒がせしました
ARGBじゃなくてABGRでした。
あと、スレッドは1つにしないといけないようです。
671デフォルトの名無しさん:2010/03/24(水) 17:02:19
CLSID_WMASFWriterのProFile関係の使い方に詳しい方教えてください。
CLSID_WMASFWriterを使用してAVI→WMVに変換しようとしています。
元動画のビデオサイズ/ビットレート/オーディオ情報等を維持して変換
したいのですがデフォルト設定だとW320×H240/225Kbpsになってしまいます。
ProFile設定を行う事でビデオサイズの変更等が出来る事はわかったのですが
元動画からカスタムProFileに必要な情報を取得する方法がわからないので
参考になる日本語サイト、無ければ英語サイト等ありましたら教えて下さい。
考え方が間違えていたらご指摘ください。よろしくお願いします。

開発環境は VisualC++2008、Platform SDK 2003 SP1、DirectX SDK August 2009 です 。
672デフォルトの名無しさん:2010/03/24(水) 17:11:19
>>671補足
ProFileの設定はIID_IConfigAsfWriterとIWMStreamConfigを使用して
ビデオサイズ等を登録してConfigureFilterUsingProfileで変更しています。
673デフォルトの名無しさん:2010/03/26(金) 16:05:09
AVIファイル程度なら自分で解析しちゃえば?
ttp://www.usagi-goten.com/jp/AVI_structure.html
674デフォルトの名無しさん:2010/03/29(月) 08:54:15
ありがとうございます。参考にして試してみます。
他にもありましたらご指摘をお願いします。
675デフォルトの名無しさん:2010/04/09(金) 13:19:40
WMV/WMAを作りたいのならDMOのEncoder使うのがいいと思います
676デフォルトの名無しさん:2010/04/21(水) 22:41:34
DirectShowを使用して、任意のメモリ上の画像データ配列(640×480 24bit)を任意のタイミングで
AVIファイルに出力する処理を考えています。
過去ログを見て、CSourceStream::FillBufferを独自フィルタで書き換えるというのがあり、
試してみたのですが上手くいきません。
サンプルを見ながら以下のことはできました。

BouncingBallサンプル(CSourceStream)→圧縮フィルタ→AVI Mux→FileWriter→AVIファイル

ただ、このBouncingBallサンプルは、FillBufferメソッド内部において描画処理を
行っており、ここに外部から画像データをコピーすることができません。
やりたいことは以下の通りです。

メモリ上の画像データ配列→ソースフィルタ→圧縮フィルタ→AVI Mux→FileWriter→AVIファイル
(これを任意のタイミングで行う)

VFWを使えば簡単なのですが、このAVIにWAVを合成する必要があるのでVFWではできません。
(できないよね?)
ちなみに画像データ配列のもとは専用キャプチャボードからの入力なので、
入力自体はDirectShowでは取得できません。
一体どうすれば良いのでしょう?

677デフォルトの名無しさん:2010/04/21(水) 23:08:43
排他制御して現在のデータをキューなり、リストなり好きなもので受け渡すか
普通にプッシュ型のソースフィルタを作るだけだろ。
あとvfwでも音も入れられる。

>一体どうすれば良いのでしょう?
きちんとドキュメントとソースコード読め。
678676:2010/04/22(木) 07:28:39
>>677
ご回答ありがとうございます。

>普通にプッシュ型のソースフィルタを作るだけ
外部からのデータをどのようにソースフィルタへ渡すかが分からない
のです。画像データのポインタを渡すだけとか、何か簡易な方法
でできないか考えていましたが、分かりませんでした。

>現在のデータをキューなり、リストなり好きなもので受け渡す
プロセス間通信を使うわけですね。これならデータを渡せそうですね。

>vfwでも音も入れられる
そうなんですね。勉強不足でした。ありがとうございます。

「普通にプッシュ型のソースフィルタを作る」ことに関して、
どのようにデータを渡すかを、もう少し詳しく教えていただけると
助かります。
679デフォルトの名無しさん:2010/04/22(木) 10:03:49
>>678
ballサンプルよりもpushsourceの方がわかりやすいんじゃないかな
(ビットマップを展開して送り出している)
フィルタからデータをポインタなどで渡したいなら、Interfaceを自作してみてはどうか。
680デフォルトの名無しさん:2010/04/22(木) 12:54:35
クリティカルセクションとイベント組み合わせれば、簡単な受け渡し機構作れるだろう。
DirectShow以前の、初歩的な話なんだよな〜
681676:2010/04/22(木) 22:20:05
>>679
お返事ありがとうございます。
ballサンプルを使っているのは、検索した時にBouncingBallのFillBuffer()を
改造すべし、とのちょっとした記述があったため、試しに使ってみました。
後、開発環境が古いっていうのもありますが。
Pushsourceのサンプルを見るためにWindowsSDKをインストール中です。

>>680
お返事ありがとうございます。
何というか、結局DirectShowはデフォルトでメモリ上の画像データを
AVIに吐き出す機能は備えていないということなんですね?
VFWだと逆にストリームなどの概念がないため、メモリ上の画像データを
1コマずつAVIとして出力するので簡単なのですけど。
なぜDirectShowにはそのような機能がないのか不思議に思います。
682676:2010/04/22(木) 22:31:21
>>679
失礼、PlatformSDKですね。
683デフォルトの名無しさん:2010/04/22(木) 23:52:12
>>681
だからソース読めって言ってるだろw
機能がないとかじゃなくて、お前が全くDirectShowの使い方を知らないだけ。
>>677 で既に実装方法書いてるだろ。
684デフォルトの名無しさん:2010/04/23(金) 05:05:57
ドキュメントとソースコード読んだのになぜか実装されません
読むとソースコードできるんじゃないんですか?
685676:2010/04/27(火) 22:09:35
>>681
初心者で申し訳ないです。
ソースフィルタにプロセス間通信でデータを渡すことのできる機能
を実装する、ということですよね?
今はその方向で検討中です。
686デフォルトの名無しさん:2010/04/30(金) 08:31:33
IID_ISpecifyPropertyPagesを使用して
USBカメラのフィルタのプロパティページを表示し
設定しています。この設定値、毎回初期化されて困っています。

IID_IAMCameraControl、IID_IAMVideoProcAmpインターフェースで
カメラ設定タブ、ビデオ設定タブはプロパティページを介さず設定できたのですが
USBカメラ固有のプロパティを設定するインタフェースはどうればよいのか教えてください。

目的は、フィルタのプロパティページでカメラ固有のプロパティが
保存したいというものでそのような方法あればどのような形でも
結構ですのでお願いします。
687デフォルトの名無しさん:2010/04/30(金) 11:05:57
ヘルプにも書いてあるが、プロパティページはあくまでデバッグ用途のものだからね。
OLE/COM Object Viewerでどんなインタフェースを持っているのか調べてみたら?
688デフォルトの名無しさん:2010/05/09(日) 12:49:05
「ビデオ入力デバイスからの映像をAVIに保存する」
ttp://www.geekpage.jp/programming/directshow/video-capture-save-avi.php
のところで、同時に2ファイルに出力したいです。
#define OUTPUTFILENAME2 L"save2.avi"
IFileSinkFilter *pSink2;
IBaseFilter *pFileOut2;
pCaptureGraphBuilder2->SetOutputFileName(&MEDIASUBTYPE_Avi,
OUTPUTFILENAME2, &pFileOut2, &pSink2);
を追加すると、
// Graphを生成する
pCaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_CAPTURE,NULL, pDeviceFilter, NULL, pFileOut);
ができません。
上手な手はないでしょうか?よろしくお願いします。



689デフォルトの名無しさん:2010/05/09(日) 12:56:14
すみません。ちょっと修正・・・

「ビデオ入力デバイスからの映像をAVIに保存する」
ttp://www.geekpage.jp/programming/directshow/video-capture-save-avi.php
のところで、同時に2ファイルに出力したいです。
#define OUTPUTFILENAME2 L"save2.avi"
IFileSinkFilter *pSink2;
IBaseFilter *pFileOut2;
pCaptureGraphBuilder2->SetOutputFileName(&MEDIASUBTYPE_Avi,
OUTPUTFILENAME2, &pFileOut2, &pSink2);
pCaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_CAPTURE,NULL, pDeviceFilter, NULL, pFileOut2);
を追加すると、
// Graphを生成する
pCaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_CAPTURE,NULL, pDeviceFilter, NULL, pFileOut2);
ができません。
上手な手はないでしょうか?よろしくお願いします。
690デフォルトの名無しさん:2010/05/09(日) 13:07:25
1デバイスに対してなら使用が排他的なら、2つに出力を分配するとか工夫がいるんじゃないかな。
691デフォルトの名無しさん:2010/05/09(日) 21:43:44
分配フィルターをAddFilterして、順番にPINを接続するしかないですかね?
2つに出力を分配するフィルタって、標準でありましたっけ?
692686:2010/05/11(火) 13:53:34
>>687
OLE/COM Object Viewerをつかって
いろいろためしてみたのですが、USBカメラのインタフェースまでたどりつけませんでした
毎回、毎回シャッタースピードを設定するのがめんどうで
どうにかして保存したいのですが、いまだ方法みつからず
693デフォルトの名無しさん:2010/05/12(水) 23:44:53
>>691
SmartTee
InfneetTee
好きなほう使え

>>692
FPSなら設定できる
694デフォルトの名無しさん:2010/06/14(月) 17:24:50
質問させてください。
C#のスレッドで質問してスレ違いと指摘もらいましたので、こちらに転載します。

USBカメラからの静止画だけをキャプチャしたいのですが、どのようにしたらよいのでしょうか。

動画をキャプチャすることを前提に静止画をキャプチャするサンプルはいくつかあったのですが、
これだと動画をキャプチャしている間はなぜかKeyDownイベントがフォームで受け取れず、KeyDown
で一度ブレークポイントをはって止めると、そのあとはKeyDownが効くようになってしまいました。

どのみち動画は不要なので、静止画だけをキャプチャする方法が知りたいです。

よろしくお願いします。
695デフォルトの名無しさん:2010/06/14(月) 17:48:31
>>694
http://pitecan.com/~tsuka/programming/usbcamera.html

DirectShow.NETが新しくなってるから多少書きかえる必要はあるけど。
696デフォルトの名無しさん:2010/06/14(月) 18:11:21
>>695
ありがとうございます。
ただ、そのサンプルだと動画も表示していないと静止画がキャプチャーできないようです。
動画無しにはできないでしょうか。
697デフォルトの名無しさん:2010/06/14(月) 18:12:33
イベントが発生しないのはMessageDrainかもな
http://msdn.microsoft.com/ja-jp/library/cc369762.aspx
俺もひっかかったクチだわ
698デフォルトの名無しさん:2010/06/14(月) 18:14:20
>>696
プレビューしなけりゃいいこと。
699デフォルトの名無しさん:2010/06/14(月) 18:29:52
SampleGrabber使うのなら、直前に色空間変換噛ましてRGB32にしといたほうがいいよ
理由は多くのWebカメラ対応しようとしてこの辺を自前で実装しようとするとめんどくさいからなんだけどね。
AVI DecompressorとColor Space Convetorが基本で、あとはMJPEGやMPGやOverlayMixerとか使うな

時間かけても良くて、速度にこだわるのならFOURCCから色空間判読して自前実装も止めやしないけどね
誰か色空間の相互変換Transform Filter作ってくれないかなー
探したけどffdshow raw video filterぐらいしか見つからなかったわ
700デフォルトの名無しさん:2010/06/14(月) 19:07:15
>>697
便乗質問させて下さい。
MessageDrain に WM_WHEEL を流す方法はないものでしょうか…。
ビデオレンダラを再実装でもしない限りやっぱり無理でしょうか。
701デフォルトの名無しさん:2010/06/14(月) 20:13:16
>>700
自分の場合はMessageDrainするWndではなくて、ParentWndがWM_WHEELを受け取る設計にしてる
どうしてもそれが無理ならGlobalHook使えばいいと思うよ
702デフォルトの名無しさん:2010/06/14(月) 20:23:02
補足。上記方法はウィンドウモード(非ウィンドウレス)で、旧レンダラとVMR7とVMR9でWM_WHEELは確認しました
703デフォルトの名無しさん:2010/06/15(火) 13:14:18
>>701,702
ありがとうございます。

> ParentWndがWM_WHEELを受け取る設計
こんなことが可能なのですか…。メッセージの流れ方を勉強して出直してきます。orz
704デフォルトの名無しさん:2010/06/17(木) 17:17:36
こんにちは。
今、VMR9を使って、二つの動画のミキシング再生を行うソフトを作っています。
IVMRMixerControl9でそれぞれの動画の位置を変えたりできるので
ミキシングモードで動画を読ませるまでは行けたようなのですが、
それぞれの動画用のIMediaControlやIMediaSeekingが取れないので、うまく
動画の再生開始やシーク位置調整ができません。
どうしたら、どうすればそれぞれの動画用のIMediaControlやIMediaSeekingを
生成できますでしょうか?

それとも根本的に間違っているのでしょうか?
ヒントだけでも教えてもらえたら助かります。よろしくお願いします。
705デフォルトの名無しさん:2010/06/17(木) 22:37:58
IMediaナントカはIGraphBuilderからQueryInterfaceすればいい
706704:2010/06/18(金) 02:34:37
>>705
レスありがとうございます。
ですが、その方法では動画を二つ読ませるミキシングモードではうまく
いかなくて困っています。
 (前略)
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGB);
 (中略)
pGB->RenderFile(wFile1, NULL);
pGB->RenderFile(wFile2, NULL);
pGB->QueryInterface(IID_IMediaControl, (void **)&pMC);
 (中略)
pMC->Run();

では、wFile1とwFile2が同時に動いてしまいます(当たり前)
IVMRMixerControl9からは、dwStreamIDを使ってwFile1の動画の位置、
wFile2の動画の位置を個別にコントロールできるので、何らかの方法で
この状態の二つの動画の片方づつへと再生開始等のコマンドが送れるはずだと
思うのですが、まだ見つけることができません。
よろしくお願いします。
707デフォルトの名無しさん:2010/06/18(金) 03:00:37
もし自分なら2つGraphBuilder作るかな
708デフォルトの名無しさん:2010/06/18(金) 14:04:47
GMFBridge辺りを修正して別のグラフの二つのストリームを、
VMRのグラフへ同時に入れれるようにしないと無理なんじゃないかね。
709デフォルトの名無しさん:2010/06/18(金) 16:33:11
Platform SDK 2003 SP1付属のTextture3D9サンプルで質問をさせてください

VisualC++2008でUnicode文字セットを使用するを指定しビルドかけたところ、リンクで
>DShowTextures.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall CBaseVideoRenderer::CBaseVideoRenderer
>(struct _GUID const &,unsigned short *,struct IUnknown *,long *)" (??0CBaseVideoRenderer@@QAE@ABU_GUID@@PAGPAUIUnknown@@PAJ@Z) が
>関数 "public: __thiscall CTextureRenderer::CTextureRenderer(struct IUnknown *,long *)" (??0CTextureRenderer@@QAE@PAUIUnknown@@PAJ@Z) で参照されました。
というエラーがでます。

CTextureRenderer::CTextureRenderer( LPUNKNOWN pUnk, HRESULT *phr )
: CBaseVideoRenderer(__uuidof(CLSID_TextureRenderer),
NAME("Texture Renderer"), pUnk, phr),
m_bUseDynamicTextures(FALSE)
{
// Store and AddRef the texture for our use.
ASSERT(phr);
if (phr)
*phr = S_OK;
}

該当箇所は上記なのですが、Unicode文字セットでビルド通すにはどうすればよいでしょうか?
710デフォルトの名無しさん:2010/06/18(金) 21:12:50
PlatformSDKが古い
711デフォルトの名無しさん:2010/06/18(金) 21:45:50
BaseClasses
712704:2010/06/18(金) 22:19:38
>>707,708
ありがとうございます。
頑張って修正してみます。
713デフォルトの名無しさん:2010/06/27(日) 16:46:59
既存のフィルタとほとんど同じ動作をさせたいフィルタを作りたくて、
既存のフィルタを継承させてclass定義みたいなことって出来るんですかね?

結局CBaseFilterを継承させて内部でその既存のフィルタ呼び出してみたいなことをしないといけないのかな?
COMよく分からない。。。
714デフォルトの名無しさん:2010/06/27(日) 22:54:10
既存のフィルタってのがdllなら継承はできない。ソースがあるのなら勿論おk。
自作フィルタ内にてDirectShowをアプリケーション利用するって方式を想像してるかもしれませんが、Wrapperは相当難しいと思う
おそらく、一番楽そうなのはDLL Hackの方法かな
715デフォルトの名無しさん:2010/09/12(日) 12:01:45
やっべぇぜ。

DirectShowでnVIDIAの3D Vision対応動画を表示させることになったが、
IRリミッターの制御やらなんやらがさっぱりわからん。
#この点はスレ違いですまん

NVAPIあたりを触ればいいというところまでは解ったけども、
本当に表示できるのかどうかがわからなくなってきた。

とりあえず、このコードでサンプル3D映像を表示できる、というものが
どこかにないかい?
716デフォルトの名無しさん:2010/09/12(日) 12:48:30
717デフォルトの名無しさん:2010/09/12(日) 12:58:50
横からごめん。URL1行レスに爆笑してしまった
718デフォルトの名無しさん:2010/09/17(金) 18:11:40
すみません、質問があるのですがよろしいでしょうか?
長文で申し訳ありません。

m2tsファイルをレンダーして、そのファイルの時間幅を
IMediaSeekingのGetDurationを使用して取得しています。
自分のPCでは問題なく取得できているのですが、特定のPCで取得できません。
違いがあるとすれば
私のPC:WindowsXP SP2
ダメなPC:WindowsXP SP3(もしくはWindows7)
です。
WindowsXP SP2以前のPCでは大丈夫のようです。
XPがSP2からSP3に変わることで何かDLLなりが更新されたのでしょうか?

コーデック等全て同じ条件でインストールしているつもりです。
(勿論SP3特有のコーデックがあるのは知ってますが)
動いてたSP2をSP3にUpdateすると動かなくなります。

ちなみにフィルタの構築も自分で全部指定していますしレンダーもオートレンダーではなく、自分で全て構築しています。
フィルターの構築・ピンの接続等でエラーが発生しないのはデバッグモードでも確認済みで、レンダーは正しく完了しています。

後出しですみません。
動画の再生自体はSP2でもSP3でも問題なく出来ます。
再生してる途中でGetCurrentPositionやGetPositionsを実行すると正しいカレント位置が返ってきますが
GetDurationが失敗して正しい値が取れません。
(エラーコードが0x80004001が返ってきます)
もう一つSetPositionsを実行するとエラーになります。
(エラーコードが0x80004001が返ってきます)
最初から最後まで再生して、最後の位置でGetPositionsを実行すれば動画ファイルの時間幅は取得できるのですが
再生前にGetDurationなどで時間幅情報を取得するのにエラーが返ってくるという状況です。
(IMediaSeekingはGraphBulderからQueryInterfaceで取得してます。)
719デフォルトの名無しさん:2010/09/17(金) 19:25:18
SetTimeFormat
720デフォルトの名無しさん:2010/09/17(金) 22:36:02
すいません。教えてください。
USBカメラの調整をOleCreatePropertyFrameでできると思いますが、これと
同じ調整を値を指定してソフトから設定してやることはできるでしょうか。
(たとえば明るさを50にする等)
よろしくお願いします。
721デフォルトの名無しさん:2010/09/18(土) 01:27:56
>>718
MPEG2-TSのファイルだったらMPEG2デマルチプレクサフィルタの仕様によるんじゃないか

>>720
IAMVideoControl
IAMVideoProcAmp
IAMCameraControl
あたりじゃないかな
722デフォルトの名無しさん:2010/09/21(火) 13:21:59
http://hisoap.jugem.jp/?eid=140
のサンプルをVS2008ではビルド&実行できたのですが、VS2005でDshow.hが見つからない
エラーするのですが、Platform SDKや、DirectX SDK をインストールする必要が
ありますか?
723デフォルトの名無しさん:2010/09/23(木) 13:02:50
Windows SDKだったかなDShow.hは
724デフォルトの名無しさん:2010/09/28(火) 15:59:31
1>main.obj : error LNK2001: 外部シンボル "_PIN_CATEGORY_PREVIEW" は未解決です。
1>main.obj : error LNK2001: 外部シンボル "_IID_IBaseFilter" は未解決です。
1>main.obj : error LNK2001: 外部シンボル "_CLSID_VideoInputDeviceCategory" は未解決です。
1>main.obj : error LNK2001: 外部シンボル "_CLSID_SystemDeviceEnum" は未解決です。
1>main.obj : error LNK2001: 外部シンボル "_IID_ICreateDevEnum" は未解決です。
1>main.obj : error LNK2001: 外部シンボル "_IID_IMediaControl" は未解決です。
1>main.obj : error LNK2001: 外部シンボル "_CLSID_CaptureGraphBuilder2" は未解決です。
1>main.obj : error LNK2001: 外部シンボル "_IID_ICaptureGraphBuilder2" は未解決です。
1>main.obj : error LNK2001: 外部シンボル "_CLSID_FilterGraph" は未解決です。
1>main.obj : error LNK2001: 外部シンボル "_IID_IGraphBuilder" は未解決です。
は何が悪いんでしょうか?
VS2005です
725デフォルトの名無しさん:2010/09/28(火) 16:18:06
「外部シンボル は未解決です」
これをググってから出直せ。
726デフォルトの名無しさん:2010/09/28(火) 16:19:34
必要なlibがリンクされてない
727デフォルトの名無しさん:2010/09/28(火) 16:41:22
優しさは罪
728デフォルトの名無しさん:2010/09/28(火) 18:30:47
頭が悪いってちゃんと正解教えてやれよ
729デフォルトの名無しさん:2010/09/29(水) 00:57:01
このレベルで止まってたらDirectShowとなんて戦えないぞ。
730デフォルトの名無しさん:2010/09/29(水) 03:27:51
いや、ある意味ここが一番難しいとも言える。
731デフォルトの名無しさん:2010/09/29(水) 12:11:39
DirectShowのどこらへんがDirectなのか俺にもわかるように説明してくれないか。
732デフォルトの名無しさん:2010/09/29(水) 13:15:07
DirectXファミリーだから。
733デフォルトの名無しさん:2010/09/29(水) 16:41:26
MSだって「あれ? これDirectXじゃないんじゃね?」と思ったくらいなんだから、
誰にも説明できないだろ。
悟れよ。
734デフォルトの名無しさん:2010/09/30(木) 11:52:55
ActiveMovieを知らずにDirectShowを語っていいのは
小学生までだよねー(AAry
735デフォルトの名無しさん:2010/09/30(木) 15:14:45
もったいぶらずに
ダイレクトに答えを示せよ。だからDirect Showだろ。
736デフォルトの名無しさん:2010/09/30(木) 15:24:25
DirectXはユーザーレベルでダイレクトにハードウェアを操作できるからDirectじゃないの?
DXVAが出る前なんかはDirectShowにDirect感が全くしなかったし、むしろDXVA主流の今こそDirectXに入るべきだろう。
逆にDirectSoundはカーネルミキサーを越えられないならDirectXから外れていいよ。
737デフォルトの名無しさん:2010/09/30(木) 16:20:59
DirectDrawやDirect3Dも別にハードウェアを直接触れるわけじゃないけどな
738デフォルトの名無しさん:2010/09/30(木) 21:55:54
直に見ろ
739デフォルトの名無しさん:2010/09/30(木) 23:40:17
生がいいよね
740デフォルトの名無しさん:2010/10/02(土) 09:34:50
>>724
DirectShowのヘルプのファーストステップガイドに書いてある。
741デフォルトの名無しさん:2010/10/21(木) 23:49:59
H264のスライスヘッダの後ろのスライスデータ部って先頭はバイトバウンダリでしたっけ?
スライスヘッダからビット状態で続くんでしたっけ?・・・・

スライスヘッダの参照IDだけ変えたいんですがビット数がかわってずれるのを
どこまでずらせばいいのかわかんねorz
742デフォルトの名無しさん:2010/10/23(土) 00:31:34
ずらしちゃいやーん
743デフォルトの名無しさん:2010/10/25(月) 21:28:28
DirectShowを使った音楽再生ソフトを作っているのですが
RenderFileで読み込んだファイルの種類を判別するにはどうすればいいですか?
ユーザーが音楽以外の動画や画像ファイルを読み込もうとした場合に弾きたいのです
744デフォルトの名無しさん:2010/10/25(月) 23:42:08
ファイルの最初の数バイトを読み込んで判別
745デフォルトの名無しさん:2010/10/28(木) 02:43:22
DirectShowで動画と音声を含むファイルを読み込む際、音声のみを読み込むにはどうしたらいいでしょうか?
NullRendererをグラフに追加してからグラフを作成してみたりしましたが、ファイルにより音声が破棄されたり
動画が破棄されたりまちまちで困ってます。
入力されるファイルの形式が予測できないのでインテリジェント接続を使いたいのですが・・・
746デフォルトの名無しさん:2010/10/28(木) 03:08:47
メジャーメディアタイプでビデオのみ受け付けるヌルレンダラ作ればいいんじゃね。
747デフォルトの名無しさん:2010/10/28(木) 04:03:07
ああ・・・やっぱりそうなりますか
ありがとうございます
748デフォルトの名無しさん:2010/10/28(木) 10:47:07
>>743
ファイル名のエクステンションをチェック
>>745
グラフを構築した後、ビデオレンダラーをNullRendererに置き換える
ビデオレンダラーのウィンドウハンドルをNULLにする手もあったかな、ちょっと自信がないが…
749745:2010/10/28(木) 20:28:11
>>748
その方法で、スプリッタの直後にNullRendererは挿入可能でしょうか?
ビデオのデコーダーを挟みたくないのです。
750デフォルトの名無しさん:2010/10/29(金) 01:06:34
ビデオ側だけピン切って何も繋がなければいいじゃん
751デフォルトの名無しさん:2010/10/29(金) 06:59:38
ファイルソースの出力ピンとオーディオレンダラーの入力ピンを明示的にIGraphBuilder::Connectにかければ
ムダなフィルタは一切はいらんじゃろ。

その辺はGraphEditとかで操作してイメージ掴んでからコードに落としてみなされ
752745:2010/10/29(金) 22:55:52
>>751
なるほど!ありがとうございます
753デフォルトの名無しさん:2010/11/15(月) 12:08:55
-
754デフォルトの名無しさん:2010/11/22(月) 13:37:20
アプリに動画含めて配布したい場合ライセンスとかインストールされてるか
とか考える場合wmvにするしかないのですか?
755デフォルトの名無しさん:2010/11/23(火) 19:52:11
SCFHみたいな仮想WEBカメラを作ろうと思ってるんだけどDirectShow未経験だから厳しくて・・・
どういう流れで作ればいいの?
教えてエロい人
756デフォルトの名無しさん:2010/11/24(水) 00:07:57
757デフォルトの名無しさん:2010/11/24(水) 00:11:10
758デフォルトの名無しさん:2010/11/24(水) 02:25:29
まずはソースフィルタを作って、それから必要なインターフェイスを実装して、更に登録するカテゴリをデバイスにする。
カメラのようなデバイスを扱うものは、OSがラップしてDirectShowとして使えるようになっていた気がする。
ドライバ作るよりは、フィルタで作ったほうが簡単だろう。
てか、それを自力で調べられないなら作るのは厳しいと思われる。
759デフォルトの名無しさん:2010/11/28(日) 01:02:08
フィルターを使わずに字幕みたいな文字列を表示させることってできますか?
フィルター作るの大変すぎ
760デフォルトの名無しさん:2010/11/28(日) 01:05:53
あげ
761デフォルトの名無しさん:2010/11/28(日) 02:20:11
DirectShowフィルタ作らないならスレ違いだから他所でやってくれ

スレ違いだけどヒントだけ
透明ウィンドウを作って文字を書く
他のものに重ねたいならさらにレイヤードィンドウ
762デフォルトの名無しさん:2010/11/28(日) 02:20:53
ドィンドウってなんだw レイヤードウィンドウな
763デフォルトの名無しさん:2010/11/28(日) 09:56:04
>>761
ありがとうございます。
でもなんかできないです。
DirectXの画面はこう言うのできないんじゃないですか?
764デフォルトの名無しさん:2010/11/28(日) 10:21:41
なにがしたいかによる
レイヤードウィンドウで解決できるものもあれば、ゲーム画面のサーフェスに書かなきゃならない場合もある
しかしすべてDirectShowの範囲じゃない。スレ違いなんだから素直に消えてくれ

以後レスあってもスルーする

スレ違失礼
765デフォルトの名無しさん:2010/11/28(日) 10:33:01
やりたいことはDirectShowで再生されたどうがの上に字幕みたいな
文字列を書くことです。ゲームではないです。
766デフォルトの名無しさん:2010/11/28(日) 13:13:09
VMR使え
767デフォルトの名無しさん:2010/11/28(日) 13:18:08
VMR調べてみました。一見よさそうなのですが
環境依存が激しいみたいです
なんかハードの設定によって使えないとかあるみたいです><
768デフォルトの名無しさん:2010/11/28(日) 13:22:09
楽したいならある程度切り捨てろ。
VMRならDirectXに対応しないものは全部とか。

嫌なら自分でフィルター書け。
769デフォルトの名無しさん:2010/11/28(日) 14:11:36
SampleGrabberとか使って毎フレーム自分で描画してついでに文字も描画したらいんじゃね?
770デフォルトの名無しさん:2010/11/28(日) 22:33:59
>>769
ありがとう。それも調べてみるね。
771デフォルトの名無しさん:2010/11/30(火) 11:35:49
質問失礼します。

FlashMediaLiveEncoder(以下、FME)で読み込めるDirectShowFilterを作成中です。
テンプレート、フィルター、ピン情報を修正して、GraphEditのVideo Capture Sourcesに登録する事はできました。
私が作ったFilterが、FMEのDeviceリストに表示されているのですが、選択すると、

Problem with video capture device.
Please verify that the video capture device is working correctly and is not
already in use.

と警告が出てしまいます。
FMEのEncodingLogには、

Tue Nov 30 2010 11:29:16 : Selected video input device: PrjNikoFilter
Tue Nov 30 2010 11:29:17 : Error : Could not find the selected video device
Tue Nov 30 2010 11:29:17 : Error : Could not find the selected video device
Tue Nov 30 2010 11:29:17 : Problem with video capture device. Please verify that the video capture device is working correctly and is not already in use.

と出力されていました。
VS2008で追ってみたところ、コンストラクタが呼ばれた直後にデストラクタの呼び出しが行われていました。
(逆アセンブリまで行ってしまったので、呼び出し履歴やステップ実行で追えませんでした)

どうやったら正常にFMEに認識させる事ができるのでしょうか?
同じ症状の解決方法をご存じの方いましたら、お願いします。
772デフォルトの名無しさん:2010/11/30(火) 12:34:41
FlashMediaLiveEncoderの話であって、Directshow関係ないだろ
773デフォルトの名無しさん:2010/11/30(火) 12:49:34
最低限必要なインターフェイスが実装されていないために扱えないのだと思う。
あと動作確認するならSkepeでの動作も見ないとな。使用者が多いのでこれで正常動作しないと運用に困ることになる。
774デフォルトの名無しさん:2010/11/30(火) 15:40:02
FlashMediaLiveEncoderはこういう話もあるから気をつけて名。
http://alax.info/blog/1138
自作のDirectShowフィルタを他アプリケーションから映像ソースとして見られるようにするプログラムのサンプルあったら教えてください。
776デフォルトの名無しさん:2010/12/04(土) 16:58:24
DirectShowフィルタ作ってhoge.axっていうフィルタファイルを作ったんだが
regsvrex32でレジストリに登録しようとするとエントリポイントが見つからないって言われて...
エントリポイントって
  extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);

  BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
  {
    return DllEntryPoint((HINSTANCE)(hModule), dwReason, lpReserved);
  }
じゃダメなの?
777デフォルトの名無しさん:2010/12/04(土) 18:26:59
DllCanUnloadNow
DllGetClassObject
DllRegisterServer
DllUnregisterServer
があるかどうかじゃね?普通に作れば実装されていると思うが・・・
778デフォルトの名無しさん:2010/12/04(土) 22:55:47
マルチ
779デフォルトの名無しさん:2010/12/14(火) 01:19:58
DirectShowを使って動画を再生するプレイヤーを作っていて、シークバーを実装したいのですが、どうすればいいでしょうか?
780デフォルトの名無しさん:2010/12/14(火) 01:24:10
適当にTrackBarかなんか用意して
ユーザーが動かしてないとき・・・タイマーで再生位置取得→スライダーの位置更新
ユーザーが動かしているとき・・・スライダーの位置を元に再生位置変更
781デフォルトの名無しさん:2010/12/14(火) 01:25:01
追記
再生位置を取得/設定するのはIMediaSeekingでも使えばいいんじゃない?
782デフォルトの名無しさん:2010/12/14(火) 03:32:20
>>780-781
ありがとうございます、頑張ってみます
783デフォルトの名無しさん:2010/12/14(火) 16:00:52
GetDurationで取得した値を、秒単位にしたいのですがどうすればいいでしょうか?
784デフォルトの名無しさん:2010/12/14(火) 16:03:58
教えてください。
DirectShow & Windows7 で mpeg2 のファイルを再生
(最終的には各フレームの画を抜き出)してみたいと思っています。

・WMP では問題なく再生できます。
・GraphEdit にファイルを入れると「このムービーのストリームには、
 サポートされていない形式のものがあります。」とエラー?が表示され、
 音声のみのグラフが形成されます。複数の mpeg2 ファイルで同様です。
・avi ファイルなどは問題なく動画と音声を再生することができます。
・Microsoft DTV-DVD Video Decoder を自分で挿入してその後ろに
 Video Renderer や Sample Grabber などをつなげようとしても
 「接続に必要な中間フィルターの組み合わせがみつかりませんでした」と
 エラーが表示されます。
・プログラムで IMediaControl::RenderFile を使用して mpeg2 のファイルを
 設定しようとすると 0x00040242 のエラーコードが返ってきます。

環境は Windows7 で、OS をインストールした後に VisualStudio2008 を入れ、
WMP のセットアップを走らせただけの状態です。
GraphEdit は SDK などをインストールしないで実行ファイルのみを
コピーしました。念のため GraphStudio でも同じことをしてみましたが、
エラーメッセージが表示されないだけで結果は同じでした。

1. Microsoft DTV-DVD Video Decoder の Video Output1 ピンに先の
 Video Renderer や Sample Grabber を繋げるにはどのようにすればよいのでしょうか。
2. IMediaControl::RenderFile の戻り値 0x00040242 の意味を知りたく、
 ヘッダファイルを検索してみたのですが見当たりませんでした。VS の
 エラールックアップのようなものはないでしょうか。

ご教示いただければ幸いです。
785デフォルトの名無しさん:2010/12/14(火) 18:50:21
Microsoft DTV-DVD Video Decoderのピン出力のformattypeがFORMAT_VIDEOINFO2のみなので、
FORMAT_VIDEOINFOを要求するフィルタには接続できないんだろう。
786デフォルトの名無しさん:2010/12/14(火) 20:21:47
vfwmsgs.h:624:#define VFW_S_PARTIAL_RENDER ((HRESULT)0x00040242L)
787デフォルトの名無しさん:2010/12/14(火) 23:12:55
Windows7って最初からmpeg2videoのデコーダ入ってるんだ。知らなかった。
んじゃプルのDemuxもあるのか?
788デフォルトの名無しさん:2010/12/14(火) 23:28:04
TSの話なら無理
WMPでは再生できるけど。
789784:2010/12/15(水) 09:41:55
返信をありがとうございます。

やっぱりそうですよね。
このまま使うならお勉強して対応するピンをもったフィルタを作らないといけないのか。。。
※無理っぽい

VFW_S_PARTIAL_RENDER なんて定義があったのですね。
勉強不足でした。
790デフォルトの名無しさん:2010/12/15(水) 12:53:51
それくらい作れよw
791784:2010/12/15(水) 16:43:12
うん。いま、あきらめてフィルタ作りのお勉強してます。(´・ω・`)

てきとうなサンプル見つけて動かして、改造して‥‥
ピンが接続されていないので、操作は続行できません。0x80040209
ってなんだー、と頭を抱えてるところ。w
792デフォルトの名無しさん:2010/12/15(水) 16:54:56
vfwmsgs.h:138:#define VFW_E_NOT_CONNECTED ((HRESULT)0x80040209L)
793デフォルトの名無しさん:2010/12/15(水) 16:55:21
ttp://msdn.microsoft.com/ja-jp/library/cc352402.aspx
このページを参考にシークバーを作成してみたのですが、FLVファイルをシークしようとするとエラーが出て止まってしまいます。

HEAP[tes.exe]: HEAP: Free Heap block 8365fe0 modified at 8388f50 after it was freed
Windows によって tes.exe でブレークポイントが発生しました。

ヒープが壊れていることが原因として考えられます。tes.exe または読み込まれた DLL にバグがあります。

あるいは、tes.exe がフォーカスを持っているときに、ユーザーが F12 キーを押したことが原因として考えられます。

可能であれば、出力ウィンドウに詳細な診断情報が表示されます。

FLVファイルはYouTubeからダウンロードしたもので、
スプリッタにはFLVSplitter.axがデコードにはffdshowが使われています。
他のmp4やwmvなどでは問題なかったのですが、どなたか原因を知りませんでしょうか?
794デフォルトの名無しさん:2010/12/15(水) 17:44:04
>>783
IMediaSeeking::SetTimeFormatでタイムフォーマットをTIME_FORMAT_MEDIA_TIMEにすると
IMediaSeeking::GetDuration()で100 ns単位の値が返ってくるので秒に換算したらよかろう
100 ns
=100*10^(-9) s
=10^(-7) s
1 s
=10^7 * 100 ns
795デフォルトの名無しさん:2010/12/15(水) 17:58:34
>>792
thx
なんででるんだろう。。。
796デフォルトの名無しさん:2010/12/15(水) 18:16:11
接続されていないからでは・・・
797デフォルトの名無しさん:2010/12/17(金) 18:34:23
映像をRenderFileしたものから映像フィルターを削除して音だけ再生させる
ことってできませんか?
798デフォルトの名無しさん:2010/12/17(金) 18:43:08
できる
799デフォルトの名無しさん:2010/12/17(金) 23:57:22
IGraphBuilderからEnumしてIFilterGraphをもってくるのは
わかったんですが、どれが映像のフィルタでどれを削除すれば
いいんでしょうか?
800デフォルトの名無しさん:2010/12/18(土) 00:18:42
ピンのフォーマットでも見れば?
ダミーのビデオレンダラを生成してそれを後で削除って方法や色々やりようがあると思うけど。
801デフォルトの名無しさん:2010/12/21(火) 01:18:50
以下のスキームで先頭に巻き戻して先頭から再生すると、再生開始直後に「プチッ」というノイズが発生してしまいます。
IMediaControl::Stop()
IMediaSeeking::SetPositions(0, AM_SEEKING_AbsolutePositioning, duration, AM_SEEKING_AbsolutePositioning)
IMediaControl::Play()
考えられる原因はなんでしょうか?ご教授お願いします。
802デフォルトの名無しさん:2010/12/21(火) 21:02:15
マネージ型のDirectSoundでは
プライマリーバッファがクリアされないためにノイズが出る不具合が
知られているが、それか?

対策は、停止した時[再生する前]に無音データを0.2秒ほど再生する
803デフォルトの名無しさん:2010/12/21(火) 21:08:08
再生する前じゃダメだな、停止する時、無音データを追加再生する
に変更
804デフォルトの名無しさん:2010/12/21(火) 22:08:48
なるほど、ありがとうございます。
試してみます。
805デフォルトの名無しさん:2010/12/28(火) 11:04:35
教えてください。

1. 自作でフィルタを作ろうと思います。
  このフィルタの入力形式(ピンの設定)に優先順位を指定することは可能でしょうか。

  たとえばサブタイプを、RGB32 > YUY2 の優先順位にして、フィルタの組み合わが
  存在するのであれば IMediaControl::RenderFile() などによるグラフの自動生成の際に
  RGB32 を入力としたグラフを生成させることは出来ますか。

  今の環境ではレンダラフィルタを作成する場合に CBaseRenderer::CheckMediaType をオーバーライドして
  RGB32 でも YUY2 でもどちらも接続を許してしまうと YUY2 で接続されてしまいますが、
  RGB32 の方が処理が楽なので、出来ればそちらで繋いでほしいのです。

2. フィルタ内の処理の高速化について。

  素人考えでは、画素数の大きな動画ファイルの形式変換などを行なう場合、
  画素ごとに処理をベタで行なうとかなりの時間が掛かるように思います。

  それ自体はミリ秒単位ですむので人間の感覚としては大したことはないのですが、
  普通の動画の秒辺りのフレーム数などを考えると処理が間に合わなくなりコマ落ちしそうです。
  それでも出回っているフィルタでは、複雑そうなことをしているものでもコマ落ちなどはしていないと思います。

  ベタな処理の高速化というと、処理をマルチスレッド化して、たとえば処理するフレーム画を
  数分割して別個のスレッドに平行して処理させるなどの方法くらいしか思いつかないのですが、
  このあたりはどのように考えるべきなのでしょうか。

以上、ご教示ください。
806デフォルトの名無しさん:2010/12/28(火) 11:28:49
DMA
807デフォルトの名無しさん:2010/12/28(火) 14:23:47
何フィルタ作ろうとしてるのか、どのような接続を考えているのかわからんけど
1. できるけど、相手側にも都合があるよ
2. そこが腕の見せ所
808805:2010/12/28(火) 20:37:46
返信をいただき、ありがとうございます。

>>806
Direct Memory Access のことでしょうか。
ハードでやってるいるのなら参考には出来ないですね。。。

>>807
いくつかの種類の動画を特定のフォーマットに変換するプログラムを作成したく、
動画の中の各フレーム画を抜き取るために DirectShow を使えないかと考えています。

それで、対応する(元の)動画の中に個性的なフィルタを使用しなければならないものがあって、
それに対応しつつ、他のフィルタにも同じように使用できるフィルタを作りたいな、と。
後ろに動画の情報を流してあげる必要がないので、いまのところはレンダラフィルタを想定しています。

1. やるとしたら、どのような方法になるのでしょうか。
2. この類の経験がなく、方向性に悩んでいます。
  もしご存じでしたら、方法論のヒントだけでもいただけないでしょうか。
809デフォルトの名無しさん:2010/12/28(火) 22:25:47
>>808
そういう用途なら素直にTransformフィルタベースでいいと思うよ。
後ろにはNULLレンダラを繋げておけば良い。
動画変換と同時にリアルタイムプレビューするのでなければコマ落ちの心配はいらん。
810805:2010/12/29(水) 22:51:41
>>809
ありがとうございます。
年明けになりますが、その方向も入れて考えてみます。
811デフォルトの名無しさん:2010/12/30(木) 06:56:21
>>808
自分が過去にやったネタ

(1) サンプルグラバを使う
(2) サンプルにあるDumpフィルタをカスタムして使う

敷居が低いのは前者だけど、
いろいろ細かいことがやりたいなら後者がオススメ。
Nullレンダラも不要。
もちろん代償もあるけど、
Transformフィルタベースで作ったって大変だし。
812デフォルトの名無しさん:2010/12/31(金) 12:33:03
>>805
おい525、ここも荒らす気か?
813デフォルトの名無しさん:2010/12/31(金) 21:22:18
こいつDTV板にいる痛いヤツ
http://hibari.2ch.net/test/read.cgi/avi/1291483163/
814525:2011/01/01(土) 11:40:36
>>812-813
>>805 は、自分じゃないですよ。
815デフォルトの名無しさん:2011/01/04(火) 23:01:29
USBカメラのビデオキャプチャで録画開始時間と終了時間を管理したいのですが、いい方法はないでしょうか?
avi以外の形式でビデオキャプチャすれば可能な気がするのですが方法がわかりません。。
816デフォルトの名無しさん:2011/01/05(水) 01:42:48
それはプログラミングの質問か?
817815:2011/01/05(水) 07:50:47
>>816
はい。
818デフォルトの名無しさん:2011/01/05(水) 10:38:15
開始終了時に現在時刻をとってくればいいんじゃないの
819デフォルトの名無しさん:2011/01/05(水) 13:09:29
ファイルの作成時刻見るだけだろ・・・
820815:2011/01/05(水) 16:22:35
録画開始指示(run)から実際に録画が開始されるまでのタイムラグが知りたいんです。。
他のデータと同期をとるためにミリ秒レベルでわかれば嬉しいんですが、、、
821デフォルトの名無しさん:2011/01/05(水) 17:00:12
IMediaControlのRunして戻ってくるまででいいんじゃねえの?
822デフォルトの名無しさん:2011/01/05(水) 17:51:55
サンプルグラバでタイムスタンプ取れなかったっけ?
823デフォルトの名無しさん:2011/01/05(水) 18:14:18
Runした時点で開始だろ。
いつから待機する仕様になったんだ?
824デフォルトの名無しさん:2011/01/06(木) 08:45:40
Run〜実際の録画開始時刻のタイムラグが気になるようなら
フィルタ挟み込んで調べる以外に方法はないだろうな。
茨の道だとは思うが。
825デフォルトの名無しさん:2011/01/06(木) 21:04:22
DirecthShowに関して質問があります
IGraphBuilder::RenderFile(FILENAME, NULL) でオート接続した場合に選択されるデコーダフィルタのCLSIDを
取得するにはどのようにすれば良いのでしょうか?

やりたいことは

SourceFilter->DecoderFilter->SmartTee Filter->PreView側:RenderFilter
        ->Capture側:SampleGraber

と手動で接続することです。
DecoderFilterのCLSIDが取得できれば CoCreateInstanceでフィルタを作成して
IGraphBuilder::AddFilter()でフィルタを追加した後に手動で接続することができるのですが、
CLSID が取得できないため手詰まりとなっております。

ヒント等で結構ですのでご教授願います。


826デフォルトの名無しさん:2011/01/07(金) 00:49:20
AddToRotしておけばグラフ構成がわかる
827デフォルトの名無しさん:2011/01/07(金) 00:51:48
>>820
VMR9のレンダーレスモードを使ってコールバックされる
タイミングをチェックするのが最適かと。
ただ、その場合描画も自前でやる必要があるけど、
精度にこだわるならそれくらいしてもいいでしょ。
828デフォルトの名無しさん:2011/01/07(金) 00:51:58
訂正:グラフエディタでわかる
829デフォルトの名無しさん:2011/01/07(金) 00:55:37
割り込みスマソ
AddToRot→GraphEditは便利だよね
830815:2011/01/07(金) 07:42:45
みなさんアドバイスありがとうございました。
描画を自前で用意することも考慮にいれてもう少し模索してみたいと思います。
831825:2011/01/07(金) 18:50:24
>826さん、829さん返答ありがとうございます。
ですが私の言葉足らずで質問の意図が伝わっていなかったため再度質問させて下さい。

あらかじめファイルフォーマットがわかっている場合にはグラフエディタを用いてデコーダフィルタのCLSIDを取得する方法でも可能ですが、
任意のファイルフォーマットで下記グラフフィルタを構成するための方法がわからず困っています。

SourceFilter->DecoderFilter->SmartTee Filter->PreView側:RenderFilter
                        ->Capture側:SampleGraber


SmartTeeフィルタをグラフに挿入後にPreviewピンとCaptureピンをRenderFilterとSampleGraberに接続する方法だと
それぞれにデコーダフィルタが挿入される構成になり、処理に無駄が生じてしまっています。

SourceFilter->SmartTee Filter->PreView側:->DecoderFilter->RenderFilter
                ->Capture側:->DecoderFilter->SampleGraber

どのようなアプローチがよろしいのでしょうか?
アドバイスをお願いいたします。
832デフォルトの名無しさん:2011/01/07(金) 18:57:04
>>831
一旦自動で繋いだ後にフィルタを列挙し、
レンダラの直前にSmartTeeを挿入する
833831:2011/01/07(金) 22:10:44
>>832さん
アドバイスありがとうございます。
なるほど、その手がありましたか。
@IGraphBuilder::RenderFile でフィルタグラフを生成
AIGraphBuilder::EnumFilters でフィルタを列挙
Bフィルタピンを列挙してそれがレンダフィルタピンに接続しているかを判定していき、レンダフィルタの前のフィルタを特定
C特定したフィルタとレンダフィルタの間にスマートフィルタを接続

という方法でいけそうですね。
うまくいきましたらご報告します。 ありがとうございました。
834832:2011/01/08(土) 23:29:24
>>833
Bの前にレンダラフィルタを特定した方が早くね?
てか、レンダラは自分でAddFilterするなら、
フィルタ列挙も不要かも
835825:2011/01/09(日) 00:03:59
>>832さん
たびたびのアドバイスありがとうございます。
ようやく@〜Cのやり方で所望の動作を実現できました。

と思ったら、832さんがもっと簡単な方法をアドバイスしてくれていたんですねw
ですがせっかくのアドバイスを理解できないため、もしよろしければもう少しアドバイスください。

レンダラは自分でAddFilterしています。
レンダラの直前のフィルタを特定するためにA〜Bを実行したのですが、もっと簡単な方法があるのでしょうか?
836832:2011/01/09(日) 08:03:39
>>835
レンダラの入力ピンのConectedToで接続元のフィルタの出力ピン、
そこからそのフィルタ、って分かるんじゃなかったかな、
と思ったんですが、今手元にPCがないので
自信ないすorz
837デフォルトの名無しさん:2011/01/09(日) 19:10:47
それでいけるよ
838825:2011/01/09(日) 23:52:21
>>832さん、837さん
たびたびのありがとうございます。
教えて頂いた方法でうまくいきました!。

@レンダラフィルタの入力Pinから IPin::ConnectedTo() で接続先のピンインタフェースをを取得
A取得したIPinからIPin::QueryPinInfo で接続フィルタを特定することが可能!

おかげでコードもずいぶんすっきりしました。

この度はいろいろとありがとうございました。

839デフォルトの名無しさん:2011/01/14(金) 09:41:14
webカメラからビデオキャプチャをして、
一部を切り取ったり、拡大縮小してPictureboxに
表示したいのですがそんなことは可能ですか?
840デフォルトの名無しさん:2011/01/14(金) 13:35:13
可能なのでドキュメントを読んできちんと学習してください
841デフォルトの名無しさん:2011/01/14(金) 14:48:53
>>840

ヒントをもらえませんか?
ドキュメント読んでSampleGrabberを使用して
キャプチャ出来るところまでは出来たのですが
一部切り出しなど加工方法がわからないのです。
842デフォルトの名無しさん:2011/01/14(金) 14:54:00
DirectShowのことは理解しているようなので、画像加工は別のスレで聞くかググレ。
843デフォルトの名無しさん:2011/01/18(火) 11:05:25
サンプルグラバを使用して非同期( IMediaFilter::SetSyncSource( NULL ) )でフレームのデータを取得しています。
この状態で、最後のフレームを識別する確実な方法はないでしょうか。

以下のようなことをしてみました。

・ IMediaEventEx::SetNotifyWindow でイベント通知を受ける
-> 非同期のためソースフィルタが最後のフレームを処理したタイミングで通知が来てしまい、
   サンプルグラバはまだ途中のフレームを取得しているらしい

・ IMediaSeeking::GetDuration と ISampleGrabber::GetConnectedMediaType で取得した
 再生時間とビデオヘッダ中のフレームあたりの時間からフレーム数を計算して、
 それとサンプルグラバで受け取ったフレーム数を比較して判定する
-> 計算結果が微妙に異なることがある

ネットで調べた限り、フレーム数そのものを受け取る方法は見つけられませんでした。
ほかには、ふたつめの方法と「その後しばらくデータを受信しなければ最後だった」との判定を
組み合わせるくらいしか思いつきません。

確実な方法があれば教えていただけませんか?
844デフォルトの名無しさん:2011/01/18(火) 13:16:28
再生が停止するまでに来た最後のフレームが最後になるんじゃない?
845デフォルトの名無しさん:2011/01/18(火) 13:45:58
IMediaDet::get_StreamLength を使う
GetDuration と同じ結果になっても当方は一切関知しない
846843:2011/01/19(水) 13:46:37
遅くなりました。
ありがとうございます。

>>844
再生が停止するまでというのは、IMediaEventEx::SetNotifyWindow による通知のことでしょうか。
それとも他のイベント検知よる判定でしょうか。

基本、非同期で扱っているので、これまでに調べた方法によればあまりあてにはできませんでした。

>>845
試してみます。w
847デフォルトの名無しさん:2011/01/19(水) 14:07:51
EndOfStream
848デフォルトの名無しさん:2011/01/21(金) 21:58:58
SampleGrabberを使って全音声データを取得するのは無理なんでしょうか?
849デフォルトの名無しさん:2011/01/23(日) 20:43:03
C++もDirectXも一通りやってるんですが、
仮想カメラデバイスってどうやったら作れますか?

既存ウェブカメラやデスクトップのスクリーンキャプチャを入力として、
エフェクトを加えて、Ustream配信とかしたいんですが。

オープンソース、フリーでやるつもりなので
GPLなコードとか紹介してくださるだけでもOKです。
850デフォルトの名無しさん:2011/01/23(日) 21:21:17
851デフォルトの名無しさん:2011/01/23(日) 21:24:56
>それから必要なインターフェイスを実装して、更に登録するカテゴリをデバイスにする。

このへん具体的に知りたいんですが。。。
852デフォルトの名無しさん:2011/01/23(日) 21:50:26
具体的にもなにもMSDNにそのままのサンプルがあったと思うけど
853デフォルトの名無しさん:2011/01/23(日) 22:32:55
>>851
基礎をちゃんと学べ
854デフォルトの名無しさん:2011/01/25(火) 13:38:38
みんなMMFの勉強もしてるの?
855デフォルトの名無しさん:2011/01/26(水) 15:25:12
>>853
知らないならレスしないで下さい。ウザいだけです。
856デフォルトの名無しさん:2011/01/26(水) 20:18:35
勉強する気がないならレスしないでください
不快です死んでください
857デフォルトの名無しさん:2011/01/27(木) 03:11:01
テンプレ通りの荒らしに反応するのイクナイ
って、君も荒らしか?
858デフォルトの名無しさん:2011/02/08(火) 12:05:48
DirectShowでPCのスピーカーから鳴っているのと同じ音をキャプチャする方法はあるんでしょうか?
クリック音や再生中の音楽などを丸ごとキャプチャしたいです。
859デフォルトの名無しさん:2011/02/08(火) 12:45:25
ない
860デフォルトの名無しさん:2011/02/09(水) 12:53:00
標準の機能としてはない気がするが、フィルタ作ったらできるんじゃね?
どうやるかは知らん
861デフォルトの名無しさん:2011/02/09(水) 22:18:16
XPならオーディオキャプチャフィルタを使って入力を"Stereo Mix" とかに設定したらできるんじゃない?
862デフォルトの名無しさん:2011/02/16(水) 05:57:11
MPEG-2 Demulitplexerにつなぐトランスフォームフィルタを作成しているのですが、質問させてください。
http://msdn.microsoft.com/ja-jp/library/cc353346.aspx
>プッシュ モードでは、出力ピンはアプリケーションまたは別のフィルタにより構成する必要がある
とありますが、作成中のフィルタからdemuxフィルタの(映像でも音声でもない)出力ピンを構成するには、どのタイミングでどのようにすればいいのでしょうか?
863デフォルトの名無しさん:2011/02/18(金) 04:42:55
Part 3 スレ って 17 しかレスないの?
864デフォルトの名無しさん:2011/02/18(金) 10:14:46
このスレ、立った当初から居るけど、もう二年半も経つのか。
よく落ちないな。
865デフォルトの名無しさん:2011/02/23(水) 18:52:11.22
DirectX9 SDKの日本語ドキュメントでdirrectshowが含まれているバージョンを探しているのだけどMSDNで見つけることができません。
DirectX 9.0 SDK Update (October 2004) の前のVerにdirectshowが含まれているっぽいのだけどアップされていない。
場所を知っている人がいましたら教えてください。
866デフォルトの名無しさん:2011/02/23(水) 18:59:30.94
867865:2011/02/24(木) 00:22:08.92
>>866
SDK本体ではなくdirectShowが含まれたDirectXの日本語ドキュメントを探しています。
868865:2011/02/24(木) 00:33:10.88
質問の仕方が下手くそですみませんでした。
下記サイトに
http://blogs.msdn.com/b/hiroyuk/archive/2008/04/30/msdn-directx-sdk.aspx

DirectX SDK日本語ドキュメントは2002年版と2004年版があり、directshowは2002年版にしか含まれていないとあります。
そこで2002年版を探していますが見つけることができません。
知っている方がいたら教えてください。
869デフォルトの名無しさん:2011/02/24(木) 00:52:38.79
ない
870デフォルトの名無しさん:2011/02/24(木) 01:17:29.09
ドキュメントは2004年のが日本語で見れるしWindows SDKにDirectShow入ってるのに
2002年のに拘る理由はなによ

VC6? ご愁傷様です
871デフォルトの名無しさん:2011/02/24(木) 05:33:29.61
うちのPCのHDDにはまだ入ってるな
872デフォルトの名無しさん:2011/02/24(木) 13:18:07.55
>>865
ttp://msdn.microsoft.com/ja-jp/library/cc353899.aspx
Webで見れるやつはダメなん?
873865:2011/02/25(金) 01:42:34.09
ローカルで日本語ドキュメントを見たかっただけですが無理そうですね。
今までどおりWebのやつをみます。

いろいろとレスありがとうございました。
874デフォルトの名無しさん:2011/02/27(日) 07:20:38.17
フィルターを探しています。
動画をフレームごとに静止画形式のPNGに変換してくれるフィルターはないですか?
875デフォルトの名無しさん:2011/02/27(日) 07:34:38.23
ありますよ
876デフォルトの名無しさん:2011/02/27(日) 08:46:21.06
>>875
ありがとうございます。
そのフィルターの名前とかダウンロード先を教えてください。
877デフォルトの名無しさん:2011/02/28(月) 14:23:33.78
教えてください。

GraphEdit でグラフを構成して再生ボタンを押下すると以下のエラーが出ます。
これはどういうときに出るエラーなのでしょうか。
調べているのですが、今のとこ意味がよく分かりません。
同じフィルタ構成でも、入力のメディアファイルによって出たり出なかったりします。

code : 0x80040204
enum : VFW_E_ALREADY_CONNECTED
text : 処理に含まれるピンが既に少なくとも 1 つ接続されている。

GraphEdit のエラーメッセージボックスのメッセージ表示

The graph could not change status.
この操作で使用されているピンの中で、少なくとも1つは既に接続済みです。
(Return code: 0x80040204)

878デフォルトの名無しさん:2011/03/03(木) 11:45:08.34
レンダラフィルタのインスタンスから CBaseRebderer* を参照する方法を探しています。

端的に言うと、Null Renderer の CBaseRebderer::IsStreaming() を使用したいのですが、
DirectShow でこれを使用する場合、インターフェイスの形でインスタンスを取得すると思います。
こんな↓感じで。

CoCreateInstance( CLSID_NullRenderer, NULL, CLSCTX_INPROC, IID_IBaseFilter, (LPVOID*)&nullRenderer );

試してみると、(CBaseRebderer*)&nullRenderer でもいけるようなのですが、
IBaseFilter はそもそも CBaseRebderer を含んでいません。また大量に繰り返していると
プログラムが落ちるようです。他の原因かもしれませんが

うえの方法が間違っている場合、
Null Renderer から CBaseRebderer* を取得する方法としてはどのような手段があるでしょうか。
879デフォルトの名無しさん:2011/03/03(木) 13:12:13.87
ない
880878:2011/03/03(木) 17:21:37.10
そうですか。残念。
ありがとうございました。
881デフォルトの名無しさん:2011/03/09(水) 17:18:21.52
IAudioSessionEventsでメインウィンドウにメッセージを送ってセッションのイベントを通知してるんだけど、
その間にメインウィンドウのスレッドから IMediaControl::Stop すると Stop から制御が返ってこなくてプログラムが停止します・・・

なんか解決策ありますか?
882デフォルトの名無しさん:2011/03/09(水) 18:03:05.12
デッドロックしてんだろ?
スレッド毎の実行位置調べれば、何が悪いのかすぐわかるだろう。
883デフォルトの名無しさん:2011/03/10(木) 21:32:24.58
ありがとうございます。
ところでここで聞くことではないかもしれませんが、スレッド毎の実行情報を見る便利なツールはありますか?
884デフォルトの名無しさん:2011/03/10(木) 21:39:32.86
visual studio
885881:2011/03/10(木) 22:36:35.51
解決しました!
処理待ちのメインウィンドウに別スレッドからSendMessageしてました・・・・
ありがとうございました。
886デフォルトの名無しさん:2011/03/14(月) 17:41:33.09
Mpeg2TSファイルの再生にMPEG2 Demultiplexerを使用し、
指定PIDのストリームを受け取って何かするレンダラフィルタを作成しているのですが、
ソースによって、動画がドロップします。
自作フィルタに届くIMediaSampleの表示開始ストリームタイムが、その時点でのストリームタイムより小さい時に起こるようで、
demuxからの送出が間に合わず、その結果、動画再生に影響が出ているのかと想像しています。
一度demuxから出力ピンを生やせば、自作フィルタをNullRendererに差し替えても、何も接続してなくてもドロップするという状況ですが、
解決するために試せる事があれば、ご教示下さい。
887デフォルトの名無しさん:2011/03/17(木) 01:01:21.39
>>886
もう少しわかりやすく書かなきゃわからん

transformフィルターを作ったんだけど、
その中でデバッグ用にファイル作成しています。
ただ、フレームごとにファイルが作られない理由がよくわからないため教えてください。デバッグを終了するといっぺんにファイルが作られるようです。

やっていること
transformメソッド内でfopen()を書いて画像データをファイルに書いています。
当然最後にfclose()しています。

処理が重すぎるのでしょうか?
888デフォルトの名無しさん:2011/03/24(木) 23:11:24.00
最近めっきりフィルタ開発から離れたPGです。

Windows7が当たり前になってきた昨今ですが、
DirectShowって映像系のソフトではまだ主流の技術ですか?
Windows7でもDirectShowにかわる別物は出てきていないのですか?
言語はC++ですか?いまだにCOMが生きていると考えて良い?
それともC#ですか?
889デフォルトの名無しさん:2011/03/24(木) 23:21:05.21
yes,no,yes,yes,no
890デフォルトの名無しさん:2011/03/25(金) 00:10:49.27
>>889
ありがとうございます!
891デフォルトの名無しさん:2011/03/25(金) 03:11:58.44
検索キーワードは Media Foundation な
892デフォルトの名無しさん:2011/03/30(水) 03:13:25.31
DESのDIBシーケンスの読み込みについて分かる方いませんか?
ttp://msdn.microsoft.com/ja-jp/library/cc370411.aspx

連番のBMPを用意して最初のファイルをセット、
SetDefaultFPSでフレームレート設定。
で、実行してみると1枚だけ表示されてあとは真っ黒。

ttp://homepage1.nifty.com/yasunari/VB/VB006.htm
ここのサンプルも試してみましたが同様でした。
なにか解決方法ありますかね…
893デフォルトの名無しさん:2011/03/30(水) 03:22:59.68
うへ、自己解決
連番ファイルのサンプル数が少なすぎていたようでした
894815:2011/04/08(金) 17:27:57.08
USBカメラを2台使用してaviファイルへカメラ映像を保存されたことがある方いませんか?

保存中(Run実行中)にPauseを行うと、どちらかのカメラor両方のカメラ映像がフリーズするんですけど原因がわかりません・・・。

1.カメラ1のRun実行
2.カメラ2のRun実行
3.カメラ1のPause実行
4.カメラ2のPause実行
5.カメラ1のRun実行
6.カメラ2のRun実行

6実行後にカメラ映像のフリーズ発生。
特に自作フィルタをつないだりしていないシンプルなコードなのですが。
ちなみに同じ手順をPreviewやAVIファイル再生時に行っても映像のフリーズは発生しません。
895894:2011/04/08(金) 17:31:35.01
追記です。
6の手順の後にGetStateでそれぞれのカメラの状態を確認すると、映像がフリーズしていてもRun状態が返ってきます。。
896デフォルトの名無しさん:2011/04/08(金) 19:51:14.72
>>894
カメラでPauseの件はやったこと無いのでよく分からんが、ぐぐったら録画を一時停止するのは見つかった
"DirectShow run pause camera"でぐぐって上から2つ目とかその辺
897デフォルトの名無しさん:2011/04/08(金) 20:50:44.89
どんなフィルタグラフか書かないことには何ともいえない。
2台のカメラの映像をミックスしてファイルに落としてるのか?
2台のカメラの映像をそれぞれ違うファイルに落としているのか?

プレビューpinやファイル再生の場合はレンダラにスレッドが居る。
キャプチャpinはそのピン自信がスレッドを持つ。
その辺の違いか?
898894:2011/04/09(土) 03:45:17.66
>>896
情報ありがとうございます。ControlStreamも試してみましたが、やっぱりフリーズしてしまいます。

>>897
レスありがとうございます。長くなりますがこんな感じのソースです。↓

// エラー処理略
IGraphBuilder *pGraphBuilder_1;
ICaptureGraphBuilder2 *pCaptureGraphBuilder2_1;
IMediaControl *pMediaControl_1;
IGraphBuilder *pGraphBuilder_2;
ICaptureGraphBuilder2 *pCaptureGraphBuilder2_2;
IMediaControl *pMediaControl_2;
IBaseFilter *pFileOut_1;
IBaseFilter *pFileOut_2;
ICreateDevEnum *pCreateDevEnum = NULL;
IEnumMoniker *pEnumMoniker = NULL;
IMoniker *pMoniker = NULL;
ULONG nFetched = 0;

CoInitialize(NULL);
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(LPVOID *)&pGraphBuilder_1);
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(LPVOID *)&pGraphBuilder_2);
CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC,IID_ICaptureGraphBuilder2, (LPVOID *)&pCaptureGraphBuilder2_1);
CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC, IID_ICaptureGraphBuilder2, (LPVOID *)&pCaptureGraphBuilder2_2);
pCaptureGraphBuilder2_1->SetFiltergraph(pGraphBuilder_1);
pCaptureGraphBuilder2_2->SetFiltergraph(pGraphBuilder_2);

// MediaControlインターフェース取得
pGraphBuilder_1->QueryInterface(IID_IMediaControl, (LPVOID *)&pMediaControl_1);
pGraphBuilder_2->QueryInterface(IID_IMediaControl, (LPVOID *)&pMediaControl_2);
899894:2011/04/09(土) 03:50:43.61
続きです。

CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (PVOID *)&pCreateDevEnum);

pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumMoniker, 0);

pEnumMoniker->Reset();

// 最初のMonikerを取得
if (pEnumMoniker->Next(1, &pMoniker, &nFetched1) == S_OK) {
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pDeviceFilter_1 );
pGraphBuilder_1->AddFilter(pDeviceFilter_1, L"Video Capture2");
pMoniker->Release();
}

// 2番目のMonikerを取得
if (pEnumMoniker->Next(1, &pMoniker, &nFetched2) == S_OK) {
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pDeviceFilter_2 );
pGraphBuilder_2->AddFilter(pDeviceFilter_2, L"Video Capture2");
pMoniker->Release();
}
pEnumMoniker->Release();
pCreateDevEnum->Release();

pCaptureGraphBuilder2_1->RenderStream(&PIN_CATEGORY_PREVIEW,NULL, pDeviceFilter_1, NULL,NULL);
pCaptureGraphBuilder2_2->RenderStream(&PIN_CATEGORY_PREVIEW,NULL, pDeviceFilter_2, NULL, NULL);
900894:2011/04/09(土) 03:51:13.71
続きです。

// 出力ファイル名を設定する
pCaptureGraphBuilder2_1->SetOutputFileName(&MEDIASUBTYPE_Avi,L"test1.avi", &pFileOut_1, NULL);
pCaptureGraphBuilder2_2->SetOutputFileName(&MEDIASUBTYPE_Avi, L"test2.avi", &pFileOut_2, NULL);

pCaptureGraphBuilder2_1->RenderStream(&PIN_CATEGORY_CAPTURE,NULL, pDeviceFilter_1, NULL, pFileOut_1);
pCaptureGraphBuilder2_2->RenderStream(&PIN_CATEGORY_CAPTURE, NULL, pDeviceFilter_2, NULL, pFileOut_2);

// カメラキャプチャ開始
pMediaControl_1->Run();
pMediaControl_2->Run();
pMediaControl_1->Pause();
pMediaControl_2->Pause();
pMediaControl_1->Run();
pMediaControl_2->Run();

// 以外停止指示があるまで待機。その後stop及びメモリ、COMの解放実施。
901デフォルトの名無しさん:2011/04/09(土) 08:57:07.26
Run>Pauseの間隔がよく分からんが、
人間が操作する程度の間隔でないと不確定の動作になるとかMSの人が言ってたな.
これこれ
DirectShow: フィルタグラフのRun/Stop などの状態遷移について
http://blogs.msdn.com/b/windows_multimedia_jp/archive/2011/03/03/directshow-run-stop.aspx
902894:2011/04/09(土) 21:26:30.11
>>901
レスありがとうございます。RunとPause、PauseとRunの間隔をそれぞれ2秒あけてみましたが、結果は同じくフリーズします。。
(たま〜に正常に録画できたりはしますが)

実行順序を
カメラ1のRun→カメラ1のPause→カメラ2のRun→カメラ2のPause→カメラ1のRun→カメラ2のRun
に変更すると映像はフリーズせず正常に録画できます。
でも何故そうなるのかわからないのですっきりしなくて・・・。
順序を変えて録画できるのも、今の実行環境でたまたまできているだけで、環境をかえるとやっぱりできないのかな?とか考えてしまいます。。
903デフォルトの名無しさん:2011/04/09(土) 22:16:32.54
そもそもキャプチャグラフにポーズって概念があるんだっけ?

フリーズってのは映像の動きがパタリと止まること?
or
それともデッドロックみたいに一切プログラムが動かなくなる?
(pMediaControl->Pause()が戻ってこないとか)
904894:2011/04/10(日) 08:43:49.08
>>904
映像の動きがパタリと止まります。
映像が止まっている状態でGetStateを実行するとRun状態が返ってきます。。
905デフォルトの名無しさん:2011/04/10(日) 09:14:21.53
ドライバレベルの問題な気がする
906デフォルトの名無しさん:2011/04/10(日) 11:25:14.45
Pauseしなくても録画は止められるんだから、
フィルタ内部では流しっぱなしにしておけばいいんでないの

なんとなくWebCam側でPauseを考慮していない無い気がする
Pauseって、「一旦流れを止めて、次回続きから再開」ってことだろ
データ垂れ流しのWebCamで、続きから再開って(こっちでバッファ用意しないと)出来ないし
907デフォルトの名無しさん:2011/04/10(日) 14:44:56.88
ライブソース(キャプチャピン)を使ってポーズすると
次にRunしたときにレンダラが送られてくるフレームのタイムスタンプが古いので
表示しないとか、そんな現象があったような。

例えば最初にRunをして3秒後くらいにPauseして、更にRunすると
3秒くらい映像が固まるがその後また動き出すとかそういう現象はないか?
908894:2011/04/10(日) 21:17:15.95
>>906
PauseやStop以外に録画を止める方法があるのでしょうか?
何故Pauseにこだわっているかというと、カメラ2台の映像とその撮影対象のデータ(数値)の同期をとりたいのですが、Run開始から実際に映像が保存されるまでに時間がかかるため、RunしてすぐにPauseをかけて録画準備時間+α待ってから再度Run実施、という方法をとっています。
みなさん2台のカメラキャプチャを行う時の同期はどうやってとっていますか?そもそもPauseを使って同期をとろうとしていること自体間違っているのでしょうか…。

>>907
2度目のRunのあと一瞬(1〜2フレームくらい)動くことはありますがその後すぐに映像が止まります。1度目のRunの時間とは関係ないようです。
909デフォルトの名無しさん:2011/04/10(日) 21:56:28.51
俺なら、完全に同期をとるって目的なら、同一のフィルタグラフで操作するかな?
うろ覚えで悪いけど、フィルタチェイン丸ごと、別のフィルタグラフに移動する関数があったはず

それが無理そうなら、自作フィルタを作る。
タイムスタンプで同期をとるようなやつ
910デフォルトの名無しさん:2011/04/11(月) 10:21:16.90
>>909氏の後者の案に一票
911894:2011/04/11(月) 16:33:41.77
>>909
ありがとうございます。
909さんの方法を試してみることにします。

アドバイスしてくれたみなさん本当にありがとうございました。
912デフォルトの名無しさん:2011/04/11(月) 23:54:24.09
ビデオキャプチャするときに、理想フレームレートに
なるようダミーフレームを自動で挿入してくれる既存のフィルタってありますか?
913デフォルトの名無しさん:2011/04/12(火) 17:25:29.66
IMediaControl::RenderFile と IGraphBuilder::RenderFile の違いってなんでしょうか?
MSDN では後者を使えってあるんだけども。
914デフォルトの名無しさん:2011/04/18(月) 19:25:49.90
GraphEditで遊んでいたのですか、Audio Capture Sourceに登録されている
デバイスを見ると、どれにもピン情報が一つもありません(pin 00:のような)。
ところが実際にインサートしてみると、ちゃんとピンが表示されており、
他のフィルタとピンを接続すればちゃんと動作します。

これは一体どういう状況なのでしょうか?
915デフォルトの名無しさん:2011/04/18(月) 21:19:55.06
あれは検索用の情報で、そういった情報のないフィルタも作れる。
実際のピンは実行時に決まる。
916デフォルトの名無しさん:2011/04/19(火) 00:10:50.66
>>915
ありがとうございます。
ただその後試しにプログラム中でそのAudio Capture Sourceをマネージャーに
登録後、Enumしてピンを見てみると Input Pin(Rendered)というピンしかありませんでした。
本来ならGraphEditで見られるCaptureなどといったピンもあるはずなのですが、
なぜこうなっているのか事情がよく判らないんのですよ。
917デフォルトの名無しさん:2011/04/19(火) 00:44:42.84
ピンってのは実行時に増えたり減ったりするんだぜ。
接続状況で変化したり色々。
918デフォルトの名無しさん:2011/05/01(日) 14:21:29.41
画像変換フィルタを作成しているのですが、
【MPEG Video Decoder】-【Filter】-【Video Renderer】
とつなぐと、動作はするもののレンダラがGDIからDirectDrawに切り替わりません。
フィルタは CTransformFilter からの派生で、
http://msdn.microsoft.com/ja-jp/library/cc370535.aspx
の擬似コードの内容は実装しているつもりですが、レンダラが切り替わらない原因を
取得するメソッドとかありますか?
919デフォルトの名無しさん:2011/05/01(日) 21:41:57.80
Transformでステップ実行してみれば
920デフォルトの名無しさん:2011/05/02(月) 19:19:44.61
誰か、ビデオキャプチャフィルタ作ったヤツ、いない?
サンプルソースのありかだけで良いから教えて欲しい。

プレビューピンとかキャプチャピンとか、訳わかんね。
出力ピン2つ用意して、カテゴリでプレビューとキャプチャ返しても、繋がりやしねぇ。

MSの解説ページは意味不明だし...

ほんと、企業はどうやって作ってんのよ?
921デフォルトの名無しさん:2011/05/02(月) 21:14:05.70
DDKにサンプルあるんじゃないの
922デフォルトの名無しさん:2011/05/03(火) 00:21:12.89
ドライバ作るとDirectShowとして使えるようになる仕組みなので、DirectShowフィルタ自体の作成はしなかった気がする。
ソースフィルタだよね?色々なインターフェイス問い合わせるから、実装していないインターフェイスがあると動作してくれないプログラムがよくある。そういう状況なんじゃないかな。
923デフォルトの名無しさん:2011/05/03(火) 02:18:14.17
何を作りたいのか、どこで詰まってるのか書かないと答えようが無いぞ
キャプチャデバイスとしてウェブカムみたいに認識させたいならそういう方法はあるし、
カメラとかにはプレビューピン無いのもあるから別にキャプチャピンだけで事足りるし
924デフォルトの名無しさん:2011/05/03(火) 13:06:12.32
昔、PlatformSDKになる前のDirectShowSDKでやってたころはビットマップを自分で作って流すソースフィルタのサンプルがあったよ。
もしビデオキャプチャソースというのを単純なソースフィルタのことをさしているならそのサンプルでよいと思う。
でも本当にUSBカメラなどのドライバとしてのビデオキャプチャソースを作りたいならDDKを見ないとダメだろう。
DDKも古いやつしか知らないが、WDMモデルでビデオキャプチャクラスみたいなクラスがあるんだろう。
そしてそのミニクラスドライバを書くとかそういう話になるんじゃないかな。
925920:2011/05/03(火) 14:05:42.25
皆さんありがと。

まさにUSBカメラのキャプチャソースみたいなものを作りたいんだ。
キャプチャピンのみなら問題ないんだけど、そこにプレビューピンを追加したいんだ。
つまりフィルターを使う側はRenderStream()でPIN_CATEGORY_PREVIEWで繋ぎにいきたいんだ。

そこで出力ピンを2つ用意して、GetPin()でキャプチャピンとプレビューピンを返すようにしてもうまく動かない。
(レンダーフィルターに繋がらない)

MSの解説見て未意味不明だから、皆さんのお知恵に頼ってみた。

>>924
ちょっとDDK見てくる。
926デフォルトの名無しさん:2011/05/03(火) 19:43:17.08
いま気が向いたんで探してみたけどたぶん
DDKルート\src\wdm\videocap\testcap
これだな。
かなりデカイさんぷるなんで読む気がしないが
なんかHTML読むと、このドライバはDShowでは4つのフィルタに見えるらしい。
927920:2011/05/04(水) 00:18:18.39
DDKがなくてWDKのサンプルを見たのだが、>>926氏の言うtestcapがなかった_| ̄|○

videocap\usbintelとか1394dcamとかいうのがあったので見てみたが、これはDirectShowフィルターではない...
というか、このサンプル全部検索したが、どこにもDirectShowフィルターを作ってない...

DDKを探してくる...
928デフォルトの名無しさん:2011/05/04(水) 12:01:31.15
>>918
DisplayTypeとか使ってQueryAcceptで渡されたサーフェイスの情報を
調べてみるといいよ。
サーフェイスの種類を判別するためにトップとボトムが逆になってたり
プライマリサーフェイスではBI_BITFIELDSが渡されたりする
(プライマリではコーデックが拡大縮小したりしなきゃいけないので面倒)。
929928:2011/05/04(水) 20:47:12.24
最近フィルタ作ってなくて記憶があいまいになってた。

サーフェイスの違いの判断はHeightが負かどうかで
ボトムアップが逆になるのはRGBの時(YUVは常にトップダウン)だったかな。
スマソ
YUVはディスプレイドライバによって色や輝度の変換式が異なったりするので注意してね。

CVideoTransformFilterはフォーマット変更やフレームスキップを考慮したクラスに
なってるよ。
930デフォルトの名無しさん:2011/05/06(金) 10:24:49.25
>>919,>>928
ありがとうございます。

>>CVideoTransformFilterはフォーマット変更やフレームスキップを考慮したクラスに

QueryAcceptはCheckMediaType経由でCTransformFilter::CheckTransformを呼び出す
と記述されているので、そこでS_OKを返してみたのですが、追いかけてみます。
931920:2011/05/06(金) 10:37:59.58
ありがとう、解決したよ。
すごく馬鹿なところでポカしていた。
出力ピンでNonDelegatingQueryInterface()をやってなかった..._| ̄|○

同じところでつまづく人がいないようにメモ。

やりたいこと:
 独自のソースフィルタをキャプチャデバイスのように扱いたい
やったこと:
 1)PushSourceを元に、まず通常のソースフィルタを作成
 2)フィルタのカテゴリを「CLSID_VideoInputDeviceCategory」に変更
 3)出力ピンを2つ作成(「~Capture」と「Preview」)
 4)ピンクラスをコピーして2つ作成(キャプチャ用とプレビュー用)
 5)各ピンにIKsPropertySetインターフェースを追加
 6)各ピンでDECLARE_IUNKNOWNを宣言
 7)各ピンでNonDelegatingQueryInterface()を実装
 8)フィルタで各ピンのオブジェクトを作成、保持
 ※本当は画像のフォーマットをあわせたりしなくちゃいけないらしいけど、省略

これでアプリから、
 RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pSrcFilter, NULL, NULL);
で表示できるようになった。
932デフォルトの名無しさん:2011/05/06(金) 11:35:10.46
お疲れさん。
DDKは必要なかったようだね
933デフォルトの名無しさん:2011/05/07(土) 09:36:33.34
おめ。自作ソフトからなら問題ないだろうけど、
>>922の言うように他のソフトからだとインターフェース不足になることが多いんだよな
強引だけどこんな方法で解決した。ログ出すのとか面倒だったんでw

hr = CSourceStream::NonDelegatingQueryInterface(riid, ppv);
/*
if (FAILED(hr)) {
 TCHAR buf[255];
 StringFromGUID2(riid, buf, 255);
 MessageBox(NULL, buf, CAM_NAME, MB_OK | MB_TOPMOST);
}
*/

これで足りないインターフェースのGUID出るから、後はググって要りそうなのを実装した
ちなみに俺が使いたいソフトで必要だったのはIAMDroppedFramesだった・・・分かるかよw
934デフォルトの名無しさん:2011/05/07(土) 12:38:37.76
COM関係ではよくあるよねえ。
DirectShowじゃないけどShell namespace関係で同じようなデバッグしたことある
935デフォルトの名無しさん:2011/05/12(木) 11:47:42.28
動画ファイルを TMPGEnc などのソフトで見ると、アスペクト比などの情報があると思います。
このアスペクト比を DirectShow を使用して取得することは可能でしょうか?
可能であればその方法を教えてください。
936デフォルトの名無しさん:2011/05/12(木) 11:56:31.87
ピンから提示されるメディアタイプのVIDEOINFOHEADER2
ファイルやデコーダやデマルチプレクサによっては無い事もある
937デフォルトの名無しさん:2011/05/12(木) 12:02:06.26
ありがとうございます。

VIDEOINFOHEAER2:dwPictAspectRatioX と dwPictAspectRatioY ですね。
VIDEOINFOHEAER の場合は、bmiHeader のなかの biYPelsPerMeter と biXPelsPerMeter から
計算できそうですね。
938デフォルトの名無しさん:2011/05/25(水) 21:25:08.82
Windows Media関連やったことある人いる?

WM ASF Writerを使ってwmvファイルの書き出しをしてるんだけれど、
そん中のコーデックの指定はどうやってやるの?

IWMCodecInfo3を使ってコーデック(WIndows Media Video v7 / v8 / 9とか)の
列挙はできたんだが、コーデックをsetする方法が分からんです。。。
939デフォルトの名無しさん:2011/05/25(水) 22:16:29.36
IConfigAsfWriter
ってのがまんまあるじゃないか
940デフォルトの名無しさん:2011/05/26(木) 21:05:07.79
IConfigAsfWriterからたどって、対象のストリームのWM_MEDIA_TYPE::subtypeと
BITMAPINFOHEADER::biCompressionをセットしたらできたよ。ありがと!

実は以前も同じようにやったんだけど、その時はsubtypeしか指定してなかったから
うまく動かなかっただけでした。

とりあえず感謝!
941デフォルトの名無しさん:2011/06/06(月) 15:53:31.47
誰かヘルプ。EVRでHWデインターレースしたいのだがうまくいかん。
Win7 SP1/64bit版で、ffdshowはrev3866で行き詰ったので今はrev3154に落とした。
GraphEditでUSBキャプチャ->ffdshow raw->EVRと接続して、
ffdshowの設定でリセット状態から変更したのは、Outputのページで
"Set interlace flag in oouput media type"にチェックを入れただけ。
映像からはさっぱりコーミングノイズが消えない。
ffdshowのInfoページを見ていると望みどおりYUY2のまま出力されてる。
EVRの代わりにVMR9にしてみても状況は同じ。どこか理解できずに手順抜けているんだろうか?
よろしくお願いします。。ちなみにGPUは内蔵intelHDです。
942デフォルトの名無しさん:2011/06/09(木) 09:11:34.65
具体的にアドバイスはできないが、チップセットの型番くらいは
書いといた方がいいと思う

radeonかGeForceで試すことはできないの?
943デフォルトの名無しさん:2011/06/12(日) 21:42:36.79
intel media sdkのDirectShow Filter (含むサンプル)がまともに動かん…
つーか、COMのインターフェースのヘッダファイルくらい付けてくれよ
944デフォルトの名無しさん:2011/06/12(日) 23:15:26.48
なんだか知らんがビルドできないで喚いているならお前が能力不足なだけだ
945デフォルトの名無しさん:2011/06/13(月) 00:43:08.61
いやいや、設定してるのに、設定通りにエンコードしてくれない
ドキュメントもいい加減だし
946デフォルトの名無しさん:2011/06/13(月) 02:14:12.55
何も変更も加えずにビルドできたんだが・・・
943はまず自分自身を疑うこと覚えよう。
デバッグの鉄則だ。
947デフォルトの名無しさん:2011/06/13(月) 10:27:11.66
>>946
そりゃビルドは出来るよ
でも、設定したした通りにエンコード出来ないんだわ

つーか、ビルドって何をビルドしたの?
948デフォルトの名無しさん:2011/06/16(木) 02:16:20.93
いったい何をビルドしたのか気になる…
949デフォルトの名無しさん:2011/06/24(金) 11:26:45.74
MPEG2デコーダの利用で、正しい展開結果は出力されるけど毎回3フレーム欠落する、
という現象に誰か心当たりがあれば原因を教えてくれないだろうか。
繋ぎ方はソースフィルタ(ES送信用)-MPEG2デコーダ-擬似レンダラ(結果取得用)で、
プッシュモードからGOP単位分のES、例えばIBBPBBPBBPBBPBBの15フレームを送っても
12フレームしか結果が出力されない(レンダラにIMemInputPin::EndOfStreamが来る)。
余分に次の3フレーム(IBB)を送ると、今度は15フレーム出力されたのでこれで
凌ごうかとも思ったけど、後述の無視出来ない量のリークがこれに関連してる気が
して来たので、解決が必要かなと思ってる。

追記:
結果出力後にフィルタを停止してタスクマネージャを見ると、それに相当すると
思われるメモリリーク(1440×1080で約20M。RGB32設定)が検出されるので(・∀・)、
デコーダ内部でデコードは終わってるけど「何か」を待っていて残りのサンプルを
放出してくれていないような印象。

受信出来た分のサンプルのリークではないと思う。AddRef/Releaseで確認すると
常に参照カウント1なので、この分はReceiveから戻り次第デコーダが解放するはず。
_CRTDBG_LEAK_CHECK_DFのDEBUGビルドでも報告は無いし、大物GDIリソースも解放漏れは無いっぽい。

上流からES送信後にIPin::EndOfStreamを送るのを暫く待っても無駄だった。
下流からIQualityControl::Notifyが必要かとも思ったけど、それなら6フレーム送った時にも
3フレームしか出力されないのが解せない。グラフへのSetSyncSource(NULL)も効果なし。

プッシュモードの限界という結論だったら泣ける(・∀・)。
950デフォルトの名無しさん:2011/06/24(金) 11:30:26.85
ミスった、IMemInputPin::EndOfStreamはIPin::EndOfStreamの間違い。
951デフォルトの名無しさん:2011/06/24(金) 15:25:10.02
デコーダへのデータ供給終了処理が必要だと思うけど、どんなデコーダ使ってるの?
952デフォルトの名無しさん:2011/06/24(金) 16:59:59.56
PowerDVDを入れたら導入された'CyberLink Video/SP Decoder (PDVD8)'。
ファイル名はCLVsd.axとなってる(日時09/08/24-22:00 バージョン8.4.0.730のもの)。
953デフォルトの名無しさん:2011/06/24(金) 22:09:06.20
EndOfStreamでちゃんと終端処理して欲しいよね。特殊なメソッドとかあるのかな?
954949:2011/06/25(土) 10:33:30.29
その後も調査を進めてみた所、デコーダが放出しないのはどうも末尾でなく先頭3フレームらしい事が分かった
(入力フレーム5,6を交換すると出力フレーム2,3が入れ替わった)。
ますます分からない。後のPフレームがデコード出来るって事は、最初のIフレームも理解出来ているのは確定に思えるが…。

何かの判断で手遅れの3フレームがカットされているとか?
955デフォルトの名無しさん:2011/06/25(土) 17:37:01.27
Bフレームなしのビットストリームを突っ込んでテストしてみるとか
956949:2011/06/25(土) 23:59:20.43
ヒントthx。IPPPPのESを送ってみた所、削られるのは1フレームだけに変化。ただしリーク量は変化せず。
その後もアロケータや入力ピンをラップしてトレースしたり色々と調べた結果、以下のような流れらしいと結論。

・デコーダはレンダラとのピン接続時にひとまずレンダラの提案するアロケータを使用する事を計画。
 ただしそれは720x480固定で3フレーム分(SetPropertiesより)。
・1440x1080のESを流し始めると、最初の数チャンク(Iフレームの一部)を送った時点でデコーダはレンダラに動的フォーマット変更を要求。
 しかしこの時点で既にデコーダは内部に独自アロケータを確保して処理を始めているらしく、ReceiveConnectionに対して
 レンダラ側がDecommit/SetProperties/Commitでバッファを拡大してもその後レンダラ側のアロケータは一切使われない(・∀・)
・GOP分のESを流し終えてEndOfStreamを送ると、デコーダは出力を始めるが最初のI-P区間のフレームが全て削られている
・何か不明なバッファが20M確保されている。デコーダを停止・解放してもグラフを解放しても消えない

動的フォーマット変更を発生させない方向、つまりIフレームの入力前に必要バッファ量≡解像度をデコーダに正しく伝えられれば良いかと思ったけど、

・レンダラ側のGetAllocatoraaRequirementsで最大解像度のバッファ容量を提案してみる
 →デコーダは華麗に無視(・∀・) (デコーダからアロケータへの最初のSetProperties要求が何も変わらず、依然としてReceiveConnection発生)
・デコーダとレンダラのConnectDirect時にメディアタイプをNULLでなく最大解像度で明示的に指定してみる
 →解像度の変更はおろか、たとえデコーダがEnumMediaPinで受入表明したメディアタイプと完全一致でも明示的に指定すると拒否される(・∀・)

ダメだこりゃ。
レンダラへの出力がIフレーム以外も全てSetSyncPoint(TRUE)されてるのが少しひっかかるけど、もう限界。
最初に最大解像度のダミーIフレームを流して(当然出力されない)、その後にフィルタをStopせず利用し続ける位しか思いつかない。
後はPause/Playでも新たなリークが発生する仕様でない事を祈る位だけど、何か気づいた事があればアドバイス頼む。
957949:2011/06/26(日) 00:01:23.54
蛇足:
ひょっとしてこのデコーダだと他のアプリでも同じ問題が発生するのでは?
と思って某ソフトで1440x1080→1920x1080とチャンネルを切り替えたらやはり20Mリークが発生してた。
(VMR9で確認、受入形式はRGB32でなくYUV2のようだが無関係らしい)
確認は難しいけど720x480を超える(つまり通常の)ストリームを最初に流した時も発生していると思う。

デコーダも色々癖があるって事でFAなのか。それとも同社製デコーダでも後のバージョンだと改善されてるのか。
フィルタを一時停止する事すら少なく、高解像度への変更も数える程な視聴用にはともかく、編集用アプリには微妙過ぎる。
調査が完璧とは思わないし、プルモードでもこうと決まった訳じゃないけどさ。組み方次第で50GOP処理毎に1GBリーク(・∀・)
958デフォルトの名無しさん:2011/06/26(日) 01:37:39.03
DirectShowの流し始めはほんとめんどくさいからな
959デフォルトの名無しさん:2011/06/28(火) 08:37:56.02
>>954

真のストリームの先頭なのか、GOPでぶった切りした物か分からんけど、OpenGOP/CloseGOPに関わらず、
先頭数フレームはデコード出来ないと思った方が良い

あと、demuxerがAM_MEDIA_TYPEの為に先頭1M程読んでポインタがそのままで、数フレデコード出来ない
事も有る

各社のSDK毎にもっと詳しく書いてあげたいけど、こちらも仕事なので許されよ
960デフォルトの名無しさん:2011/06/28(火) 09:48:45.73
CyberLinkのSDKって出てるの?
961デフォルトの名無しさん:2011/06/28(火) 11:01:32.38
それは自分で調べられるでしょう…
962デフォルトの名無しさん:2011/07/04(月) 00:19:55.56
フィルタ間を接続するときにメディアタイプを指定する方法はありますか?
必要に応じて中間フィルタも追加してもらいたいのですが、IFilterGraph::ConnectDirect
だと中間フィルタを追加しないのです。

たとえば通常だとYUY2で接続できてしまうフィルタを、中間フィルタを挟んでRGB32とかで
接続したいのですが。。。
963デフォルトの名無しさん:2011/07/04(月) 11:27:16.43
IGraphBuilder::Connect
964962:2011/07/05(火) 19:36:58.22
IGraphBuilder::Connectで中間フィルタを自動的に追加して接続できる
のは理解しているつもりなんですが、この時にメディアタイプを指定したい
のです。
あれ?何か根本的に間違ってますか?
965デフォルトの名無しさん:2011/07/05(火) 21:58:37.87
ICaptureGraphBuilder2::RenderStreamでメジャータイプとサブタイプの指定をしてやればいいんじゃなかったっけ。
だいぶ昔のことなので忘れた。
名前はキャプチャーグラフビルダーだけど、キャプチャーしない用途でも気にしないでバンバン使っていいから
966962:2011/07/06(水) 21:35:02.29
レスありがとうございます。
ICaptureGraphBuilder2::RenderStreamで指定できるのはメジャータイプだけのようです。
うーん、やっぱり普通はこんなことしないんですかねぇ。。

それにしてもキャプチャ関連でなくてもICaptureGraphBuilder2は使えるんですね。
これは知りませんでした!
967デフォルトの名無しさん:2011/07/06(水) 21:51:39.69
ごめん。嘘言った。

古いソース引っ張り出して確認してみたが
IGraphBuilder::ConnectDirectつかってるな。
アップストリームフィルタの出力ピンとダウンストリームの入力ピンを指定のメディアタイプで接続してる。

試してみて。
968デフォルトの名無しさん:2011/07/06(水) 21:55:56.48
中間フィルタを自動ではさんでほしいんだっけ。
じゃあだめだね。
すまん
969デフォルトの名無しさん:2011/07/06(水) 22:51:21.51
自前のレンダラならCBaseInputPin::CheckMediaTypeのオーバライドを調整すればいいだけだと思うが、
流れから言って既存のレンダラを使う話なんだろ?EVRかVMR9か知らんけど

インテリジェント接続で規定の優先順位に逆らいたいという事なら、入力ピンをラップするか
前にバイパスフィルタをかますかしてから入力ピンのIPin::QueryAcceptで不都合なメディアタイプを蹴るしか無いんじゃないか

どうも目的を聞いてみたら他の方法でいいだろという結論になりそうな匂いがしてならないが・・・
970962:2011/07/07(木) 10:58:53.37
皆様アドバイスありがとうございます。
やはり直接的な方法は無さそうですね。まぁ普通は必要ないですもんね。。。

今回は969さんの言われたように適当なバイパスフィルタを通して対処すること
で対応できました。ありがとうございました!
971デフォルトの名無しさん:2011/07/20(水) 17:38:02.49
 MFCのダイアログアプリで、ダイアログ上に設けたピクチャボックス中でAVIファイルを再生するサンプルは無いでしょうか?
急にDirectShowをいじることになって色々資料を漁ったりしているのですが、時間が限られており、
自分が理解しやすい形式になっているサンプルを探しています。
972デフォルトの名無しさん:2011/07/21(木) 13:19:31.97
WindowsSDKの中にビルドして物色可能なDirectShowのプレーヤ・サンプルがいろいろありますよ。>>971

相談です。USBキャプチャの挿抜を検出してグラフの停止、再起動を自動化すべく戦ってます。
(C# + DirectShowLib + MediaFundationLib)
キャプチャデバイスかどうかを調べるにはGUIDを較べるしかないのかなと思うのですが、手持ちのデバイスで実験したところ
DsDevice()のClassID、DEV_BROADCAST_DEVICEINTERFACE構造体のdbcc_classguid、デバイスマネージャで見えるデバイスクラスID
これら全部が異なっていることを確認して途方に暮れてます。。
ちなみに現在は、GraphEventのDeviceLostを使って抜かれた検出だけに対応しています。
できれば挿されたときにも履歴にあるデバイスの場合は自動でグラフ作成してやりたいのです。アドバイス下さい。
973デフォルトの名無しさん:2011/07/22(金) 01:13:26.65
WM_DEVICECHANGEでキャプチャデバイスの列挙行うぐらいしか思いつかないのう。
974デフォルトの名無しさん:2011/07/27(水) 16:24:02.76
>>972
普通にポーリングすれば良いんじゃない?
UVCならフィルタドライバ書くとか

USBデバイスIDは書かれて無いのしか見た事無いけど(安物しか買えないので…)ロジクールやMSのは書かれてるらしいので、デバイスを限定するとか
975デフォルトの名無しさん:2011/07/28(木) 08:16:26.64
>>973,974 感謝。しかし棚上げにしました。。
とりあえず、少なくともグラフが未構築のときに(キャプチャに限定せず)なんらかUSBデバイスが挿されたら、
コンフィグするかポップアップして尋ねるようにしました。しばらく使ってみて余計なお世話感が出るようだったら
この機能、削除します。難しいっす。
976デフォルトの名無しさん:2011/08/04(木) 10:02:49.10
>>971
もう解決してるかもしれないけど、とりあえず置いとく。MFCでってのがいいね。
OCNアク禁そろそろ解いてくんないかな。
http://3rd.geocities.jp/orekuma64/DSTest05.zip
977デフォルトの名無しさん:2011/08/05(金) 17:57:41.41
DirectShowに対応しているビデオキャプチャカードでお勧めのものはありますか?
使用する環境はWindowsXP、PIC or USB、入力ソースとして少なくともD2以上をサポート。
あと、きちんとDirectShowをサポートしていて、へんなソースフィルタとかじゃないやつがいいです。
(DirectShowのフィルタの仕様がわからなくてテキトーにつくったっぽいヤツではなく)

ViewCast製のオスプレイがよいとは思うのですが、IOデータあたりから安くていいのが出ていればそれに越したことは無いので。。
978デフォルトの名無しさん:2011/08/05(金) 18:23:52.57
DirectShowプログラムスレなのにハード購入相談って夏休みだな
プログラムに関しての質問は何?
979977:2011/08/05(金) 18:38:45.71
出力フォーマットがRGBやYUVをサポートしているものがいいです。
MPEG2のみ、とか、そもそも付属のキャプチャソフトでしか使用できないとかそういうものはなしでお願いします。
980デフォルトの名無しさん:2011/08/05(金) 18:41:07.36
>>977
PCのハード板で聞いたほうが良いんじゃないか
981デフォルトの名無しさん
ぶっちゃけDirectShow自体が鬼っ子なんで後々面倒になるのが嫌ならOspreyでいいと思うけどな。