DirectShowと戦うスレ Part 4at TECH
DirectShowと戦うスレ Part 4 - 暇つぶし2ch1:デフォルトの名無しさん
08/06/22 18:38:21
DirectShowプログラマーのみなさん。
メソッドのデッドロックとか、わけわからん現象多くないすか。
このスレに怒りやテクをぶつけましょう。

関連スレ
Win32API質問箱 Build67
スレリンク(tech板)
くだすれDirectX(超初心者用) part.3
スレリンク(tech板)
【C++】 DirectX初心者質問スレ Part17 【C】
スレリンク(tech板)
DirectX総合スレ (Part8)
スレリンク(gamedev板)
【PureVideo】DirectX Video Acceleration【AVIVO】
スレリンク(tech板)

2:デフォルトの名無しさん
08/06/22 18:38:51
関連サイト
MSDN Microsoft DirectX9.0 DirectShow
URLリンク(msdn.microsoft.com)
DirectX ホームページ
URLリンク(www.microsoft.com)
MSDN ホームページ
URLリンク(www.microsoft.com)
MSDN ライブラリ
URLリンク(msdn.microsoft.com)
MSDN 2 ライブラリ
URLリンク(msdn2.microsoft.com)
Geekなページ DirectShowプログラミング [VC++]
URLリンク(www.geekpage.jp)
あひるのホームページ DirectShowをよりよく使いたい人たちのサイト
URLリンク(hammer.prohosting.com)
Windowsでビデオキャプチャを作るため参考資料まとめ
URLリンク(www1.bbiq.jp)
奈良高専 土井研究室  動画あれこれ
URLリンク(wwwdoi.elec.nara-k.ac.jp)
東京理科大 Kato Laboratory プログラミングキャプチャ
URLリンク(www.katolab.ee.kagu.sut.ac.jp)
京大川嶋氏 DirectShowのビデオキャプチャプログラミング
URLリンク(vision.kuee.kyoto-u.ac.jp)
M.Oshikiri's HomePage
URLリンク(www.geocities.jp)
DirectShowを利用した透明ウィンドウでのビデオ再生
URLリンク(codezine.jp)

3:デフォルトの名無しさん
08/06/24 20:40:35
新スレたったんだ

4:デフォルトの名無しさん
08/06/28 14:08:40
初カキコ失礼します

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

URLリンク(ship.nime.ac.jp)

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

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

ご教授の程、よろしくお願いします。

5:デフォルトの名無しさん
08/06/29 21:24:11
過疎ってるなw

6:デフォルトの名無しさん
08/07/02 22:26:47
1乙
ってか、自分でも立てようかと思ったけど、
すぐ落ちるとイヤなので様子見してた・・・

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

ざっと試してみたけどVideo Extraction Filterを使おうとしてるのかな?
ソース見てないからよく分からないけど、確かにちょっとおかしい。
ffdshowで出力フォーマットをいろいろ変えてみたが、
入力可能な正しいフォーマットはなんじゃろな。
暇があったら後でソース見てみる

7:デフォルトの名無しさん
08/07/02 22:53:12
ageとくぜよ

8:デフォルトの名無しさん
08/07/05 13:56:15
hage

9:デフォルトの名無しさん
08/07/17 21:43:58
9

10:デフォルトの名無しさん
08/07/26 18:42:31
あへ

11:デフォルトの名無しさん
08/07/27 04:16:12
過疎と戦うスレ

12:デフォルトの名無しさん
08/07/27 04:22:15
DirectShowはもう終わりだというのか・・・!

13:デフォルトの名無しさん
08/07/27 11:30:33
M$が何考えてるかわからん

14:デフォルトの名無しさん
08/07/29 19:32:10
DirectShowを使って動画から映像だけ抜き出してwmvに変換するプログラムを作成しようと思ってます。
まずフィルタグラフをどう構築すればいいのかと思ってGraphEditで試しているのですが
WM ASF WriterのAUDIOピンを繋がないとエラーになってしまいます。
無音声のwmvファイルを作成する場合AUDIOピンに何をつっこめばいいのでしょうか?


15:デフォルトの名無しさん
08/07/31 23:57:26
cygwin上で,DirectShowを使う方法ご存知の方いらっしゃいますか?

DirectXに関しては以下のページの方法でcygwinから動かすことできました.
URLリンク(d.hatena.ne.jp)

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

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

どなたかわかる方いらっしゃいましたら,御教授宜しくお願いします.

16:デフォルトの名無しさん
08/08/01 03:55:12
>>14
確かにエラーになるね。
適当なAudio Capture Sourceを突っ込めば無音のwmvを作ることはできるけど、
ビデオ終端で自動終了できない・・・。

>>15
SDLにDirectShowのラッパーはないんじゃない?

17:デフォルトの名無しさん
08/08/01 03:58:31
あ、.NETがCygwinから使えるならRCW経由でDirectShowを使えるような気がするな。
誰か試してみない?

18:15
08/08/01 18:26:19
>>16さん
>>17さん

レスポンスありがとうございます.
URLリンク(support.microsoft.com)
頂いたヒントを頼りに,このページを見つけました.
ありがとうございました.

19:デフォルトの名無しさん
08/08/01 22:15:35
Windows SDK (Platform SDK)入れて、その中のVC++コンパイラ使えばいいだろって気もするが。

20:15
08/08/01 22:42:59
>>19
正論です.

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



21:15
08/08/01 22:49:04
cygwin

.NET Framework 2.0 SDK

Directshow.NET 2.0(ラッパー)

Directshow

17さんの言うとおり,
上記の道が考えられますが…,難しいですね.
もう少し頑張ってみます.

22:デフォルトの名無しさん
08/08/01 23:35:21
簡単にやるならVS使えよ

23:デフォルトの名無しさん
08/08/03 14:23:16
>>16
レスどうもです。

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

もう少し悩んでみます。

24:デフォルトの名無しさん
08/08/04 01:24:00
すみません。
yahooチャットのビデオに自作のDirectshowフィルタを挟んで
効果を付けてみたいのですが可能ですか?
例えば文字スーパーを流すようにしてみるとかしてみたいのですが・・・
yahooチャットのビデオがどのようなフィルタ構成になっているかわからず
出力メディアタイプとかわからないです。
接続に関してはインテリジェント接続になっていてくれさえすればメリット値を変更で
なんとかできないかなって思っています

25:デフォルトの名無しさん
08/08/05 08:54:08
Win標準のVideo Rendererって、
アスペクト比が4:3と16:9のものしかまともに再生されないけど、
CIFみたいな中途半端なサイズのせいなの?
それとも適切なパラメータを出力ピンに設定していないから?
誰かわかりませんか。形式はyv12です。

26:デフォルトの名無しさん
08/08/05 13:44:37
yv12

27:デフォルトの名無しさん
08/08/05 23:10:13
yv12に限らず、フレームバッファの確保の仕方次第で
レンダラ側で確保されるバッファのサイズが変わってくるんだね。
ffdshowはどうやってそこらへんを上手く処理してるんだろう…

28:デフォルトの名無しさん
08/08/05 23:26:51
1ピクセル単位で任意のサイズ使えるぜ?

29:デフォルトの名無しさん
08/08/05 23:50:25
出力ピンに設定している画像サイズがわかるツールつくったぜ?
>>24答えてくれたら放出するよ

30:デフォルトの名無しさん
08/08/06 08:51:59
>>28
あれ。そうなんですか…
GetMediaTypeで伝えるだけじゃだめなのかな。
Transformが呼ばれる時点で既にpOutには変更されたサイズが入ってしまってるんだけど…
もしかして再接続を適切に処理してないからでしょうか。

31:デフォルトの名無しさん
08/08/06 23:34:37
ROT使って、どうつながってるか覗いてみるとか。
などと適当に書いてみる。

↓やりかた
URLリンク(vision.kuee.kyoto-u.ac.jp)

32:デフォルトの名無しさん
08/08/07 00:10:51
相武沙希がかわいすぎてDirectShow

33:デフォルトの名無しさん
08/08/07 14:52:12
>>24
あれは動画と言うより静止画で、鯖から要求されたときに
jpc(Jpeg2k)形式の1フレームの画像ファイルを送ってるだけなので
やろうとしてることを実現したければ、webcam画像取り込み、加工、
エンコード、パケット送信まで丸ごと作っちゃうか
ビデオ入力デバイスとしてwebcamの画像を横取り、加工する何かを
作るしかないと思う。←たぶんやりたいのはこっち?

jpcは写真とかは得意だけど文字とかはボケボケになった気がする。
丸ごと作っちゃうパターンだと圧縮率変えれば文字も綺麗に見えるけど、
受信側のデコードで負荷がかかりすぎて
PCがフリーズする視聴者続出させた記憶があるw

34:デフォルトの名無しさん
08/08/07 20:39:02
>>33
そうですか。
単純にキャプチャフィルタと画像送信フィルタ構成で出来ているとばっかり
思っていました。
画像を横取りできたとしてもエンコード、パケット送信までは作れないから
諦めかな?

んで、フィルタの放出はした方がいいかい?

35:デフォルトの名無しさん
08/08/07 21:07:02
いらん

36:デフォルトの名無しさん
08/08/08 21:10:57
じゃあ、俺の妹(高校生)の寝顔は?
(´・ω・`)?





俺の脳内妹かわいいよ

37:デフォルトの名無しさん
08/08/11 13:27:03
aviファイルの画像と音声を抜き出したいんだけど、どこかにサンプルがないかな?
Video for windows の例はいくつか見つかるんだけどね。
詳しい方、よろしくお願いします。

38:37
08/08/11 13:46:21
補足
業務で使うので、ツールではなくやり方が知りたい。
画像の抜き出しは見つけた。音声の抜き出し方がわからない。
以上、よろしくお願いします。

39:デフォルトの名無しさん
08/08/11 14:40:41
しばらくGraphEditで遊んでみれば分かる。

40:デフォルトの名無しさん
08/08/11 14:45:13
こんなゆとりを飼っている会社も大変だな


41:デフォルトの名無しさん
08/08/11 18:58:30
でも3ヶ月後はお前らぶち抜いてるかもよ
そういうもんだ

42:デフォルトの名無しさん
08/08/12 00:30:53
それも癪なので教えないでおこう

43:デフォルトの名無しさん
08/08/14 11:43:50
>1参照

44:デフォルトの名無しさん
08/08/17 14:26:53
DirectShowを使った録画アプリケーションをサービスとして実装し、
ログインしていない時に録画できるようにする事は可能なのでしょうか?
例えばプレビューは無しでもデスクトップがないとグラフを構築できないといったような制限はあるのでようか?

45:デフォルトの名無しさん
08/08/17 14:34:26
なんでその程度の試す手間を惜しむの?

46:デフォルトの名無しさん
08/08/18 23:00:32
CheckTransformに渡ってくるレンダラからの要求サイズで絵を作って渡しているのに、
YV12形式だとQCIFだけ横幅がおかしく表示されます…

47:デフォルトの名無しさん
08/08/23 12:37:30
DirectShowの質問です。

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

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

DirectShowというと、マイナーでネット上のサンプルも少ないというイメージで
触っている人が少ないかもしれないかと思うのですが、わかる方が居ましたら
よろしくお願いいたします。


48:デフォルトの名無しさん
08/08/23 13:04:32
レンダラの出力がテクスチャになるようなフィルタを作る。

手動でフィルタ接続が速いかも

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

ありがとうございました。ちょっと色々とやってみます。

50:デフォルトの名無しさん
08/08/28 11:00:10
>>47
URLリンク(homepage1.nifty.com)
張るのが遅かったな


51:デフォルトの名無しさん
08/09/29 18:50:07
DirectShowでマルチチューナに対応したTVクライアントを書こうとして最初で躓いてしまいました。
あるBDAチューナデバイスAがサポートするチューニング空間を列挙する方法が知りたいのですが、
何かいい方法はないでしょうか?

52:デフォルトの名無しさん
08/09/29 23:27:51
COMの質問なのか
COMは分かってるけど適当なAPIが見つからないのか
APIも分かってるけど挙動がおかしいのか、などなど

53:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/30 19:58:20
CBaseVideoRendererを使って
テクスチャにレンダリング、DirectXで表示という
いわゆるムービーテクスチャー方式で再生しているのですが
Vistaのフルスクリーン時のみフリーズする現象にぶち当たってます
VistaウインドウモードやXPでは問題ないようなのですが・・・
DoRenderSample内のテクスチャのロックが
癌なような気がしないでもないですが対処法がわかりません
なにか解決方法はありますか?

55:デフォルトの名無しさん
08/09/30 20:04:13
デバッグしろ

56:デフォルトの名無しさん
08/09/30 20:09:22
リモートデバッグ環境がないので
フルスクリーン時のデバッグができないのです

57:デフォルトの名無しさん
08/10/01 00:43:59
マルチスレッドのフラグ立ててデバイス作っていないのに、複数のスレッドでアクセスしてデッドロックしている感じもする。

つーか、お前の環境なんて知ったこっちゃない。マルチモニタでやるなりログ出力するなり好きにしろ。
最低限の道具も揃えられないようだと話にならない。

58:デフォルトの名無しさん
08/10/02 02:02:13
VB.net2005でDirect Show を使用し動画から音声を抽出→音声波形を作成
ということをしたいのですが,どのようにしたらよいのでしょうか?
Direct Showの使い方もわからず,教えていただけないでしょうか?


59:デフォルトの名無しさん
08/10/02 02:12:40
まずはC++を使ってください。C++以外の言語でDirectShowを扱うのは愚かな行為です。
次にサンプルやドキュメントを読んで基本的な仕組みを理解してください。

60:デフォルトの名無しさん
08/10/02 03:05:24
>>59さん
ありがとうございます,VC++でやるのが普通なのですか・・・
vb.netでやるのが仕事の条件だったもので結構探してみたんですがなかったのはそういことだったんですね.
ありがとうございます.

61:デフォルトの名無しさん
08/10/02 16:19:48
>>60

.NET(C#) で GUI とグラフ作成・制御、C++ でフィルタの画像処理という
組み合わせなら .NET 初めての身にもそこそこ作り易かった記憶があります。

・.NET から DirectShow を扱うためのライブラリ
URLリンク(directshownet.sourceforge.net)
Platform SDK 内の DirectShow サンプルのほとんどが
C#で書き直されているので、グラフ作成・制御方法の参考になるでしょう。
当然ながら Unmanaged なリソースを扱うので
Marshalling の面倒をイヤというほど味わうことになるのは覚悟して下さい。

また、フィルタを .NET で書くことも可能らしいです…。(実際にやったことはありませんが)
・C# で DirectShow フィルタのプロトタイプを作成
URLリンク(www.codeproject.com)
パフォーマンスに問題があるのであくまでプロトタイプの作成に
留めた方がよいそうです。本番の時はC++で。


62:デフォルトの名無しさん
08/10/03 00:00:16
その辺のいろいろな手間考えるとまあ>>59だろうなあ

63:デフォルトの名無しさん
08/10/03 00:10:43
>>61さん
ありがとうございます.

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

とりあえず,真剣に無理そうならvc++でdllを作成するという方向になるかと思われます.

64:デフォルトの名無しさん
08/10/03 01:49:27
.NET環境はCOMの扱いが面倒なんで、結局C++なDLLでやって値だけ得るのがいい。
VSなら言語やモジュールが分かれていてもシームレスにデバッグできるよ。
GUI(C#)+DLL(C++)も簡単。

65:デフォルトの名無しさん
08/10/03 09:19:05
最新のDirectX SDKをインストールしたのですが
GraphEditが見当たらないのですがどこにあるのでしょうか?

66:デフォルトの名無しさん
08/10/03 10:14:06
今はWindows SDK for VISTAのほうにあるんじゃないかな。

67:デフォルトの名無しさん
08/10/03 10:40:23
なんですとー!

68:デフォルトの名無しさん
08/10/03 11:04:46
URLリンク(msdn.microsoft.com)
このBDAサンプルが動く地デジ・ワンセグチューナってありますか?

69:デフォルトの名無しさん
08/10/07 18:22:12
DirectShowつかって、Form上に動画を表示しています。
その画面上にlabelやtextboxを表示したいのですが、動画の下に隠れて(?)しまってみえません。

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

VS2005 C#です。

70:デフォルトの名無しさん
08/10/07 19:16:19
コントロールを最前面に移動させるとかフォームじゃなくてパネルにして最背面にするとか

71:69
08/10/07 19:55:08
>>70
できました!!!!!!ありがとうございます。


72:デフォルトの名無しさん
08/10/08 04:24:48
おいおい このまま終了か?あげとくぞ

73:デフォルトの名無しさん
08/10/08 14:33:08
このスレは書き込み少ないんで、age推奨でもいいかもしれんね

74:デフォルトの名無しさん
08/10/14 13:29:15
すいません質問です
DirectShowを使用してWMVファイルを再生する際にはWMAudio Decoder DMOとWMVideo Decoder DMO
を使用するとよいというのはRender Media Fileを使って理解しました.

その上で再生するのとは別個にWMAをファイルとして保存したいのですがWMAudio Decoder DMOの次のフィルターをどのようにすればよいのでしょうか?

75:デフォルトの名無しさん
08/10/17 12:19:37
質問で申し訳ないんですがDirect show file reader プラグインのファイルを何度も解凍してもいくつかのファイルがエラーしかでません
ds_inputとds_input.auiと読んでね、が解凍できたのですがこれは正常なんでしょうか?
それとも解凍できてないファイルがあるのかファイル自体がエラーおこしてるのか教えていただけるとありがたいです

76:デフォルトの名無しさん
08/10/17 14:12:50
DTV板に池

77:デフォルトの名無しさん
08/10/17 14:17:18
「読んでね」は読んだのか?

78:デフォルトの名無しさん
08/10/24 04:53:39
質問です.
Windows SDK v6.1 + VS 2005 Academic Editionを使用しています.
DirectShowのSample Filterをビルドしてみたところ以下のエラーが出てビルドが通りません.
解決策はないのでしょうか?

79:78
08/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:デフォルトの名無しさん
08/10/24 12:27:28
>>79
DirectShow 基底クラス(自分でビルドする必要あり) がリンクされてない
場所は SDK のフォルダから上記クラス名で検索をかけてみればすぐに見つかる


81:79
08/10/24 17:53:57
インクルードディレクトリして
C:\Program Files\Microsoft SDKs\Windows\v6.1\Samples\Multimedia\DirectShow\BaseClasses
を追加で指定したのですが,これだけではないのでしょうか?

82:デフォルトの名無しさん
08/10/24 18:26:56
そこにソリューションのファイルあるだろう
ビルドしてみそ。Vistaだと別の場所にする必要がある。
そこでできたlibをリンク

83:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/10/26 13:59:49
3秒分だけをリアルタイム処理したいの?
ソースは何を想定してるの?

85:デフォルトの名無しさん
08/10/26 14:40:40
クロック無視してデータをなるべく早く流したいときはフィルタグラフのIMediaFilter::SetSyncSourceにNULLを渡す。
ヘルプのReference Clocksを参照。
しかし>>83のWaitForCompletionの使い方は何か勘違いしてる予感。

86:デフォルトの名無しさん
08/10/26 22:34:40
シューティングゲームなどで複数の効果音を連続で再生させるような場合、
DirectShowは不向きですか?


87:デフォルトの名無しさん
08/10/26 23:54:02
DirectSound or OpenALでおk。つーか調べろ。

88:デフォルトの名無しさん
08/10/27 03:21:32
>>84
3秒と書いたのは、任意の時間分のデータを取得したかったので、
とりあえず3秒としただけなんです。 エフェクト用のバッファが0.5秒なら0.5秒だったりします。
ソースはDirectShowで処理できる任意の音楽データです。

>>85
Reference Clocksを参照してみます。
IMediaEvent->WaitForCompletion(3000, &evCode); には特に意味はありません。
IMediaEvent->WaitForCompletion(INFINITE, &evCode);ですべてのデータを取得していたのですが、
例を3秒としたので、単純に書いてみました。

>>84,85 返信をありがとうございました。


89:79
08/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:デフォルトの名無しさん
08/10/27 19:31:08
>>89
LPCTSTR がどこのヘッダで定義されているか検索してみるよろし

91:デフォルトの名無しさん
08/10/27 21:33:00
どんどんすれ違いな方向へ・・・

92:メモ
08/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

URLリンク(forums.microsoft.com)


93:デフォルトの名無しさん
08/11/05 18:42:42
79の書き込みを見てビルドしてみたんだが,なんかビルド通らねえな
文字セットもマルチバイト文字セットを使用するにしたし,
Windows.hもインクルードしたんだが・・・
refclock.hの80/139/178/166とsyclock.hの25行目でエラー出る

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

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



94:デフォルトの名無しさん
08/11/05 19:30:21
>>79ってサンプル?
>>82だけど、実際にビルドできるの確認して書いたんだけど。

95:デフォルトの名無しさん
08/11/05 19:31:09
>>93
マジですか
Ver6.0 しか使ってなかったので
帰宅したら 6.1 で試してみよう


96:94
08/11/05 19:31:47
ググってみたけど、Dshow.hが複数あって別のやつがincludeされてた、というのがあったが

97:95
08/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:デフォルトの名無しさん
08/11/07 00:23:02
BaseClassesのStreams.hをインクルードしたつもりが
別のStreams.hがインクルードされてしまっていたことがあった(>>93みたいなコンパイルエラーが出てたはず)
BaseClassesが先頭になるように、インクルードの優先順も見直してみるといいかもね。

99:93
08/11/07 14:21:42
文字セットがUNICODE版じゃなかったのが問題だったぽい.騒がしてすまん
後,BaseClassesを先頭に持ってくるようにしたら,すんなりとコンパイルできた
とりあえず,BaseClassesは先頭に持ってこないとコンパイルエラーでるっぽい.

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



100:sage
08/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:デフォルトの名無しさん
08/11/21 15:51:52
>>100
ピッチの指定ができなかったから結局は自前コピーが必要かもしれない。
自前のアロケータ(ISampleAllocator)を返してやればそれを使ってくれることもあるけど使用するとは限らない。
個人的にはFBOのほうが好きだ。PBOよりパフォーマンスがいい気がする。
まあこのくらいのメモリコピーなんて気にするな。こういう状況はよくあること。

102:デフォルトの名無しさん
08/11/21 19:24:32
>>101
情報ありがとうございます。
無理っぽいですか・・。
とりあえず、教えていただいたアロケータ関連を調べてみます。
運よくつかってくれればラッキーってことで。

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

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



103:デフォルトの名無しさん
08/11/21 20:51:18
ふと思ったけどPBOじゃなくて普通に受け取ったサンプルのバッファでglTexSubImage2Dするのが簡単だな。コピー量同じじゃね?
FBOは主にオフスクリーンレンダリング用途だけど↑の理由から使う意味があんまりない。どっちかというと逆の用途用。
以前ベンチマークしてみたことがあるんだが、FBO実装のほうが速い結果を得た。
ついでに将来的にPBOは消えるというかサポートされなくなる話も聞いたり。

104:デフォルトの名無しさん
08/11/21 21:05:44
IBasicVideo の GetCurrentImage を使って、
ビデオのワンフレームをビットマップとして保存しようと思っているのですが、
ソースが mpeg2 の場合だと何故か真っ黒なビットマップしか取得できません。
ソース、取得するフレームの位置、mpeg2 video decoder を色々変えて試してみたのですが、
結果は変わりませんでした。
ソースが avi, wmv, mpeg1 の場合は正常なビットマップを取得でることを確認済みです。
このことについて何かご存知の方おられましたらご教示お願いします。
試した mpeg2 video decoder は次のものです。
MpegVideoDecoder PIXELA, Cyberlink Video/SP Decoder

105:デフォルトの名無しさん
08/11/21 23:01:46
上に便乗なんですが、GetCurrentImageでバッファサイズを取得すると40バイトほど大きくなってしまいます。
まあ、使った動画がどちらも160×112の動画なので、他の場合はどうなるのか分からないんですが
この大きくなってしまうのは何が原因と考えられるのでしょうか?

106:デフォルトの名無しさん
08/11/21 23:46:52
>>102
OpenGLは詳しくないんで>>103氏のコメントで正しいんでしょうが、
>>101でも触れられている通りデコーダがテクスチャのピッチ通りに
データを吐けるとは限らない(というか多分無理)ので、
デコーダから直接書き出すのはかなり難しいでしょう。
(デコーダもデコーダでいろいろ高速化の制約を受けてたりするし)

>>104
IBasicVideo::GetCurrentImageはいろいろ制約が多いそうなので、
ちょっと面倒でもSampleGrabberを使ってみることをお勧めする。
なあに、慣れれば大したことないから。
(参考) URLリンク(www.geekpage.jp)

あと、サンプルのDumpフィルタベースで自前キャプチャフィルタを作ったこともある。
SampleGrabberより敷居高いのでお勧めしないけどw

>>105
IBasicVideo::GetCurrentImageのドキュメント読むべし。

> メソッドが成功すると、バッファには BITMAPINFOHEADER 構造体、Win32 BITMAPINFO 構造体に定義されている
> パレット エントリおよびビット マスクを含む DIB イメージ全体が書き込まれる。
だぞ。
40バイトってBITMAPINFOHEADERのことじゃないか?

107:104
08/11/22 00:22:43
>>106
情報ありがとうございます。
自前で作られたフィルタは IBasicVideo や ISampleGrabber を使うより効率よさそうですね。
うらやましい限りです。
実は ISampleGrabber を使ったことがあります。
そのときは、参考ページの geek さんの方法と同じく、
ISampleGrabber を RGB24 で SetMediaType しました。
すると、ソース が mpeg2 で video decoder が Cyberlink の場合だと、
ISampleGrabber が繋がらなかったのであきらめてしまいました。
Cyberlink の output pin が RGB 出力に対応していないのが原因というところまでは分かりました。
再び質問で申し訳ありませんが、
[Cyberlink S/P decoder] -> [ISampleGrabber]
↑を実現するためにはどうするのがいいでしょうか?
1. video decoder と ISampleGrabber の間に適当な color space converter をかます
2. ISampleGrabber の入力ピンの対応フォーマットを増やす(例えば YUY2)
3. それ以外の何か

108:106
08/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:デフォルトの名無しさん
08/11/22 00:49:41
>>107
RGB32

110:104
08/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:デフォルトの名無しさん
08/11/22 14:50:54
Geekなページを参考にDirectShowを勉強してみようと思ったのですが、
『GraphEdit』が見つかりません
もしかして、今はGraphEditは無いのでしょうが?

112:デフォルトの名無しさん
08/11/22 15:14:16
>>111
今はDirectShowもGraphEditもWindows SDKに入ってる。
URLリンク(www.microsoft.com)

113:デフォルトの名無しさん
08/11/22 15:33:03
あ・・・れ・・・?
もしかしてインストールするのを間違えたという事なんでしょうか?
アンインストールはSDKのフォルダを削除すればいいんですよね?

114:デフォルトの名無しさん
08/11/22 16:13:20
SDKのbinの中にあるよ

115:デフォルトの名無しさん
08/11/22 21:48:46
若干スレ違いかもしれませんが、お邪魔します。

他人の作ったVMRを利用した動画再生ソフトの再生画面に、自前の絵・文字を合成したい場合、
CoCreateInstanceをAPIフックして、IBaseFilterが作成される時にIVMRMixerBitmapを勝手に作成
という流れで問題はないでしょうか?
試してみたところ、一応思い通りには動いてくれているようなのですが、
APIフックやDirectShowに対する知識があまりないため、もっと簡単にやる方法があるんじゃないかとか、
この方法だと(予期せぬ)問題が生じるんじゃないかとか思っているのですが、
そのあたりのご意見いただければ幸いです。

116:105
08/11/22 22:45:15
>>106
どうもありがとうございました。コピペしたのでそこに気づいてませんでした・・・ww


117:デフォルトの名無しさん
08/11/23 00:41:02
DirectShowにもっと簡単にやるという概念などない
ひたすら泥臭い

118:106
08/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:デフォルトの名無しさん
08/11/23 04:07:11
デコーダのハードウェアアクセラレータの設定を切ると大丈夫、
とかないかな。

120:106
08/11/23 07:28:16
ソレダ!!
後でやってみよう

121:106
08/11/24 00:28:42
いやはや、普通に "Use Hardware Accelerator" というオプションがありましたな。
それを切ればYUY2で接続することができました。

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

では、おやすみなさいませ

122:104
08/11/26 01:13:25
106 さん、色々と調べてくださりありがとうございます。
私なりに解決方法を模索した結果、
CBaseVideoRenderer から派生したとある video renderer を
カスタマイズすることで問題を解決させました。
その video renderer は私が望んでいた大抵の条件を満たすものとなりました。
出処と詳細については申し訳ありませんが記せません。
SampleGrabber を使わなかった理由は、
これにもいくつかの制限があったからです。
URLリンク(msdn.microsoft.com)(VS.85).aspx

123:デフォルトの名無しさん
08/12/01 10:14:41
フィルタを登録する時はどうすればいいんですか?

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

フィルタ CLSIDの項目をいれたんですが、)が無いとか言われるんです。

124:デフォルトの名無しさん
08/12/01 10:16:07
すいません)がありませんでした

125:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/03 04:46:50
FileWriterは AVI ファイル用だったきがす。mux挟まないと駄目。
Waveファイル出力フィルタは標準で存在しない。SDKに WavDest というサンプルがある。
まずはドキュメントを一通り読むことだ。

127:デフォルトの名無しさん
08/12/03 06:45:19
ためしにAVIMuxを間に入れたらAVIのファイルコピーができあがりました。
ずっと行き止まりで助かりました。
ありがとうございました。

128:デフォルトの名無しさん
08/12/10 21:39:36
再生中の動画から静止画をキャプチャしてDirect3Dのテクスチャに書き込みたいんですが、
どうやって画像を取得すればいいですか?なるべく高速に動作する方法を使いたいです。
ビデオウィンドウも表示されないようにしたいです。

129:デフォルトの名無しさん
08/12/10 21:44:02
GraphEditで色々遊んでみな

130:デフォルトの名無しさん
08/12/13 22:06:21
MSのDirectShowのドキュメントは何処にあるんですか?
MSDNで検索してもいいんですが、インターネットに接続できないことが多いので・・・

131:デフォルトの名無しさん
08/12/13 22:38:15
>>130
英語でよければ
つ WindowsSDK

日本語が必要なら
URLリンク(www.microsoft.com)

132:デフォルトの名無しさん
08/12/14 16:41:58
すいません。質問です
mpeg2デコーダの出力ピンがDirectX Video Acceleration (DXVA)でビデオレンダラに接続されている状態で、
自作した変換フィルタをその出力ピンとビデオレンダラの間に接続したいのですが、何か方法ありますか?
変換フィルタの入力ピンのMediaのSubTypeがRGBやYV12では接続できませんでした
DXVAのビデオアクセラレーションが効いている状態では変換フィルタを接続することはできないということでしょうか?

133:デフォルトの名無しさん
08/12/14 20:49:49
GraphEditで色々遊んでみな

134:130
08/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:デフォルトの名無しさん
08/12/14 21:36:45
>>133
GraphEditでいろいろ遊んでみました
DXVAを使うmpeg2デコーダの場合は「接続に必要な中間フィルタの組み合わせが見つかりませんでした」で変換フィルタが接続できませんでした
DXVAを使わないmpeg2デコーダにすれば変換フィルタを入れられるのですが、ハードウェアの再生支援がなくなるのでCPU負荷が高くなります・・・
DXVAを使うデコーダのメリット値が一番高い場合、自動的な組み合わせではなく、変換フィルタと接続できるデコーダを自力で探さないといけないのが少々面倒ですね
H264のデコーダでもDXVAが使われることがあるので、DXVAに対応させるように変換フィルタを組み合わせるのは結構大変ですねオワタ\(^O^)/

136:130
08/12/14 22:02:30
Streams.hも探しているんですが無いです・・
いったい何処にあるんだ亜!

137:デフォルトの名無しさん
08/12/14 22:32:15
>>136
Streams.h は Microsoft Platform SDK のサンプルの下にあるよ
例)C:\Program files\Microsoft SDKs\Windows\v6.0\Samples\Multimedia\DirectShow\BaseClasses
サンプルを要らないと思って消すと見つからなくなるわな


138:デフォルトの名無しさん
08/12/14 23:00:23
>>130
こんなとこで、クダまいてないで、ググったほうが早いぞ。
手当たり次第に見ていけば環境構築について書いたHPくらいすぐ見つかるじゃろ。
というか、テンプレの関連サイトくらいは全部のぞいとくべし。

139:130
08/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:デフォルトの名無しさん
08/12/15 23:56:01
URLリンク(www.shader.jp)
これをビルドしたいだけなんですが、リンクでよく分からないエラーが出ます。

まずatlbase.hが無いといわれたので、
ATLをWinDDKからとってきて、
Streams.hをサンプルからとってきて、
strmbase.libもビルドしてVC++ディレクトリに設定しました。
それでもまたエラーが出るので
/NODEFAULTLIB:libcmt.libを設定しました。

これから先どうすればいいんでしょか・・?これはググっても全然分かりません。

141:デフォルトの名無しさん
08/12/15 23:57:16
C/C++でプログラム書いたことあるのか???

142:デフォルトの名無しさん
08/12/15 23:58:03
>>135
mpeg2デコーダとDXVAの間に自作フィルタ入れたいんだよね?
サンプルでさ、NullNullフィルタだかNullInPlaceだか名前忘れたけど
何にもしないフィルタがあるんだわさ。
そいつを改造してmpeg2デコーダとDXVAに入れてみるといいよ。
改造内容はどのメディアタイプで繋がるのかログでも吐かせりゃいいべさ。

143:デフォルトの名無しさん
08/12/16 00:01:12
言い忘れた。
>mpeg2デコーダの出力ピンがDirectX Video Acceleration (DXVA)でビデオレンダラに接続されている状態で

一回接続させた後に接続解除して、Nullフィルタ繋ぐんだわさ

144:デフォルトの名無しさん
08/12/16 00:08:28
>>139
C++かVSスレで質問しろ。

145:デフォルトの名無しさん
08/12/16 01:55:37
>>139
Expressだとatlmfcがないから無理

146:130
08/12/16 15:07:14
>>144
そうすることにします・・
皆さん回答ありがとうございました。

147:デフォルトの名無しさん
08/12/18 23:37:26
フレーム単位でシークするのってどうやるの?
SetTimeFormatでTIME_FORMAT_FRAMEを指定したら
E_NOTIMPLが帰ってきて使えないんだが

148:デフォルトの名無しさん
08/12/18 23:56:16
自分でフレーム数をMediaTimeに変換してシークする。
かな。

149:147
08/12/22 22:57:00
>>148
遅れたがサンクス。

150:デフォルトの名無しさん
08/12/22 23:05:39
・再生処理に使う時間が充分あれば等速で再生し、
間に合わない場合は再生速度を遅くする
(つまり、一切フレームスキップをしないようにしたい)
・音声をリアルタイムに加工、出力する

この2つを実現するにはどうする?

151:デフォルトの名無しさん
08/12/22 23:06:15
かなり下がったし、age

152:デフォルトの名無しさん
08/12/22 23:49:58
C++で作ったフィルタをC#から使うのってどうやるの?
検索しても出ない

153:デフォルトの名無しさん
08/12/23 00:29:33
>>152
フィルタを使うじゃ抽象的過ぎてわからんよ。

154:デフォルトの名無しさん
08/12/23 00:43:57
手とり足とりということです

155:デフォルトの名無しさん
08/12/23 21:00:54
DShow.NETがあるやん。

156:デフォルトの名無しさん
08/12/23 21:33:31
もちろん、DirectShow自体COM Interopでもなんとかなるはず。

157:152
08/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:デフォルトの名無しさん
08/12/23 22:24:21
COMに対応したDLLってのは1のことか?
SDKのサンプルの改造じゃだめなの?

159:152
08/12/23 22:46:59
・・・どのサンプル?

160:デフォルトの名無しさん
08/12/23 22:50:45
SampVidとかだけど。

161:デフォルトの名無しさん
08/12/24 22:33:25
"C# DirectShow"でgoogle検索すると山ほど見つかるわけだが。
何を迷ってる?

162:デフォルトの名無しさん
08/12/25 00:38:38
DirectShowに関係ないところで迷ってるぽい

163:デフォルトの名無しさん
08/12/25 01:33:09
質問なのですが、HDVをDirectShowでキャプチャすることはできますでしょうか?

164:152
08/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:デフォルトの名無しさん
09/01/02 21:25:16
1フレーム目を表示させてすぐ一時停止状態にするのって
どうやるの?

166:デフォルトの名無しさん
09/01/02 22:21:16
目と指と反射神経を鍛える

167:デフォルトの名無しさん
09/01/02 23:19:34
普通にImediaControl::Runするとビデオが進んでしまうので
そうさせない方法を

168:デフォルトの名無しさん
09/01/03 00:07:03
Pauseでええやん。

169:デフォルトの名無しさん
09/01/06 14:21:02
ライブストリーミングを保存するために
動画を再生しながらファイルにも出力しようと思っているのですが
SampleGrabberで可能なのでしょうか?
Web上のサンプルは静止画を切り抜くものばかりで使い方がよくわかりません・・・


170:デフォルトの名無しさん
09/01/06 14:40:49
指定フレームの画像を抽出しようと以下のようにすると
MediaSeeking->SetPositions( ¤t, AM_SEEKING_AbsolutePositioning, &stop, AM_SEEKING_AbsolutePositioning );
::Sleep( 50 ); // ←これないとフレーム移動する前の画像になる
SampleGrabber->GetCurrentBuffer( &DIBBufferSize, (long *)DIBBuffer );

間にSleepを入れないと指定フレームの画像にならなのですが
もっと早く取る方法あったら教えてください。

171:デフォルトの名無しさん
09/01/06 15:10:32
>>169
可能です。
ただ、ファイル出力処理で滞ると当然コマが飛びます。
再生優先かファイル出力優先かによってコールバック内の実装をよく考えるべし。

>>170
IMediaControl::GetState()で必要最低限のウェイトを入れられると思います。
デバッグ中ならとりあえずINFINITEを入れてもいいでしょう。

172:169
09/01/06 16:03:26
>>171
ありがとうございます
現在
URLリンク(www.geekpage.jp)
こちらのページを参考にしているのですが
BMPではなくそのままの動画ファイルにするには
どういった部分を変更すればよいのでしょうか?

173:デフォルトの名無しさん
09/01/06 16:38:33
>>172
あー、ごめん、別に自前のメモリにビットマップが欲しいわけなじゃないのね。
じゃあ、この辺りを参考にしてみてはどうでしょう?
VBで書いてあるけど、大体意味は分かるでしょう。
URLリンク(www.geocities.co.jp)

簡単に説明すると、入力データを Infinite Pin Tee Filter で分岐させて、
Video Renderer と AVI Mux につっこむ。
ピンのつなぎ方が分からなければ、またそのときに。

174:デフォルトの名無しさん
09/01/06 17:01:41
>>171
ありがとうございます。
IMediaControl::GetState()で最低限のウェイトにできました。
所でこれはやっぱりウェイトを入れないとダメなものなんですか?

175:デフォルトの名無しさん
09/01/06 17:51:04
>>174
フィルタグラフ自体は別のスレッドで動いているものなので、
スレッド間で同期をとることを考えると仕方のないことですね。

176:デフォルトの名無しさん
09/01/06 18:12:26
>>175
そうなんですか。
ちなみに、最初のフレームから最後のフレームまで
順番に画像を抽出したい場合は>>170以外の方法でもっと効率がいいやり方はありますか?

177:デフォルトの名無しさん
09/01/06 18:41:58
なんか知らんが、普通にエンコードする時の様にフィルタ繋げるだけでいいんでね?

178:デフォルトの名無しさん
09/01/06 18:50:35
やりたい事は、最初のフレームから最後のフレームまで順番に
画像を取り出すだけなんですけどね。特に動画を再生する必要はないんですが

179:デフォルトの名無しさん
09/01/06 18:55:56
>>176
毎フレームSetPositionsをするのは確かに効率が悪いです。
可能であればSampleGrabberのコールバックを使った方がいいでしょう。

自分は以下の記事を参考にしてコールバック処理を実装しました。
URLリンク(codezine.jp)

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


しかし結局自分はSampleGrabberの実装を捨てることになってしまいましたorz
(まあどうでもいいことですが)

180:デフォルトの名無しさん
09/01/06 19:13:34
>>179
ありがとうございます。
参考にさせて頂きます~

181:169
09/01/06 19:14:29
>>173
度々ありがとうございます
VBはいまいち理解できてないのですがVC++の場合ですと
URLリンク(www.geekpage.jp)
こちらのページの入力をビデオカメラから動画ファイルに変更するということでよろしいのでしょうか?
的外れな質問でしたらすみません

182:デフォルトの名無しさん
09/01/06 19:41:19
>>181
そこにはキャプチャデバイスからAVIファイルに直接保存する方法が書いてありますが、
169さんの場合対象が(ネットワーク上の)ファイルからの再生だとすると
あまり参考にならないと思います。

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

ほな。

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

184:167
09/01/06 22:10:41
>>168
RunしてすぐにPauseするという事?

URLリンク(www.shader.jp)
を参考にレンダラー作ったんだけど
RunしてすぐにPauseすると一回もレンダリングが行われないで
ポーズしてしまう・・・

185:169
09/01/06 22:23:50
>>182
ライブストリーミングの場合はアドレスが「URLリンク(IP):ポート番号」になるので
GraphEditではどうやってソースとして指定できるのかがわかりません
再生することはできたので
要は再生している動画を別ファイルに保存するというようなことをしたいのですが
簡単な方法などないでしょうか?
何度も質問ばかりで申し訳ありません


186:デフォルトの名無しさん
09/01/06 23:40:19
>>184
DoRenderSampleで初回のフレームが到着したかどうかチェックして
ポーズをかけてみたらどうでしょう?
(やり方としてマットウかどうかはよく分かりませんが)

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

こっち(↓)みてコード書いた方が早いかも。
URLリンク(www.geekpage.jp)

187:デフォルトの名無しさん
09/01/07 10:13:37
ちょいと質問なんですが。
DirectShowがまだ何かに統合する前に作ったソフトがあるのですが
これ今でもDirectX9にしても普通にコンパイルできて動画がみれるのですが
コンパイルできてるなら特にSDKとかなくてもいいんですよね?

188:デフォルトの名無しさん
09/01/07 10:30:51
VFWでコーディングされているのではないかとエスパー
試しにコードの一部でもうpしてみれ

189:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/01/07 12:49:42
おおう、エスパー失敗w
普通にDirectShowね。
「まだ何かに統合する前」てActiveMovie時代のことを言ってるのかな?
当時はActiveMovie SDKのインストールが必要でしたね。

Visual Studio .NET 2003辺りならPlatform SDKのサブセットみたいなのが
同梱されていたと思うので、特にSDKを追加する必要はないはず。
2005以降だとEEであればPlatform SDKかWindows SDKのインストールは
必要になると思いますです、ハイ。

192:デフォルトの名無しさん
09/01/07 13:17:20
>>191
これDirectShow使うのに必要なのって
ヘッダファイル
DShow.h
QEdit.h

strmiids.lib
とDirectXがインスコされていればいいだけですよね?


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

まあ、コンパイルしてみれば分かることですけどね。

194:デフォルトの名無しさん
09/01/07 13:40:56
>>193
あ、そっか、そうですよね。
とりあえず今は普通にコンパイルが通るって事は
以前にインスコしたのがあるからなんですね。

195:デフォルトの名無しさん
09/01/09 18:04:57
Visual Studio 2008 Standard EditionってSDK入れないとダメですか?
何かExpressは同封されてるって書いてるんですが・・・

196:デフォルトの名無しさん
09/01/09 18:17:50
されてるって書いてあるのに何故インストしない?

BaseClassesの方ならStandardのSDKにすら入ってないよ。
いつもどうり別途Windows SDKが必要。

197:デフォルトの名無しさん
09/01/09 18:22:57
ExpressじゃなくてStandardだから。
Standardはどうなのか知りたかった

198:184
09/01/09 21:51:03
>>186
なるほど
DoRenderSample()
{
...
rendered = true;
...
}

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

URLリンク(www.geekpage.jp)

画像の取得はCBaseVideoRendererで、1フレーム目でとめるのには
SampleGrabberを使うということはできるのかな

199:デフォルトの名無しさん
09/01/09 22:34:33
>>184
そのままの意味だ。RunしないでPause。

200:デフォルトの名無しさん
09/01/09 22:37:33
URLリンク(msdn.microsoft.com)
つか、全部書いてあるだろ。ドキュメントくらい読め。

201:184
09/01/09 23:53:34
しかし なにもおこらない
Runして初めて表示される・・

202:デフォルトの名無しさん
09/01/10 00:58:38
oops!レンダラ自作してるのか。悪かった。
Pauseでポスターフレーム出す処理はレンダラが実装する必要があるんだわ。

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

これ追加するとよかばってん

203:デフォルトの名無しさん
09/01/10 08:09:02
おー、OnReceiveFirstSampleってそうやって使うんか。
184じゃないけどthx

204:169
09/01/12 19:29:05
とりあえずGraphEditを使ってみた結果
URLリンク(sageuploader.if.land.to)
このようにすることでライブストリーミングが保存できました
あとはこれをプログラムで書くだけなのですがピンのつなぎ方がよくわかりません

再生の場合は
URLリンク(www.geekpage.jp)
にあるように
pMediaControl->RenderFile(URL);
pMediaControl->Run();
という風にすればよいというのはわかるのですがこの場合はどうすればよいのでしょう?

SetOutputFileNameとRenderStreamを使えばよいのかな?と考えてはいるのですが
サンプルがビデオキャプチャからの取得方法ばかりで
こういった場合にどのような記述をすればよいのかわかりません


205:デフォルトの名無しさん
09/01/12 22:51:43
これ使って作ったツールはWindows2000でも動くかな?

206:デフォルトの名無しさん
09/01/13 01:18:52
>>204
RenderFilleやっちゃいかん。
ソースフィルタ(URL)をフィルタグラフに登録したあと、
出力ピンを列挙してAVI Muxに1つずつ接続すればおk

たぶん。
あ、あとファイル出力も手動で指定してフィルタ繋いでね。

207:169
09/01/13 06:56:07
>>206
ありがとうございます
以下のようなプログラムを作ってみたのですが

URLリンク(uploaders.ddo.jp)

コンパイルすれば通るものの実行してもファイルが作成されません
これはピンのつなぎ方などが間違っているのでしょうか?

208:デフォルトの名無しさん
09/01/13 12:50:40
なんでエラー値をチェックしないの?

209:デフォルトの名無しさん
09/01/13 16:10:02
>>206さんのアドバイスが理解されていない・・・・


210:デフォルトの名無しさん
09/01/13 17:18:19
>>208
チェックしてみましたがどこもエラーは返ってきませんでした

>>209
すいません・・・
>>206
URLリンク(msdn.microsoft.com)
の辺を参考にしてやってみたんですがどの辺がおかしかったでしょうか?

ソースフィルタ(URL)をフィルタグラフに登録、というのは
pGraph->AddSourceFilter(URL, L"Source Filter", &pSrc);
出力ピンを列挙してAVI Muxに1つずつ接続
というところはRenderStreamを2回行ってみたのですが
根本的に間違っていたりしたらすみません・・・


211:169
09/01/13 18:38:16
あー見返すとなんか滅茶苦茶ですね
一から書き直してきます

212:デフォルトの名無しさん
09/01/13 19:57:05
URLリンク(okwave.jp)

213:デフォルトの名無しさん
09/01/13 20:29:46
サンプルをビルドして動いたからと言って
安易に一歩踏み込むとすぐに樹海に迷い込むのがDirectShow。


214:169
09/01/13 22:44:13
以下のように作り直してみたのですが、

URLリンク(uploaders.ddo.jp)

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

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

GraphEditでは簡単にできても実際に作るのは難しいものなのですね
単に私が駄目なだけかもしれませんが

215:デフォルトの名無しさん
09/01/13 22:55:51
確かに、GraphEditの様子をそのままコードにしてくれるツールがあったら欲しいな。

216:デフォルトの名無しさん
09/01/13 23:37:12
>>214
MSDNの通りにプログラムが書けてない。
IGraphBuilderはCoCreateInstanceしない。
ICaptureGraphBuilder2からGetFiltergraphで取得する。

217:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/01/14 01:21:22
なんだそのGetPinってのはどこからでてきた?自作メソッドなのか?

219:デフォルトの名無しさん
09/01/14 01:38:19
>>218
これ使ってピン同士を接続するのかなと思ってコピペしてきたら
ただの自作メソッドでした
早とちりしてすみません
削っても動かないことに変わりはないのですが・・・

220:デフォルトの名無しさん
09/01/14 01:42:46
>>219
もう少し頑張って勉強してからまたおいで。
エスパーじゃないから、そんなんでコンパイル通らないとか言われても困るわ。

221:デフォルトの名無しさん
09/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にはなりませんでした。
何が原因でしょうか?

222:221
09/01/15 19:18:33
対象コンピュータをx64にしてたらエラーがでてx86にすると正常に通りました><

ちなみに上記のコードの後に読み込みと同時に1フレーム目を表示されようと
MediaSeeking->SetPosition  ←上のコードには書いてないですが今はQueryInterfaceしてます
MediaControl->StopWhenReady();
VideoWindow->Visible( OATRUE );
を入れたのですが、何故か1回目の読み込み時には表示されず
2回目以降に表示されるのですが、何が原因ですか?

223:デフォルトの名無しさん
09/01/15 22:57:20
C++で作ったフィルタをC#で使いたいんですが
作ったフィルタをregsvr32で登録しないで使う方法ってありますか?
登録するのは(ユーザーにとって)面倒だし
クラスの型がIBaseFilterにしか出来ないので
アプリケーション側からデータを渡したり出来ません。

224:デフォルトの名無しさん
09/01/15 23:06:15
その程度の事もわからないお前には無理だ。
C#のCOMのラッピングのメカニズムも理解できていないんだろ?

225:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/01/15 23:39:31
もはや時代はMediaFoundation

227:デフォルトの名無しさん
09/01/15 23:52:39
>>225
エラーコードは何ぞ?

試してないから外してるかもしれないけど、
pin_DefaultDSDeviceToをReleaseしてないから、ってなオチはない?

228:デフォルトの名無しさん
09/01/16 00:01:29
hr = pin_DefaultDSDeviceTo->Disconnect();
hr = pin_DefaultDirectSoundDevice->Disconnect();

229:デフォルトの名無しさん
09/01/16 00:43:07
エラーなくなりました。
フィルターを削除する時繋いであったピンを解除。
繋ぎ換えるのにも解除後接続ですね。覚えました
意外と融通きかないんですね・・・
ありがとうございました。

230:デフォルトの名無しさん
09/01/16 03:43:18
wmvが登場したとき wmvのコンテナに対応したソースフィルタを
書けと言われたときはくらくらと眩暈がした。

231:デフォルトの名無しさん
09/01/16 12:36:29
ふうん

232:デフォルトの名無しさん
09/01/16 13:31:35
1フレーム毎にイベントを取りたいのですが
イベント通知コードは何になるんですか?

233:221
09/01/16 15:57:23
>>222で最初のフレームが表示sれないって話なんですが
どうやら一瞬表示してるみたいで
VideoWindow->Visible( OATRUE );の下にSleep( 1000 );と入れると
1秒間最は初のフレームを表示して、1秒後に消えてしまいます。
そして2回目に>>221を走らせた時はずっと最初のフレームを表示した状態になります
何が原因でしょうか・・・

234:221
09/01/16 16:11:44
わかりました。
どうやらStatic Textに描画されてるのがまずかったみたいです。
Picture Controlにしたら消えなくなりますた。。。
なにこれ・・・

235:デフォルトの名無しさん
09/01/16 17:00:57
Windowsの描画の基本的な所を理解していないのが問題

236:デフォルトの名無しさん
09/01/16 17:10:21
>>235が基本を教えてくれるそうです。
では、どうぞw

237:デフォルトの名無しさん
09/01/17 01:24:29
他人が理解できる説明の仕方を意識しよう。あと、日本語を学べ。

238:デフォルトの名無しさん
09/01/19 09:02:44
ではまず国語辞典を勉強したらよろしいでしょうか?わかりません><

239:デフォルトの名無しさん
09/01/19 16:28:00
単語を覚えるだけでは言語を会得できないな。
日本語でも英語でもプログラミング言語でも。

240:デフォルトの名無しさん
09/01/19 17:49:44
GetConnectedMediaTypeでVFW_E_NOT_CONNECTEDが返って来るのですが原因は何でしょうか?
その前にやってるSetMediaTypeはちゃんとS_OKが返ってきてます。

241:デフォルトの名無しさん
09/01/19 18:22:51
VFW_E_NOT_CONNECTED だから
繋げろ!

242:デフォルトの名無しさん
09/01/19 18:30:15
>>241
言い忘れてましたが、VFW_E_NOT_CONNECTEDが出るのはGetConnectedMediaTypeだけで
他は普通にOKなので動画の再生はできています。


243:デフォルトの名無しさん
09/01/19 18:51:39
再生にサンプルグラバは関与してますか?
そうでなければ別にサンプルグラバが繋がってなくても再生に支障はありませんよ。

少々面倒でもROTを登録して外部からフィルタグラフを覗けるようにしておくと
デバッグが便利ですよ。

244:243
09/01/19 18:52:57
× ROTを登録
○ ROTに登録

245:デフォルトの名無しさん
09/01/19 19:03:42
>>243-244
やりたい事はと言うと、再生して指定フレームの画像をbmpとして保存したかったのです。
その為にサンプルグラバでAddFilter後にビデオヘッダを取得したりと・・・
とりあえずGraphEditでみてみようとおもいます・・・

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



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

247:デフォルトの名無しさん
09/01/20 00:41:20
つSetPositions

とはいえ、TIME_MEDIA_TIMEしか使えないストリームだと
ちょっと難しいけど。

248:デフォルトの名無しさん
09/01/21 22:49:54
SetPositionsって時間指定じゃん

249:デフォルトの名無しさん
09/01/21 23:40:38
TIME_FORMAT_FRAMEを指定してから使うよろし。
>>247でも書いてるけど、すべてのストリームでTIME_FORMAT_FRAMEが使えるとは限らない。

本格的にやるならDESを使うんですかね。
自分はやったことないので分からないですが。

250:デフォルトの名無しさん
09/01/22 15:56:17
コーデックの関係でSampleGrabberでの画像抽出ができずBasicVideoを使っているのですが
BasicVideoのGetCurrentImageで画像を取ると3秒もかかってしまうのですが
これをもっと早く取る方法ってありますか?

251:デフォルトの名無しさん
09/01/22 16:27:45
ムリポ

「コーデックの関係でSampleGrabberでの画像抽出ができず」辺りを
もう少し詳しく話した方が、いい話が聞けるかもよ?

252:デフォルトの名無しさん
09/01/22 16:56:00
>>251
そうですね。失礼しました。
カノープス社のコードックであれしてるaviファイルから静止画を取りたいのですが
これが何故かSampleGrabber->GetConnectedMediaTypeでエラーになるんです。
ちなみにほかのaviファイルでは正常に静止画が取得できています。
それで試しにBasicVideoで静止画と取ってみたら取れたのですがこれが遅くて・・・

253:デフォルトの名無しさん
09/01/22 17:57:02
小出しはやめてね

254:デフォルトの名無しさん
09/01/22 18:04:39
カノープスのコーデックといってもHQとかMJPGとかいろいろある

255:デフォルトの名無しさん
09/01/22 18:11:38
HQです。
今色々試してたんですが、SetMediaTypeするときの
サブタイプをMEDIASUBTYPE_RGB32にすると
GetConnectedMediaTypeでエラーが出ずに通ったのですが・・・
これすると、映像がさかさまになってる・・・

256:デフォルトの名無しさん
09/01/22 21:17:22
>>255 さかさまってビットマップか?

257:デフォルトの名無しさん
09/01/22 21:44:12
---------------------------------------------------------------------------
可能な限り速くコマ送りするのってどうするんですか?
IVideoFrameStepを使うと1倍速以上にはならないし、逆方向には進めません。
独自レンダラでレンダリングした画像を
加工して1コマずつ連番BMP出力したいだけなんですが。
(将来的にはDirectShowを使った出力も実装したいが、取りあえずBMPで)

>>255
memcpyを使って画像を自力で反転するしかないのでは。
(画像の横幅*4byteのサイズでコピーを繰り返す)
4byteなのはMEDIASUBTYPE_RGB32で32bitの画像と指定したからです。
もしRGB24なら3byteです。

258:デフォルトの名無しさん
09/01/23 00:52:55
>>255
BITMAPINFOHEADERか何かで上下反転してるかどうかの判定は
可能じゃなかったかな?

>>257
SampleGrabberを使ってた時の経験だけど、SetSyncSource(NULL)では
うまくいかなくて、SetRateで適当に100倍くらいを設定して全力取得したり
したことはあります。ただ、コーデックによってはうまくいかないかも。

259:デフォルトの名無しさん
09/01/23 09:47:42
MIDIをWAVEに変換する方法はあるんでしょうか?
再生される以上どこかで電圧値に置き換わってると思うんですが、サウンドボードで変換されてるんですか?
MIDIデフォルトOUTを置き換えても不可能でしょうか?WAVE関連のものに置き換えできませんでした

260:デフォルトの名無しさん
09/01/23 10:15:08
>>256
いえRGB32にすると映像の方がさかさまになるんですよ。
RGB24にすると映像は正常なのですがGetConnectedMediaTypeでエラーになりまふ
>>258
あ、そうなんですか?
ちょっとヘルプみてみます。

261:デフォルトの名無しさん
09/01/23 10:32:57
>>260
取得できたAM_MEDIA_TYPEからBITMAPINFOHEADERを引っ張り出して
biHeightの正負を見てみそって。

一応ココ(↓)見とき。
URLリンク(msdn.microsoft.com)
URLリンク(msdn.microsoft.com)
URLリンク(msdn.microsoft.com)

フォーマットによって成功したりしなかったりはColor Space Converterが
途中に入るかどうかによるのかもしれん。

262:デフォルトの名無しさん
09/01/23 10:38:29
>>261
ありがとうございます。
しかしbiHeightが負で判別できた場合はどうやって映像を正常に表示できるんでしょうかこれ。


263:デフォルトの名無しさん
09/01/23 10:56:49
ん?
レンダリング結果も上下反転してるの?
BMPに保存したときだけじゃなくて?

264:デフォルトの名無しさん
09/01/23 11:02:18
BMPファイルのヘッダの高さもそのままマイナスにすれば普通は問題ない
まれに対応していないソフトもある

265:デフォルトの名無しさん
09/01/23 11:32:50
>>263-264
静止画は正常で動画の方が逆になるんですよね・・・
でもRGB24にすると動画は正常になるけど
GetConnectedMediaTypeでエラーになって・・・

266:デフォルトの名無しさん
09/01/23 12:47:44
それがDirectShowの仕様です

267:デフォルトの名無しさん
09/01/23 18:26:01
全フレームの画像を取得したいのですが
SetPositionsでフレームを移動して取ると時間がかかるので
もっと効率的な方法はどうしたらいいですか?

268:デフォルトの名無しさん
09/01/23 20:41:02
>>259
WavDestとFileWriterでよかばってん
>>267
ストリーム流しながらのサンプルグラバでよかばってん

269:デフォルトの名無しさん
09/01/23 20:52:30
ばってん何?

270:257
09/01/23 22:24:25
>>258
SetRateは(貴方が書いているように)コーデックによっては使えないので・・
SetSyncSource(NULL)しても再生は別スレッドで行われているのに
どうやって
レンダリング→BMP出力→レンダリング→BMP出力→...
のように同期させられるんでしょうか。

271:デフォルトの名無しさん
09/01/23 22:27:17
基本的な事だけどpushとpullモデル理解しているか?

272:デフォルトの名無しさん
09/01/23 22:37:32
>>257
サンプルグラバとNullRenderer使えよ

273:257
09/01/23 23:17:54
>>271
push??pull?
URLリンク(unkar.jp)
色々調べてみたら、これがヒットしました。
・・・ソースフィルタを作って加工したデータをこのフィルタに送るんでしょうか

274:デフォルトの名無しさん
09/01/23 23:20:49
MSのドキュメントも読んでいないなんて死んだほうがいい

275:デフォルトの名無しさん
09/01/24 11:38:54
>>268
ダメです、MIDIParsaとWevDestがつながりません。
pMediaType->SetType(&MEDIATYPE_Midi);
の変更もしてみたんですがダメです。グラフエディタでつながらないと出ます
お願いします

276:デフォルトの名無しさん
09/01/24 13:47:34
>>275
情報少なすぎてわかるわけがないよ。エスパーじゃないし。
わかるように書いてよ。

277:デフォルトの名無しさん
09/01/24 15:04:31
MIDIのトランスフォームフィルタを自作するか見つけてくる必要がある。

278:デフォルトの名無しさん
09/01/25 17:51:50
まったく作れそうな気がしません
音源はどこから引っ張ってくればいいんですか?

279:267
09/01/26 11:45:44
>>268
再生しながらはどのようにゲットすればいいですか?
イベントですか?
でもイベントでは1フレームずつ入ってこなかったしなあ


280:デフォルトの名無しさん
09/01/26 18:15:47
コールバックですよコールバック
このスレでも何度か話題に出てるんで探してみれ

281:デフォルトの名無しさん
09/01/29 21:59:01
COutputQueueを使ってコマ送りって可能?

282:デフォルトの名無しさん
09/01/30 13:26:27
サンプルグラバのGetCurrentBufferで静止画を取得する時に
動画サイズのまんまではなくて縮小して取得したい時はどうしたらいいですか?

283:デフォルトの名無しさん
09/01/31 15:50:00
自分で縮小でも拡大でも好きにすればいいんじゃない?

284:デフォルトの名無しさん
09/02/02 03:20:48
複数の音楽ファイル(mp3とWMA)の一部ずつ(サビの部分)を繋いで、一つのWAVにしたいのですが、
どう作ればいいのか判りません。
最初の曲は、サビまでシークしてしてから、WAVEファイルにはできているようです。
ですが、2曲目を処理しようとすると、グラフを停止しないと、接続できないという現状です。
例えば、2つの曲をフェードインアウトで繋げる処理はどう書けばいいのでしょうか?
なにかヒントやサンプルなど教えてもらえるとありがたいです。

285:デフォルトの名無しさん
09/02/02 04:29:59
高校の物理をちゃんと勉強していれば簡単な事なんだけどね

286:デフォルトの名無しさん
09/02/02 10:56:55
DESじゃないのん?

287:デフォルトの名無しさん
09/02/03 01:16:38
>>286
DESってDirectshow編集サービスのことですよね。
ちょっと調べてみます。 ありがとうございました。

288:デフォルトの名無しさん
09/02/05 14:32:39
質問です。
MP4ファイルの頭に5Kほどのデータを付加したファイルを再生する
フィルターをASyncサンプルに手を加えて作りました。
GraphEditではファイルを選択して、VideoRendererとPIN接続すると、
MP4Splitterとffdshow codecが間に入り再生できます。
このファイルをGraphEditにD&Dするとはじかれます。

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




289:デフォルトの名無しさん
09/02/05 15:14:59
デバッグすりゃ原因がわかるだろ

290:デフォルトの名無しさん
09/02/05 15:17:29
>>289
知らないならレスしないで下さい。ウザいだけです。。

291:デフォルトの名無しさん
09/02/05 16:01:11
俺もデバッグすりゃ原因が分かると思う。

292:デフォルトの名無しさん
09/02/05 16:50:34
IGraphBuilder::RenderFile() を使っちゃってる、に1票

・・・じゃないよね。
自作フィルタはちゃんと自前でCoCreateInstanceしてる?

293:デフォルトの名無しさん
09/02/05 16:51:15
あ、メリット値を適切に設定してるなら別ね。

294:デフォルトの名無しさん
09/02/05 17:14:08
GraphBuilderに自作SourceFilterとVideoRendarerだけ追加したら
後はRendaerFileでいいんじゃないの?
そうすりゃMP4Splitterとffdshow codecが勝手に間に入るだろ

295:デフォルトの名無しさん
09/02/05 23:36:50
LONGLONG tmp = (LONGLONG)(frame * Renderer->getATPF());
pMediaSeeking->SetPositions(&tmp,AM_SEEKING_AbsolutePositioning,
NULL,AM_SEEKING_NoPositioning);

AverageTimePerFrameを使ってシークするのって駄目なんですか?
たまに思った位置にシークできないファイルがあります。

296:デフォルトの名無しさん
09/02/07 01:54:57
ISampleGrabberについての質問です。
DirectShowでmp3を再生中にISampleGrabberのGetCurrentBufferを行うと、
再生中の場所の波形データが取得できると思うのですが、
毎回GetCurrentBufferを行っても、1秒間に約3回ほどしか取得するデータに変化がありません。
リアルタイムに現在再生中の場所の波形データを取得するにはどうしたらよいのでしょうか。

297:デフォルトの名無しさん
09/02/07 15:37:21
URLリンク(oshiete1.goo.ne.jp)
URLリンク(okwave.jp)


298:デフォルトの名無しさん
09/02/08 10:12:29
>>297
ありがとうございます。
解決しました。

299:デフォルトの名無しさん
09/02/08 11:17:10
質問したなら、どう解決したのか書いて欲しい。
それにしてもマルチポストなんて今時珍しいね。
回答が付いているところにも驚いた。

300:デフォルトの名無しさん
09/02/08 13:21:49
初歩的な質問ですが
キャプチャーボードにチューナ・S端子・コンポジットがあるのですが
その切り替えはDirectShowでできるのでしょうか?
カメラで入力した映像を解析ソフトを作ってみたのですがWebカメラでは物足りなくて
手元にあったボードを使ってみたのですが初期でチューナーになってしまうので
お願いします

301:デフォルトの名無しさん
09/02/08 16:32:30
映像解析ソフトを作るとはハイレベルだ

302:デフォルトの名無しさん
09/02/08 17:28:15
>>300
つ Crossbar

303:300
09/02/08 17:55:56
できるんですね。ありがとうございます

304:デフォルトの名無しさん
09/02/09 09:54:17
2つの動画を同時再生したいんですが、2回同じ表示手続きをしないとダメですか?

305:デフォルトの名無しさん
09/02/09 10:42:16
グラフ2つ作れば良いだけの話では?

306:デフォルトの名無しさん
09/02/09 11:58:32
>>305
あ、すみません。
そこの所をもうちょっと教えてください。
どこか参考になるサイトとかもあったらお願いしまふ

307:デフォルトの名無しさん
09/02/09 12:54:37
>>306
1つのソースでレンダラ2つ出したいならスプリッタを使う。
別々のソースを表示したいならグラフビルダ2つ用意する。

308:デフォルトの名無しさん
09/02/09 13:45:22
>>307
別の動画を再生したいからグラフを2つ作るんですね。
それで再生とかする場合はMediaControlも2つですよね?


309:デフォルトの名無しさん
09/02/09 15:24:10
質問です。

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

何か特殊なフィルタがインストールされているのではないかと思うのですが、
客先環境のため、簡単にチェックできません。
とりあえず不具合回避策は準備したので緊急度は低いのですが、
このようなことが起こるケースについて何かご存知の方がいらっしゃいましたら、
ご教示ください。

310:デフォルトの名無しさん
09/02/09 16:11:46
>>308 いえす


311:デフォルトの名無しさん
09/02/09 16:16:20
>>310
ですよね。
と、言う事はやはり再生等に必要なアレは2つずつ用意しないといけないんですね。
ちなみに、同じコールバック関数を呼ぶようにした場合ってどっちの動画か見分ける術ってありますか?

312:デフォルトの名無しさん
09/02/09 16:24:04
>>311
アレじゃわかんない。
コールバックって何よ。ISampleGrabberCB::SampleCBだったら
パラメータのIMediaSample で区別ができるかもしれない。
が、流す動画による。

313:デフォルトの名無しさん
09/02/09 16:27:03
>>312
BufferCBを使ってるんです><
ちなみにアレとは
MediaControl、MediaEventEx、SampleGrabber、VideoWindowです。。。

314:デフォルトの名無しさん
09/02/19 17:11:04
クズ共ちょっと教えてください。
XP64ビットOSでVC2009で32ビット用でコンパイルすると正常に動画再生ができるが
64ビット用でコンパイルすると音だけでて映像が表示されないんです。
お前達のようなゴミにはわからないかもしれませんが宜しくお願いします。


315:デフォルトの名無しさん
09/02/19 17:16:53
VC2009

316:デフォルトの名無しさん
09/02/19 17:26:03
コーデック

317:デフォルトの名無しさん
09/02/19 17:33:45
思ったとおり役に立たないクズしかいないですね

318:デフォルトの名無しさん
09/02/19 17:35:46
>>316

319:デフォルトの名無しさん
09/02/19 23:58:51
ここはエスパー板じゃないんで、314の期待するような能力者は居ません。

もうちょっとヒントが多ければ優秀な推理マニアが現れるかもね。

320:デフォルトの名無しさん
09/02/20 00:53:51
だからさ、64bitプロセスには64bit版コーデックが要るんだよ。

321:デフォルトの名無しさん
09/02/20 02:26:18
知ってるがおまえの程度がAA略


322:デフォルトの名無しさん
09/02/20 08:21:22
64ビットアプリにゃ64ビットDLL(この場合コーデック)が必要という常識も知らず
クズ呼ばわりってどんだけおめでたいんだ・・・。
コピペ厨房の俺でさえ知ってるわ。


323:デフォルトの名無しさん
09/02/20 09:56:16
>>322
その程度の知識しかないから役立たずのクズって言ってるの
だから知らないならレスするなって

324:デフォルトの名無しさん
09/02/20 10:14:37
64bit Windowsが普及しない原因を知ってれば、
容易に気が付くだろ。知識なんかほとんどいらね。
バカじゃねーの?

325:デフォルトの名無しさん
09/02/20 10:36:15
知らないからって必死になるなって

326:デフォルトの名無しさん
09/02/20 11:09:56
>>314
が必死になってるのか。

327:デフォルトの名無しさん
09/02/24 11:30:20
VideoWindow->put_OwnerにHBitmapを与えて再生した時に
ウィンドウフレーム無しの動画が画面上に表示されるのですが
これHBitmapだからそのまま変換して画像としてファイルに保存できますか?

328:デフォルトの名無しさん
09/02/24 12:05:30
ISampleGrabbberCBコールバックのBufferCBで受け取るDIBデータを
指定したサイズで受け取るにはどうしたらいいですか?

329:328
09/02/24 15:01:36
現状では動画のオリジナルサイズになっているのですが
これをVideoWindowで再生させてるウィンドウサイズと同じ大きさにしたいです

330:デフォルトの名無しさん
09/02/24 16:02:56
リサイズ機能なんてねーよw
普通はレンダーが勝手に表示サイズ合わせるだろ

331:328
09/02/24 16:08:50
そうですか。やっぱり無いですか・・・


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch