5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

DirectShowと戦うスレ Part 4

1 :デフォルトの名無しさん:2008/06/22(日) 18:38:21
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を使えるような気がするな。
誰か試してみない?

18 :15: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++コンパイラ使えばいいだろって気もするが。

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

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



21 :15: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 の例はいくつか見つかるんだけどね。
詳しい方、よろしくお願いします。

38 :37: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
>>47
http://homepage1.nifty.com/nekora/soft/howto/avi.html
張るのが遅かったな


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
コントロールを最前面に移動させるとかフォームじゃなくてパネルにして最背面にするとか

71 :69: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をビルドしてみたところ以下のエラーが出てビルドが通りません.
解決策はないのでしょうか?

79 :78: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 のフォルダから上記クラス名で検索をかけてみればすぐに見つかる


81 :79: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 返信をありがとうございました。


89 :79: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 で試してみよう


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

97 :95: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が先頭になるように、インクルードの優先順も見直してみるといいかもね。

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

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



100 :sage:2008/11/21(金) 15:23:39
DirectShowでデコードした動画をOpenGLのテクスチャに流し込むプログラムを書いています。
CBaseVideoRendererを派生させてOpenGLのテクスチャを更新する自作フィルタを作成し、
それは動作しているのですがパフォーマンスに不満があります。
OpenGLでのテクスチャのアップデートにはPBOを使用しているのですが、この場合アップデー
トを行うバッファはOpenGL側から指示されます。
一方、CBaseVideoRendererのDoRenderSample()メソッドでは、デコードされたデータへの
ポインタは前段のデコーダーから与えられます。
そのため、DoRenderSample(IMediaSample * pSample)内でpSample->GetPointer()で得られた
バッファからPBOのバッファへのmemcopy()を行う必要があり、結構なオーバーヘッドとなっ
ています。
OpenGLから与えられたバッファアドレスを前段のデコーダの書き出しバッファとして指定で
きれば、この無意味な転送はなくなると思うのですが、こういった指定をする方法はないで
しょうか?
IMediaSampleではPutPointer()は使えなくなっているようですが、なにかうまくデコーダの
バッファをレンダラ側から扱う方法は無いものでしょうか?



101 :デフォルトの名無しさん: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のことじゃないか?

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

108 :106: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

110 :104: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
>>111
今はDirectShowもGraphEditもWindows SDKに入ってる。
http://www.microsoft.com/downloads/details.aspx?FamilyID=e6e1c3df-a74f-4207-8586-711ebe331cdc

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に対する知識があまりないため、もっと簡単にやる方法があるんじゃないかとか、
この方法だと(予期せぬ)問題が生じるんじゃないかとか思っているのですが、
そのあたりのご意見いただければ幸いです。

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


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

118 :106: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
デコーダのハードウェアアクセラレータの設定を切ると大丈夫、
とかないかな。

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

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

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

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

122 :104: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
>>130
英語でよければ
つ WindowsSDK

日本語が必要なら
つ ttp://www.microsoft.com/downloads/info.aspx?na=47&p=1&SrcDisplayLang=ja&SrcCategoryId=&SrcFamilyId=4b9b1752-6f6c-440e-816c-35d247570ae4&u=details.aspx%3ffamilyid%3d1419557B-95CB-475E-9ED1-6817B3B9CB0A%26displaylang%3dja

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

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

134 :130:2008/12/14(日) 21:26:54
>>131
ありがとうございます。Windows SDKのWeb Installで
Documantation→Win32 and COM
を選択すればOKですね?

すいません、また質問です。
Windows Headers and Libraries→HeaderFilesとx86 Libraries
を選択しておけば問題ないと思ったんですが、IA64やx64のLibrariesや
.NET Development Toolsも入れろといってきましたが無視して大丈夫ですか?

これを入れる前に、前のバージョンはプログラムの追加と削除から削除したはずなのに
C:\Program Files\Microsoft SDKs\Windows\V6.0
C:\Program Files\Microsoft SDKs\Windows\V6.0A
が残っていたので手動削除しましたが、これも間違ったことをしたのではないかと不安です。

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

136 :130: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くらいすぐ見つかるじゃろ。
というか、テンプレの関連サイトくらいは全部のぞいとくべし。

139 :130: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がないから無理

146 :130: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に変換してシークする。
かな。

149 :147: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でもなんとかなるはず。

157 :152: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のサンプルの改造じゃだめなの?

159 :152: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でキャプチャすることはできますでしょうか?

164 :152:2008/12/27(土) 22:12:10
>>160
やってみた

strmbase.lib(dllsetup.obj) : error LNK2001: 外部シンボル ""class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A)" は未解決です。
strmbase.lib(dllentry.obj) : error LNK2001: 外部シンボル ""class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A)" は未解決です。
strmbase.lib(dllsetup.obj) : error LNK2001: 外部シンボル ""int g_cTemplates" (?g_cTemplates@@3HA)" は未解決です。
strmbase.lib(dllentry.obj) : error LNK2001: 外部シンボル ""int g_cTemplates" (?g_cTemplates@@3HA)" は未解決です。
C:\Documents and Settings\ \My Documents\Visual Studio 2008\Projects\FilterDLL\Release\FilterDLL.dll : fatal error LNK1120: 外部参照 2 が未解決です。

必要そうなコードのをSampVid.cppからコピーしたけどビルドできん・・

165 :デフォルトの名無しさん:2009/01/02(金) 21:25:16
1フレーム目を表示させてすぐ一時停止状態にするのって
どうやるの?

166 :デフォルトの名無しさん: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を入れてもいいでしょう。

172 :169: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
ありがとうございます。
参考にさせて頂きます〜

181 :169: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です。
 解決法について、ご教示のほど願います。

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

ttp://www.shader.jp/xoops/html/masafumi/directx9/DShow/dshow001.htm
を参考にレンダラー作ったんだけど
RunしてすぐにPauseすると一回もレンダリングが行われないで
ポーズしてしまう・・・

185 :169: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はどうなのか知りたかった

198 :184: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
つか、全部書いてあるだろ。ドキュメントくらい読め。

201 :184: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

204 :169: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

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

207 :169: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回行ってみたのですが
根本的に間違っていたりしたらすみません・・・


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

212 :デフォルトの名無しさん:2009/01/13(火) 19:57:05
http://okwave.jp/qa4625143.html

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


214 :169: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にはなりませんでした。
何が原因でしょうか?

222 :221: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フレーム毎にイベントを取りたいのですが
イベント通知コードは何になるんですか?

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

234 :221: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を登録して外部からフィルタグラフを覗けるようにしておくと
デバッグが便利ですよ。

244 :243: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
ばってん何?

270 :257: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使えよ

273 :257: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
まったく作れそうな気がしません
音源はどこから引っ張ってくればいいんですか?

279 :267: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
http://oshiete1.goo.ne.jp/qa4695764.html
http://okwave.jp/qa4600803.html


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

303 :300: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
>>316

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データを
指定したサイズで受け取るにはどうしたらいいですか?

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

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

331 :328: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でできた気がするデス。

334 :328: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

345 :343: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 ではリストにすら
表示されませんでした。
指定すべきモニカの文字列フォーマットが変わってたりするのでしょうか・・・。

346 :343: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では現象は出ませんでした。
ほんとすんませんでした。

391 :388: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というサンプルは画面キャプチャができるけど音声がならなかったのでその辺のソースを
上記の記述のように貼り付て偶然、音がなるようになりましたが理屈は微塵もわかりません。

434 :432: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のドキュメントと相互運用マーシャリングのドキュメントを一通り読んだほうがいいよ。

436 :432: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
質問と関係ないレスならしないでほしい。ウザ杉

446 :443: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
再生を別スレッドに別けるとか

456 :454: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で繋いで動くのは確認しています。


468 :467続き: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);        // ピン接続

(続く)

469 :467続き: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
これの互換フィルタ作ればいい

488 :486: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して欠落無いか確認した?

493 :490: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で自分のやりたいことができてますか?

499 :497: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あたりを見るだけで事足りる
それでもわからないことがあったらまた聞きにきな

502 :497: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っていろんなバージョンがあったと思うけど互換性は大丈夫なのかな

504 :497: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

506 :497:2009/07/19(日) 22:19:55
>>505 ありがとうございます。
考えていたのはaviファイルをリサイズ、音量操作などをしてから再圧縮保存したいと考えていたので
多機能のffdshowをプログラム上で使えれば楽かなっと思っていました。


507 :デフォルトの名無しさん:2009/07/19(日) 22:37:00
編集フィルタ標準であるやん

508 :497: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してアドレスがたまたま有効なために不正にコードが実行されてしまったケースを想定。
チェックが甘い実装だとこのケースで落ちそうな気がする。

512 :510: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とかで参照を自動化してやると間違いが起きないぜって話

514 :510: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の頃は通ってたな。

520 :510: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で作れるか試せばいいだろ

525 :510: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を使う必要はない

532 :529:2009/08/10(月) 12:26:12
>>530
>>531
ありがとうございます!
安心しました。

533 :528: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
ソース読めよ

543 :541: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だろ

説明ではアップストリームを基準にトランスフォームフィルタの説明してるんじゃないかな

546 :541: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

550 :547: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
ビデオオーバーレイを使ってるときはそうなるかもね。


555 :547: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とかになってるはず。
>その場合、それと同様のことを変換フィルタに組み込むには、
変換時にアライン分飛ばせばいい。

560 :558: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
ttp://img.f.hatena.ne.jp/images/fotolife/T/TamTam/20091004/20091004201621.jpg

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サイズの動画を
コマ落ちなしで再生できるんですか?

606 :sage: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

608 :606: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の実装がおかしんじゃね?

615 :612: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
フォーマットの部分も有効なデータがないと駄目な気がする。
メジャーサブの値は、モジュールをロードせずにフィルタ構築のヒントに使われるもの。
列挙で返すメディアタイプはきっちり値を設定していないと、「メディアがないぞゴルァ」エラーが出たような。
ビデオでそんな経験をしたことがある。

617 :612:2010/02/01(月) 18:14:22
レスありがとうございます。
>>616
書き忘れていましたが、フォーマットに関してもWAVEFORMATEXの型で周波数等すべての
データを設定しています。
GraphEdit上で自作フィルタの出力ピンのプロパティを見ると、
ASF Readerでwmaファイルを指定した場合の出力ピンとと同様になっています。

WMAudio Decoder V8との接続ではメディアタイプ以外のネゴシエイト等も行っているのでしょうか?

618 :デフォルトの名無しさん:2010/02/01(月) 21:39:51
どんなインターフェイスが問い合わせされているかも調べてみるといいよ。
必要なインターフェイスがないと繋がらないケースもある。

619 :612:2010/02/01(月) 23:47:39
レスありがとうございます。
>>618
なるほど、インターフェイスに関しては考えていませんでした。調査してみます。
調べ方としてはCUnknown::NonDelegatingQueryInterfaceをオーバーライドして、
引数や返り値を見る方法を考えているのですが、それでいいのでしょうか?
また、もっと簡単な方法等ありましたらご教授お願いします。

620 :612:2010/02/02(火) 22:54:42
618さんのアドバイスに基づき、WMAudio Decoder V8との接続の際に問い合せられるインターフェイスを調査してみました。
問い合せられて失敗していたのは
IAMOpenProgress
IAMDeviceRemoval
IAMFilterMiscFlags の3つでした。
特に問題になっているのは3つ目のIAMFilterMiscFlagsのような気がするので
インターフェイスを実装して接続を試してみます。

621 :612: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
>>639
ttp://www1.axfc.net/uploader/File/so/39920.zip

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
開発しているアプリケーションのグラフへリモートグラフで繋いで見てるの?

657 :634: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レンダラもどき作ればいいかも
そうすれば接続を限定してインテリジェント出来ると思う

661 :660: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でも音も入れられる。

>一体どうすれば良いのでしょう?
きちんとドキュメントとソースコード読め。

678 :676: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以前の、初歩的な話なんだよな〜

681 :676:2010/04/22(木) 22:20:05
>>679
お返事ありがとうございます。
ballサンプルを使っているのは、検索した時にBouncingBallのFillBuffer()を
改造すべし、とのちょっとした記述があったため、試しに使ってみました。
後、開発環境が古いっていうのもありますが。
Pushsourceのサンプルを見るためにWindowsSDKをインストール中です。

>>680
お返事ありがとうございます。
何というか、結局DirectShowはデフォルトでメモリ上の画像データを
AVIに吐き出す機能は備えていないということなんですね?
VFWだと逆にストリームなどの概念がないため、メモリ上の画像データを
1コマずつAVIとして出力するので簡単なのですけど。
なぜDirectShowにはそのような機能がないのか不思議に思います。


682 :676: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
ドキュメントとソースコード読んだのになぜか実装されません
読むとソースコードできるんじゃないんですか?

685 :676: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つに出力を分配するフィルタって、標準でありましたっけ?

692 :686: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すればいい

706 :704: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

712 :704: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の方法かな

227 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)