DirectShowと戦うスレ Part 4
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2008/06/22(日) 18:38:21メソッドのデッドロックとか、わけわからん現象多くないすか。
このスレに怒りやテクをぶつけましょう。
関連スレ
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/
0002デフォルトの名無しさん
2008/06/22(日) 18:38:51MSDN 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
0003デフォルトの名無しさん
2008/06/24(火) 20:40:350004デフォルトの名無しさん
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 です
ご教授の程、よろしくお願いします。
0005デフォルトの名無しさん
2008/06/29(日) 21:24:110006デフォルトの名無しさん
2008/07/02(水) 22:26:47ってか、自分でも立てようかと思ったけど、
すぐ落ちるとイヤなので様子見してた・・・
>>4
とりあえずどのフィルタを使ってどんな症状なのか
説明してくれないと困るぞ
ざっと試してみたけどVideo Extraction Filterを使おうとしてるのかな?
ソース見てないからよく分からないけど、確かにちょっとおかしい。
ffdshowで出力フォーマットをいろいろ変えてみたが、
入力可能な正しいフォーマットはなんじゃろな。
暇があったら後でソース見てみる
0007デフォルトの名無しさん
2008/07/02(水) 22:53:120008デフォルトの名無しさん
2008/07/05(土) 13:56:150009デフォルトの名無しさん
2008/07/17(木) 21:43:580010デフォルトの名無しさん
2008/07/26(土) 18:42:310011デフォルトの名無しさん
2008/07/27(日) 04:16:120012デフォルトの名無しさん
2008/07/27(日) 04:22:150013デフォルトの名無しさん
2008/07/27(日) 11:30:330014デフォルトの名無しさん
2008/07/29(火) 19:32:10まずフィルタグラフをどう構築すればいいのかと思ってGraphEditで試しているのですが
WM ASF WriterのAUDIOピンを繋がないとエラーになってしまいます。
無音声のwmvファイルを作成する場合AUDIOピンに何をつっこめばいいのでしょうか?
0015デフォルトの名無しさん
2008/07/31(木) 23:57:26DirectXに関しては以下のページの方法で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# コンパイラや各種ツールを利用できます』
とあった為,これをインストールしたものの,エラーの数は減りませんでした.
どなたかわかる方いらっしゃいましたら,御教授宜しくお願いします.
0016デフォルトの名無しさん
2008/08/01(金) 03:55:12確かにエラーになるね。
適当なAudio Capture Sourceを突っ込めば無音のwmvを作ることはできるけど、
ビデオ終端で自動終了できない・・・。
>>15
SDLにDirectShowのラッパーはないんじゃない?
0017デフォルトの名無しさん
2008/08/01(金) 03:58:31誰か試してみない?
001815
2008/08/01(金) 18:26:19>>17さん
レスポンスありがとうございます.
http://support.microsoft.com/kb/436361/ja
頂いたヒントを頼りに,このページを見つけました.
ありがとうございました.
0019デフォルトの名無しさん
2008/08/01(金) 22:15:35002115
2008/08/01(金) 22:49:04↓
.NET Framework 2.0 SDK
↓
Directshow.NET 2.0(ラッパー)
↓
Directshow
17さんの言うとおり,
上記の道が考えられますが…,難しいですね.
もう少し頑張ってみます.
0022デフォルトの名無しさん
2008/08/01(金) 23:35:210023デフォルトの名無しさん
2008/08/03(日) 14:23:16レスどうもです。
プログラム組んでみようと思いますが、
GraphEditだからだめだってことはないんでしょうね。
もう少し悩んでみます。
0024デフォルトの名無しさん
2008/08/04(月) 01:24:00yahooチャットのビデオに自作のDirectshowフィルタを挟んで
効果を付けてみたいのですが可能ですか?
例えば文字スーパーを流すようにしてみるとかしてみたいのですが・・・
yahooチャットのビデオがどのようなフィルタ構成になっているかわからず
出力メディアタイプとかわからないです。
接続に関してはインテリジェント接続になっていてくれさえすればメリット値を変更で
なんとかできないかなって思っています
0025デフォルトの名無しさん
2008/08/05(火) 08:54:08アスペクト比が4:3と16:9のものしかまともに再生されないけど、
CIFみたいな中途半端なサイズのせいなの?
それとも適切なパラメータを出力ピンに設定していないから?
誰かわかりませんか。形式はyv12です。
0026デフォルトの名無しさん
2008/08/05(火) 13:44:370027デフォルトの名無しさん
2008/08/05(火) 23:10:13レンダラ側で確保されるバッファのサイズが変わってくるんだね。
ffdshowはどうやってそこらへんを上手く処理してるんだろう…
0028デフォルトの名無しさん
2008/08/05(火) 23:26:510029デフォルトの名無しさん
2008/08/05(火) 23:50:25>>24答えてくれたら放出するよ
0030デフォルトの名無しさん
2008/08/06(水) 08:51:59あれ。そうなんですか…
GetMediaTypeで伝えるだけじゃだめなのかな。
Transformが呼ばれる時点で既にpOutには変更されたサイズが入ってしまってるんだけど…
もしかして再接続を適切に処理してないからでしょうか。
0031デフォルトの名無しさん
2008/08/06(水) 23:34:37などと適当に書いてみる。
↓やりかた
ttp://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/directshow.html#addtorot
0032デフォルトの名無しさん
2008/08/07(木) 00:10:510033デフォルトの名無しさん
2008/08/07(木) 14:52:12あれは動画と言うより静止画で、鯖から要求されたときに
jpc(Jpeg2k)形式の1フレームの画像ファイルを送ってるだけなので
やろうとしてることを実現したければ、webcam画像取り込み、加工、
エンコード、パケット送信まで丸ごと作っちゃうか
ビデオ入力デバイスとしてwebcamの画像を横取り、加工する何かを
作るしかないと思う。←たぶんやりたいのはこっち?
jpcは写真とかは得意だけど文字とかはボケボケになった気がする。
丸ごと作っちゃうパターンだと圧縮率変えれば文字も綺麗に見えるけど、
受信側のデコードで負荷がかかりすぎて
PCがフリーズする視聴者続出させた記憶があるw
0034デフォルトの名無しさん
2008/08/07(木) 20:39:02そうですか。
単純にキャプチャフィルタと画像送信フィルタ構成で出来ているとばっかり
思っていました。
画像を横取りできたとしてもエンコード、パケット送信までは作れないから
諦めかな?
んで、フィルタの放出はした方がいいかい?
0035デフォルトの名無しさん
2008/08/07(木) 21:07:020036デフォルトの名無しさん
2008/08/08(金) 21:10:57(´・ω・`)?
俺の脳内妹かわいいよ
0037デフォルトの名無しさん
2008/08/11(月) 13:27:03Video for windows の例はいくつか見つかるんだけどね。
詳しい方、よろしくお願いします。
003837
2008/08/11(月) 13:46:21業務で使うので、ツールではなくやり方が知りたい。
画像の抜き出しは見つけた。音声の抜き出し方がわからない。
以上、よろしくお願いします。
0039デフォルトの名無しさん
2008/08/11(月) 14:40:410040デフォルトの名無しさん
2008/08/11(月) 14:45:130041デフォルトの名無しさん
2008/08/11(月) 18:58:30そういうもんだ
0042デフォルトの名無しさん
2008/08/12(火) 00:30:530043デフォルトの名無しさん
2008/08/14(木) 11:43:500044デフォルトの名無しさん
2008/08/17(日) 14:26:53ログインしていない時に録画できるようにする事は可能なのでしょうか?
例えばプレビューは無しでもデスクトップがないとグラフを構築できないといったような制限はあるのでようか?
0045デフォルトの名無しさん
2008/08/17(日) 14:34:260046デフォルトの名無しさん
2008/08/18(月) 23:00:32YV12形式だとQCIFだけ横幅がおかしく表示されます…
0047デフォルトの名無しさん
2008/08/23(土) 12:37:30ムービーの動画をテクスチャに移して加工した上で表示させたいと思い、
ネット上のサンプルを読み漁ってとりあえず組んでみたのですが
以下の疑問点が発生しました。
どなたかわかる方が居ましたら、答えていただければありがたいです。
1. ムービーファイルの画像を「1枚ずつ」「任意のタイミングで」取得する方法はありますか?
現在のコードでは、DirectDrawに再生させておいて
描画時にテクスチャを取得して再生する、という構造になっています。
おそらく別のスレッドで再生させているのだとは思いますが
このシステムでは、負荷でメインスレッドのFPSが落ちた場合などに
当然ながら同期のズレが発生してしまいます。
(動画とメインループのフレームの比率が変化してしまうため)
アプリ側から任意のタイミングでフレームを進めることはできますでしょうか?
2. 実際に再生させるルーチンまでは作れたのですが
動画ファイルの読み込みに250msほど時間がかかってしまいます。
特にIGraphBuilderのRenderFileメソッドが非常に重く、
ここだけで200ms持って行かれてしまいます。
これはムービーファイルを再生する上で回避できない時間なのでしょうか?
ちなみに、ムービー形式はサンプルに沿ってwmvを使用しています。
DirectShowというと、マイナーでネット上のサンプルも少ないというイメージで
触っている人が少ないかもしれないかと思うのですが、わかる方が居ましたら
よろしくお願いいたします。
0048デフォルトの名無しさん
2008/08/23(土) 13:04:32手動でフィルタ接続が速いかも
0049デフォルトの名無しさん
2008/08/23(土) 13:25:09変換が二度手間になっているような認識でいいのでしょうか?
ありがとうございました。ちょっと色々とやってみます。
0050デフォルトの名無しさん
2008/08/28(木) 11:00:10http://homepage1.nifty.com/nekora/soft/howto/avi.html
張るのが遅かったな
0051デフォルトの名無しさん
2008/09/29(月) 18:50:07あるBDAチューナデバイスAがサポートするチューニング空間を列挙する方法が知りたいのですが、
何かいい方法はないでしょうか?
0052デフォルトの名無しさん
2008/09/29(月) 23:27:51COMは分かってるけど適当なAPIが見つからないのか
APIも分かってるけど挙動がおかしいのか、などなど
0053デフォルトの名無しさん
2008/09/30(火) 08:23:24COMはだいたいは大丈夫だと思います。
適当なAPIが見つかりません。
PNDIR_INPUTのAM_MEDIA_TYPEをみると、
majortype = KSDATAFORMAT_TYPE_BDA_ANTENNA
subtype = MEDIASUBTYPE_None
formattype = FORMAT_None
であって、接続可能なピンかどうか判断できませんでした。
ネットワークプロバイダの出力ピンをみても、同様でAM_MEDIA_TYPEだけでは
判断できないようですが、ほかの方法が思いつきません。
0054デフォルトの名無しさん
2008/09/30(火) 19:58:20テクスチャにレンダリング、DirectXで表示という
いわゆるムービーテクスチャー方式で再生しているのですが
Vistaのフルスクリーン時のみフリーズする現象にぶち当たってます
VistaウインドウモードやXPでは問題ないようなのですが・・・
DoRenderSample内のテクスチャのロックが
癌なような気がしないでもないですが対処法がわかりません
なにか解決方法はありますか?
0055デフォルトの名無しさん
2008/09/30(火) 20:04:130056デフォルトの名無しさん
2008/09/30(火) 20:09:22フルスクリーン時のデバッグができないのです
0057デフォルトの名無しさん
2008/10/01(水) 00:43:59つーか、お前の環境なんて知ったこっちゃない。マルチモニタでやるなりログ出力するなり好きにしろ。
最低限の道具も揃えられないようだと話にならない。
0058デフォルトの名無しさん
2008/10/02(木) 02:02:13ということをしたいのですが,どのようにしたらよいのでしょうか?
Direct Showの使い方もわからず,教えていただけないでしょうか?
0059デフォルトの名無しさん
2008/10/02(木) 02:12:40次にサンプルやドキュメントを読んで基本的な仕組みを理解してください。
0060デフォルトの名無しさん
2008/10/02(木) 03:05:24ありがとうございます,VC++でやるのが普通なのですか・・・
vb.netでやるのが仕事の条件だったもので結構探してみたんですがなかったのはそういことだったんですね.
ありがとうございます.
0061デフォルトの名無しさん
2008/10/02(木) 16:19:48.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++で。
0062デフォルトの名無しさん
2008/10/03(金) 00:00:160063デフォルトの名無しさん
2008/10/03(金) 00:10:43ありがとうございます.
皮がvb.net2005で作らざるを得ないのでできれば閉じた環境で作りたかったもので・・・
とりあえず,真剣に無理そうならvc++でdllを作成するという方向になるかと思われます.
0064デフォルトの名無しさん
2008/10/03(金) 01:49:27VSなら言語やモジュールが分かれていてもシームレスにデバッグできるよ。
GUI(C#)+DLL(C++)も簡単。
0065デフォルトの名無しさん
2008/10/03(金) 09:19:05GraphEditが見当たらないのですがどこにあるのでしょうか?
0066デフォルトの名無しさん
2008/10/03(金) 10:14:060067デフォルトの名無しさん
2008/10/03(金) 10:40:230068デフォルトの名無しさん
2008/10/03(金) 11:04:46このBDAサンプルが動く地デジ・ワンセグチューナってありますか?
0069デフォルトの名無しさん
2008/10/07(火) 18:22:12その画面上にlabelやtextboxを表示したいのですが、動画の下に隠れて(?)しまってみえません。
隠れない方法はあるのでしょうか?
VS2005 C#です。
0070デフォルトの名無しさん
2008/10/07(火) 19:16:190072デフォルトの名無しさん
2008/10/08(水) 04:24:480073デフォルトの名無しさん
2008/10/08(水) 14:33:080074デフォルトの名無しさん
2008/10/14(火) 13:29:15DirectShowを使用してWMVファイルを再生する際にはWMAudio Decoder DMOとWMVideo Decoder DMO
を使用するとよいというのはRender Media Fileを使って理解しました.
その上で再生するのとは別個にWMAをファイルとして保存したいのですがWMAudio Decoder DMOの次のフィルターをどのようにすればよいのでしょうか?
0075デフォルトの名無しさん
2008/10/17(金) 12:19:37ds_inputとds_input.auiと読んでね、が解凍できたのですがこれは正常なんでしょうか?
それとも解凍できてないファイルがあるのかファイル自体がエラーおこしてるのか教えていただけるとありがたいです
0076デフォルトの名無しさん
2008/10/17(金) 14:12:500077デフォルトの名無しさん
2008/10/17(金) 14:17:180078デフォルトの名無しさん
2008/10/24(金) 04:53:39Windows SDK v6.1 + VS 2005 Academic Editionを使用しています.
DirectShowのSample Filterをビルドしてみたところ以下のエラーが出てビルドが通りません.
解決策はないのでしょうか?
007978
2008/10/24(金) 04:58:55未解決の外部シンボル "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個で増した.
0080デフォルトの名無しさん
2008/10/24(金) 12:27:28DirectShow 基底クラス(自分でビルドする必要あり) がリンクされてない
場所は SDK のフォルダから上記クラス名で検索をかけてみればすぐに見つかる
008179
2008/10/24(金) 17:53:57C:\Program Files\Microsoft SDKs\Windows\v6.1\Samples\Multimedia\DirectShow\BaseClasses
を追加で指定したのですが,これだけではないのでしょうか?
0082デフォルトの名無しさん
2008/10/24(金) 18:26:56ビルドしてみそ。Vistaだと別の場所にする必要がある。
そこでできたlibをリンク
0083デフォルトの名無しさん
2008/10/26(日) 13:38:07ムービーの場合は、BufferCB()には、1フレーム分のデータがくるので、
加工などは、とてもし易いのですが、オーディオの場合、同じ44100Hz16Bitステレオのデータでも、
非圧縮のWAVEと、MP3、WMAなどの圧縮データでは1回ごとのBufferCB()に流れてくるPCMの
データ量は違うようです。
例えば3秒のデータを取得したいのですが、
IMediaControl->Run();
IMediaEvent->WaitForCompletion(3000, &evCode);
で、確かにデータは取得できるのですが、実時間待つので
リアルタイム処理ができません。
どうすれば実時間より短い時間で正確に3秒分のPCMデータを取得できますか?
0084デフォルトの名無しさん
2008/10/26(日) 13:59:49ソースは何を想定してるの?
0085デフォルトの名無しさん
2008/10/26(日) 14:40:40ヘルプのReference Clocksを参照。
しかし>>83のWaitForCompletionの使い方は何か勘違いしてる予感。
0086デフォルトの名無しさん
2008/10/26(日) 22:34:40DirectShowは不向きですか?
0087デフォルトの名無しさん
2008/10/26(日) 23:54:020088デフォルトの名無しさん
2008/10/27(月) 03:21:323秒と書いたのは、任意の時間分のデータを取得したかったので、
とりあえず3秒としただけなんです。 エフェクト用のバッファが0.5秒なら0.5秒だったりします。
ソースはDirectShowで処理できる任意の音楽データです。
>>85
Reference Clocksを参照してみます。
IMediaEvent->WaitForCompletion(3000, &evCode); には特に意味はありません。
IMediaEvent->WaitForCompletion(INFINITE, &evCode);ですべてのデータを取得していたのですが、
例を3秒としたので、単純に書いてみました。
>>84,85 返信をありがとうございました。
008979
2008/10/27(月) 19:00:43ありがとうございました。おかげでそのエラーはなくなりました。
ただ、今度は
エラー 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
これは該当するコードの部分を修正するほかないんですよね?
0090デフォルトの名無しさん
2008/10/27(月) 19:31:08LPCTSTR がどこのヘッダで定義されているか検索してみるよろし
0091デフォルトの名無しさん
2008/10/27(月) 21:33:000092メモ
2008/11/01(土) 16:20:51Discuss 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
0093デフォルトの名無しさん
2008/11/05(水) 18:42:42文字セットもマルチバイト文字セットを使用するにしたし,
Windows.hもインクルードしたんだが・・・
refclock.hの80/139/178/166とsyclock.hの25行目でエラー出る
何が問題なんだろう・・・
そして79の子は投げたのだろうか?
0094デフォルトの名無しさん
2008/11/05(水) 19:30:21>>82だけど、実際にビルドできるの確認して書いたんだけど。
0095デフォルトの名無しさん
2008/11/05(水) 19:31:09マジですか
Ver6.0 しか使ってなかったので
帰宅したら 6.1 で試してみよう
009694
2008/11/05(水) 19:31:47009795
2008/11/06(木) 02:30:35>>79 がビルドを試みたと思われるサンプルフィルタ(WavDest)をビルドしてみた。
・ソリューションに「追加のプロジェクト」で BaseClasses.vcproj を追加
・WavDest→BaseClasses の依存関係を設定
という操作は別途行ったが、Debug/Release ビルドしたところ特にエラーもなくビルドできた。
graphedit でも動作することを確認。
BaseClasses をマルチバイト版の構成(Debug_MBCS/Release_MBCS) でビルドしようとすると
WavDest 側がUNICODE版の構成しかないので >>79 のようなリンクエラーが出るのは当たり前。
>>89 >>93 のコンパイルエラーはこちらでは再現できず。(謎)
>>96 の通り別バージョンのヘッダが混じってると確かに起きそうな気はするが…。
0098デフォルトの名無しさん
2008/11/07(金) 00:23:02別のStreams.hがインクルードされてしまっていたことがあった(>>93みたいなコンパイルエラーが出てたはず)
BaseClassesが先頭になるように、インクルードの優先順も見直してみるといいかもね。
009993
2008/11/07(金) 14:21:42後,BaseClassesを先頭に持ってくるようにしたら,すんなりとコンパイルできた
とりあえず,BaseClassesは先頭に持ってこないとコンパイルエラーでるっぽい.
>>79へ
97氏がやってるようにして,すべての文字セットがUNICODEであることを確認して,
追加のインクルードディレクトリでBaseClassesを先頭にしたらコンパイルは通るともう.
0100sage
2008/11/21(金) 15:23:39CBaseVideoRendererを派生させてOpenGLのテクスチャを更新する自作フィルタを作成し、
それは動作しているのですがパフォーマンスに不満があります。
OpenGLでのテクスチャのアップデートにはPBOを使用しているのですが、この場合アップデー
トを行うバッファはOpenGL側から指示されます。
一方、CBaseVideoRendererのDoRenderSample()メソッドでは、デコードされたデータへの
ポインタは前段のデコーダーから与えられます。
そのため、DoRenderSample(IMediaSample * pSample)内でpSample->GetPointer()で得られた
バッファからPBOのバッファへのmemcopy()を行う必要があり、結構なオーバーヘッドとなっ
ています。
OpenGLから与えられたバッファアドレスを前段のデコーダの書き出しバッファとして指定で
きれば、この無意味な転送はなくなると思うのですが、こういった指定をする方法はないで
しょうか?
IMediaSampleではPutPointer()は使えなくなっているようですが、なにかうまくデコーダの
バッファをレンダラ側から扱う方法は無いものでしょうか?
0101デフォルトの名無しさん
2008/11/21(金) 15:51:52ピッチの指定ができなかったから結局は自前コピーが必要かもしれない。
自前のアロケータ(ISampleAllocator)を返してやればそれを使ってくれることもあるけど使用するとは限らない。
個人的にはFBOのほうが好きだ。PBOよりパフォーマンスがいい気がする。
まあこのくらいのメモリコピーなんて気にするな。こういう状況はよくあること。
0102デフォルトの名無しさん
2008/11/21(金) 19:24:32情報ありがとうございます。
無理っぽいですか・・。
とりあえず、教えていただいたアロケータ関連を調べてみます。
運よくつかってくれればラッキーってことで。
処理すべき、動画のサイズが4K用と馬鹿にならないサイズなので少しでも
オーバーヘッドが減るとうれしいんです。MediaPlayerClassicあたりだと
そこそこのフレームレートで再生されていますし。
あと、ここでする話しじゃないですけど、PBOを使用しているのは、
テクスチャとしてポリゴンに貼り付けて使いたいからです。
FBOでもテクスチャの転送用として使えるんでしょうか?
0103デフォルトの名無しさん
2008/11/21(金) 20:51:18FBOは主にオフスクリーンレンダリング用途だけど↑の理由から使う意味があんまりない。どっちかというと逆の用途用。
以前ベンチマークしてみたことがあるんだが、FBO実装のほうが速い結果を得た。
ついでに将来的にPBOは消えるというかサポートされなくなる話も聞いたり。
0104デフォルトの名無しさん
2008/11/21(金) 21:05:44ビデオのワンフレームをビットマップとして保存しようと思っているのですが、
ソースが mpeg2 の場合だと何故か真っ黒なビットマップしか取得できません。
ソース、取得するフレームの位置、mpeg2 video decoder を色々変えて試してみたのですが、
結果は変わりませんでした。
ソースが avi, wmv, mpeg1 の場合は正常なビットマップを取得でることを確認済みです。
このことについて何かご存知の方おられましたらご教示お願いします。
試した mpeg2 video decoder は次のものです。
MpegVideoDecoder PIXELA, Cyberlink Video/SP Decoder
0105デフォルトの名無しさん
2008/11/21(金) 23:01:46まあ、使った動画がどちらも160×112の動画なので、他の場合はどうなるのか分からないんですが
この大きくなってしまうのは何が原因と考えられるのでしょうか?
0106デフォルトの名無しさん
2008/11/21(金) 23:46:52OpenGLは詳しくないんで>>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のことじゃないか?
0107104
2008/11/22(土) 00:22:43情報ありがとうございます。
自前で作られたフィルタは 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. それ以外の何か
0108106
2008/11/22(土) 00:43:00CyberlinkのデコーダとSampleGrabberはどうやって繋いだんでしょう?
ピン同士を繋いで勝手にColor Space Converterが挿入されなかったとしたら
Color Space Converterが受け入れられないYUVフォーマットで出力されている可能性がありますね。
Cyberlinkのデコーダがサポートしている出力フォーマットを知るのが先決ですかね。
とりあえずDumpフィルタをデバッグビルドして、grapheditで接続してみる、
そのときgrapheditのプロセスにアタッチしてDumpフィルタのCheckMediaTypeでbreakかけて
待ち伏せればサポートしている出力ピンのメディアタイプが分かるかも。
(もっと楽な方法もありそうですが、言葉にするほど面倒なことでもないです)
YUV→RGBを自前でできるならYUY2なりYV12なりで受けるのもアリですね。
ところでgrapheditでCyberlinkのデコーダ使って普通にMPEG-2を再生できてます?
0109デフォルトの名無しさん
2008/11/22(土) 00:49:41RGB32
0110104
2008/11/22(土) 01:31:07> ところで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なりで受けるのもアリですね。
誰かが効率的で高品質なもの作っているはずですので、できれば避けたいですね。
0111デフォルトの名無しさん
2008/11/22(土) 14:50:54『GraphEdit』が見つかりません
もしかして、今はGraphEditは無いのでしょうが?
0112デフォルトの名無しさん
2008/11/22(土) 15:14:16今はDirectShowもGraphEditもWindows SDKに入ってる。
http://www.microsoft.com/downloads/details.aspx?FamilyID=e6e1c3df-a74f-4207-8586-711ebe331cdc
0113デフォルトの名無しさん
2008/11/22(土) 15:33:03もしかしてインストールするのを間違えたという事なんでしょうか?
アンインストールはSDKのフォルダを削除すればいいんですよね?
0114デフォルトの名無しさん
2008/11/22(土) 16:13:200115デフォルトの名無しさん
2008/11/22(土) 21:48:46他人の作ったVMRを利用した動画再生ソフトの再生画面に、自前の絵・文字を合成したい場合、
CoCreateInstanceをAPIフックして、IBaseFilterが作成される時にIVMRMixerBitmapを勝手に作成
という流れで問題はないでしょうか?
試してみたところ、一応思い通りには動いてくれているようなのですが、
APIフックやDirectShowに対する知識があまりないため、もっと簡単にやる方法があるんじゃないかとか、
この方法だと(予期せぬ)問題が生じるんじゃないかとか思っているのですが、
そのあたりのご意見いただければ幸いです。
0117デフォルトの名無しさん
2008/11/23(日) 00:41:02ひたすら泥臭い
0118106
2008/11/23(日) 00:42:04乗りかかった船ついでに、ちょっと調べみた。
手元にあった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変換するモジュールを自作したいところなんですが)
0119デフォルトの名無しさん
2008/11/23(日) 04:07:11とかないかな。
0120106
2008/11/23(日) 07:28:16後でやってみよう
0121106
2008/11/24(月) 00:28:42それを切ればYUY2で接続することができました。
[Cyberlink S/P decoder]のプロパティ設定方法については調べていません。
おそらくIPropertyBagインターフェイスが実装されていると思うんですがどうなんでしょう?
では、おやすみなさいませ
0122104
2008/11/26(水) 01:13:25私なりに解決方法を模索した結果、
CBaseVideoRenderer から派生したとある video renderer を
カスタマイズすることで問題を解決させました。
その video renderer は私が望んでいた大抵の条件を満たすものとなりました。
出処と詳細については申し訳ありませんが記せません。
SampleGrabber を使わなかった理由は、
これにもいくつかの制限があったからです。
ttp://msdn.microsoft.com/en-us/library/ms786693(VS.85).aspx
0123デフォルトの名無しさん
2008/12/01(月) 10:14:41CComPtr<IBaseFilter> WAVE_Filter;
WAVE_Filter.CoCreateInstance(CLSID_MPEG1Splitter); // ここでエラー
DS_graph->AddFilter(WAVE_Filter, _T("aaaa");
フィルタ CLSIDの項目をいれたんですが、)が無いとか言われるんです。
0124デフォルトの名無しさん
2008/12/01(月) 10:16:070125デフォルトの名無しさん
2008/12/03(水) 04:22:24RenderFileでグラフを作成した後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();
0126デフォルトの名無しさん
2008/12/03(水) 04:46:50Waveファイル出力フィルタは標準で存在しない。SDKに WavDest というサンプルがある。
まずはドキュメントを一通り読むことだ。
0127デフォルトの名無しさん
2008/12/03(水) 06:45:19ずっと行き止まりで助かりました。
ありがとうございました。
0128デフォルトの名無しさん
2008/12/10(水) 21:39:36どうやって画像を取得すればいいですか?なるべく高速に動作する方法を使いたいです。
ビデオウィンドウも表示されないようにしたいです。
0129デフォルトの名無しさん
2008/12/10(水) 21:44:020130デフォルトの名無しさん
2008/12/13(土) 22:06:21MSDNで検索してもいいんですが、インターネットに接続できないことが多いので・・・
0131デフォルトの名無しさん
2008/12/13(土) 22:38:15英語でよければ
つ 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
0132デフォルトの名無しさん
2008/12/14(日) 16:41:58mpeg2デコーダの出力ピンがDirectX Video Acceleration (DXVA)でビデオレンダラに接続されている状態で、
自作した変換フィルタをその出力ピンとビデオレンダラの間に接続したいのですが、何か方法ありますか?
変換フィルタの入力ピンのMediaのSubTypeがRGBやYV12では接続できませんでした
DXVAのビデオアクセラレーションが効いている状態では変換フィルタを接続することはできないということでしょうか?
0133デフォルトの名無しさん
2008/12/14(日) 20:49:490134130
2008/12/14(日) 21:26:54ありがとうございます。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
が残っていたので手動削除しましたが、これも間違ったことをしたのではないかと不安です。
0135デフォルトの名無しさん
2008/12/14(日) 21:36:45GraphEditでいろいろ遊んでみました
DXVAを使うmpeg2デコーダの場合は「接続に必要な中間フィルタの組み合わせが見つかりませんでした」で変換フィルタが接続できませんでした
DXVAを使わないmpeg2デコーダにすれば変換フィルタを入れられるのですが、ハードウェアの再生支援がなくなるのでCPU負荷が高くなります・・・
DXVAを使うデコーダのメリット値が一番高い場合、自動的な組み合わせではなく、変換フィルタと接続できるデコーダを自力で探さないといけないのが少々面倒ですね
H264のデコーダでもDXVAが使われることがあるので、DXVAに対応させるように変換フィルタを組み合わせるのは結構大変ですねオワタ\(^O^)/
0136130
2008/12/14(日) 22:02:30いったい何処にあるんだ亜!
0137デフォルトの名無しさん
2008/12/14(日) 22:32:15Streams.h は Microsoft Platform SDK のサンプルの下にあるよ
例)C:\Program files\Microsoft SDKs\Windows\v6.0\Samples\Multimedia\DirectShow\BaseClasses
サンプルを要らないと思って消すと見つからなくなるわな
0138デフォルトの名無しさん
2008/12/14(日) 23:00:23こんなとこで、クダまいてないで、ググったほうが早いぞ。
手当たり次第に見ていけば環境構築について書いたHPくらいすぐ見つかるじゃろ。
というか、テンプレの関連サイトくらいは全部のぞいとくべし。
0139130
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
0140デフォルトの名無しさん
2008/12/15(月) 23:56:01これをビルドしたいだけなんですが、リンクでよく分からないエラーが出ます。
まずatlbase.hが無いといわれたので、
ATLをWinDDKからとってきて、
Streams.hをサンプルからとってきて、
strmbase.libもビルドしてVC++ディレクトリに設定しました。
それでもまたエラーが出るので
/NODEFAULTLIB:libcmt.libを設定しました。
これから先どうすればいいんでしょか・・?これはググっても全然分かりません。
0141デフォルトの名無しさん
2008/12/15(月) 23:57:160142デフォルトの名無しさん
2008/12/15(月) 23:58:03mpeg2デコーダとDXVAの間に自作フィルタ入れたいんだよね?
サンプルでさ、NullNullフィルタだかNullInPlaceだか名前忘れたけど
何にもしないフィルタがあるんだわさ。
そいつを改造してmpeg2デコーダとDXVAに入れてみるといいよ。
改造内容はどのメディアタイプで繋がるのかログでも吐かせりゃいいべさ。
0143デフォルトの名無しさん
2008/12/16(火) 00:01:12>mpeg2デコーダの出力ピンがDirectX Video Acceleration (DXVA)でビデオレンダラに接続されている状態で
一回接続させた後に接続解除して、Nullフィルタ繋ぐんだわさ
0144デフォルトの名無しさん
2008/12/16(火) 00:08:28C++かVSスレで質問しろ。
0145デフォルトの名無しさん
2008/12/16(火) 01:55:37Expressだとatlmfcがないから無理
0147デフォルトの名無しさん
2008/12/18(木) 23:37:26SetTimeFormatでTIME_FORMAT_FRAMEを指定したら
E_NOTIMPLが帰ってきて使えないんだが
0148デフォルトの名無しさん
2008/12/18(木) 23:56:16かな。
0150デフォルトの名無しさん
2008/12/22(月) 23:05:39間に合わない場合は再生速度を遅くする
(つまり、一切フレームスキップをしないようにしたい)
・音声をリアルタイムに加工、出力する
この2つを実現するにはどうする?
0151デフォルトの名無しさん
2008/12/22(月) 23:06:150152デフォルトの名無しさん
2008/12/22(月) 23:49:58検索しても出ない
0153デフォルトの名無しさん
2008/12/23(火) 00:29:33フィルタを使うじゃ抽象的過ぎてわからんよ。
0154デフォルトの名無しさん
2008/12/23(火) 00:43:570155デフォルトの名無しさん
2008/12/23(火) 21:00:540156デフォルトの名無しさん
2008/12/23(火) 21:33:310157152
2008/12/23(火) 22:01:42ムービーを書き込むクラスをC++で作る
2.C#でWindows FormsでGUIを作る
3.C#でDirectShow、OpenGLを初期化
DirectShowでグラフ構築時に1.で作ったフィルタを入れる
というようなことがしたい。のだがCOMに対応したDLLの作り方が
分からない。
C#でDirectShowを使うのにはDirectShow.NETを使うつもり。
0158デフォルトの名無しさん
2008/12/23(火) 22:24:21SDKのサンプルの改造じゃだめなの?
0159152
2008/12/23(火) 22:46:590160デフォルトの名無しさん
2008/12/23(火) 22:50:450161デフォルトの名無しさん
2008/12/24(水) 22:33:25何を迷ってる?
0162デフォルトの名無しさん
2008/12/25(木) 00:38:380163デフォルトの名無しさん
2008/12/25(木) 01:33:090164152
2008/12/27(土) 22:12:10やってみた
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からコピーしたけどビルドできん・・
0165デフォルトの名無しさん
2009/01/02(金) 21:25:16どうやるの?
0166デフォルトの名無しさん
2009/01/02(金) 22:21:160167デフォルトの名無しさん
2009/01/02(金) 23:19:34そうさせない方法を
0168デフォルトの名無しさん
2009/01/03(土) 00:07:030169デフォルトの名無しさん
2009/01/06(火) 14:21:02動画を再生しながらファイルにも出力しようと思っているのですが
SampleGrabberで可能なのでしょうか?
Web上のサンプルは静止画を切り抜くものばかりで使い方がよくわかりません・・・
0170デフォルトの名無しさん
2009/01/06(火) 14:40:49MediaSeeking->SetPositions( ¤t, AM_SEEKING_AbsolutePositioning, &stop, AM_SEEKING_AbsolutePositioning );
::Sleep( 50 ); // ←これないとフレーム移動する前の画像になる
SampleGrabber->GetCurrentBuffer( &DIBBufferSize, (long *)DIBBuffer );
間にSleepを入れないと指定フレームの画像にならなのですが
もっと早く取る方法あったら教えてください。
0171デフォルトの名無しさん
2009/01/06(火) 15:10:32可能です。
ただ、ファイル出力処理で滞ると当然コマが飛びます。
再生優先かファイル出力優先かによってコールバック内の実装をよく考えるべし。
>>170
IMediaControl::GetState()で必要最低限のウェイトを入れられると思います。
デバッグ中ならとりあえずINFINITEを入れてもいいでしょう。
0172169
2009/01/06(火) 16:03:26ありがとうございます
現在
ttp://www.geekpage.jp/programming/directshow/samplegrabber.php
こちらのページを参考にしているのですが
BMPではなくそのままの動画ファイルにするには
どういった部分を変更すればよいのでしょうか?
0173デフォルトの名無しさん
2009/01/06(火) 16:38:33あー、ごめん、別に自前のメモリにビットマップが欲しいわけなじゃないのね。
じゃあ、この辺りを参考にしてみてはどうでしょう?
VBで書いてあるけど、大体意味は分かるでしょう。
ttp://www.geocities.co.jp/SiliconValley/7406/tips/dshow/dshow3.html
簡単に説明すると、入力データを Infinite Pin Tee Filter で分岐させて、
Video Renderer と AVI Mux につっこむ。
ピンのつなぎ方が分からなければ、またそのときに。
0174デフォルトの名無しさん
2009/01/06(火) 17:01:41ありがとうございます。
IMediaControl::GetState()で最低限のウェイトにできました。
所でこれはやっぱりウェイトを入れないとダメなものなんですか?
0175デフォルトの名無しさん
2009/01/06(火) 17:51:04フィルタグラフ自体は別のスレッドで動いているものなので、
スレッド間で同期をとることを考えると仕方のないことですね。
0176デフォルトの名無しさん
2009/01/06(火) 18:12:26そうなんですか。
ちなみに、最初のフレームから最後のフレームまで
順番に画像を抽出したい場合は>>170以外の方法でもっと効率がいいやり方はありますか?
0177デフォルトの名無しさん
2009/01/06(火) 18:41:580178デフォルトの名無しさん
2009/01/06(火) 18:50:35画像を取り出すだけなんですけどね。特に動画を再生する必要はないんですが
0179デフォルトの名無しさん
2009/01/06(火) 18:55:56毎フレームSetPositionsをするのは確かに効率が悪いです。
可能であればSampleGrabberのコールバックを使った方がいいでしょう。
自分は以下の記事を参考にしてコールバック処理を実装しました。
ttp://codezine.jp/article/detail/322
GetCurrentBufferに比べると結構面倒ですけどねw
しかし結局自分はSampleGrabberの実装を捨てることになってしまいましたorz
(まあどうでもいいことですが)
0180デフォルトの名無しさん
2009/01/06(火) 19:13:34ありがとうございます。
参考にさせて頂きます〜
0181169
2009/01/06(火) 19:14:29度々ありがとうございます
VBはいまいち理解できてないのですがVC++の場合ですと
ttp://www.geekpage.jp/programming/directshow/video-capture-save-avi.php
こちらのページの入力をビデオカメラから動画ファイルに変更するということでよろしいのでしょうか?
的外れな質問でしたらすみません
0182デフォルトの名無しさん
2009/01/06(火) 19:41:19そこにはキャプチャデバイスからAVIファイルに直接保存する方法が書いてありますが、
169さんの場合対象が(ネットワーク上の)ファイルからの再生だとすると
あまり参考にならないと思います。
とりあえず>>173で挙げたページと同じようにGraphEditでフィルタを繋いでみて、
自分の意図している動作をさせられるか、を確認してはいかがでしょうか。
ほな。
0183デフォルトの名無しさん
2009/01/06(火) 21:14:22板違いな質問かもしれませんが、ことはDirectShowに関わる問題なようなので、お詳しい皆さんお助けください。
「Virtual PC」上で、NHKオンデマンドからDLしたWMVファイルをWMPで再生を試みたところ、「DirectShow フィルタ グラフに存在しないピンに操作を実行しようとしました」と表示され、再生できませんでした。
OSはXP、WMPのバージョンは10です。
解決法について、ご教示のほど願います。
0184167
2009/01/06(火) 22:10:41RunしてすぐにPauseするという事?
ttp://www.shader.jp/xoops/html/masafumi/directx9/DShow/dshow001.htm
を参考にレンダラー作ったんだけど
RunしてすぐにPauseすると一回もレンダリングが行われないで
ポーズしてしまう・・・
0185169
2009/01/06(火) 22:23:50ライブストリーミングの場合はアドレスが「http://IP:ポート番号」になるので
GraphEditではどうやってソースとして指定できるのかがわかりません
再生することはできたので
要は再生している動画を別ファイルに保存するというようなことをしたいのですが
簡単な方法などないでしょうか?
何度も質問ばかりで申し訳ありません
0186デフォルトの名無しさん
2009/01/06(火) 23:40:19DoRenderSampleで初回のフレームが到着したかどうかチェックして
ポーズをかけてみたらどうでしょう?
(やり方としてマットウかどうかはよく分かりませんが)
>>185
File Source (URL) で・・・、と思ったけどこれで直接URL指定する方法が分かりませんね。
一応適当なテキストファイルにアドレスを書いて File Source (Async) で開くと
勝手に ASX File Parser が繋がってFile Source (URL) で開きなおしてくれるっぽい・・・。
こっち(↓)みてコード書いた方が早いかも。
ttp://www.geekpage.jp/programming/directshow/renderfile-url.php
0187デフォルトの名無しさん
2009/01/07(水) 10:13:37DirectShowがまだ何かに統合する前に作ったソフトがあるのですが
これ今でもDirectX9にしても普通にコンパイルできて動画がみれるのですが
コンパイルできてるなら特にSDKとかなくてもいいんですよね?
0188デフォルトの名無しさん
2009/01/07(水) 10:30:51試しにコードの一部でもうpしてみれ
0189デフォルトの名無しさん
2009/01/07(水) 10:50:36あ、エスパー的な質問でしたか。
とりあえずファイルをオープンするところをう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;
}
0190デフォルトの名無しさん
2009/01/07(水) 10:51:27pVideoHeader = (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;
}
こんな感じなのですが・・・
0191デフォルトの名無しさん
2009/01/07(水) 12:49:42普通にDirectShowね。
「まだ何かに統合する前」てActiveMovie時代のことを言ってるのかな?
当時はActiveMovie SDKのインストールが必要でしたね。
Visual Studio .NET 2003辺りならPlatform SDKのサブセットみたいなのが
同梱されていたと思うので、特にSDKを追加する必要はないはず。
2005以降だとEEであればPlatform SDKかWindows SDKのインストールは
必要になると思いますです、ハイ。
0192デフォルトの名無しさん
2009/01/07(水) 13:17:20これDirectShow使うのに必要なのって
ヘッダファイル
DShow.h
QEdit.h
と
strmiids.lib
とDirectXがインスコされていればいいだけですよね?
0193デフォルトの名無しさん
2009/01/07(水) 13:34:24プログラムとしてインクルード/リンクすべきファイルはそんなもんですが、
各ヘッダからやはり別のWindows(Platform) SDKに含まれるヘッダを
インクルードしている形跡もあるので、注意は必要かと思います。
まあ、コンパイルしてみれば分かることですけどね。
0194デフォルトの名無しさん
2009/01/07(水) 13:40:56あ、そっか、そうですよね。
とりあえず今は普通にコンパイルが通るって事は
以前にインスコしたのがあるからなんですね。
0195デフォルトの名無しさん
2009/01/09(金) 18:04:57何かExpressは同封されてるって書いてるんですが・・・
0196デフォルトの名無しさん
2009/01/09(金) 18:17:50BaseClassesの方ならStandardのSDKにすら入ってないよ。
いつもどうり別途Windows SDKが必要。
0197デフォルトの名無しさん
2009/01/09(金) 18:22:57Standardはどうなのか知りたかった
0198184
2009/01/09(金) 21:51:03なるほど
DoRenderSample()
{
...
rendered = true;
...
}
movie->play();
while(!movie->isRendered())
{
}
こんな感じ?確かにあまりまっとうじゃない・・
ttp://www.geekpage.jp/programming/directshow/samplegrabber-3.php
画像の取得はCBaseVideoRendererで、1フレーム目でとめるのには
SampleGrabberを使うということはできるのかな
0199デフォルトの名無しさん
2009/01/09(金) 22:34:33そのままの意味だ。RunしないでPause。
0200デフォルトの名無しさん
2009/01/09(金) 22:37:33つか、全部書いてあるだろ。ドキュメントくらい読め。
0201184
2009/01/09(金) 23:53:34Runして初めて表示される・・
0202デフォルトの名無しさん
2009/01/10(土) 00:58:38Pauseでポスターフレーム出す処理はレンダラが実装する必要があるんだわ。
void OnReceiveFirstSample(IMediaSample *pMediaSample) {
DoRenderSample(pMediaSample);
}
これ追加するとよかばってん
0203デフォルトの名無しさん
2009/01/10(土) 08:09:02184じゃないけどthx
0204169
2009/01/12(月) 19:29:05ttp://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を使えばよいのかな?と考えてはいるのですが
サンプルがビデオキャプチャからの取得方法ばかりで
こういった場合にどのような記述をすればよいのかわかりません
0205デフォルトの名無しさん
2009/01/12(月) 22:51:430206デフォルトの名無しさん
2009/01/13(火) 01:18:52RenderFilleやっちゃいかん。
ソースフィルタ(URL)をフィルタグラフに登録したあと、
出力ピンを列挙してAVI Muxに1つずつ接続すればおk
たぶん。
あ、あとファイル出力も手動で指定してフィルタ繋いでね。
0207169
2009/01/13(火) 06:56:07ありがとうございます
以下のようなプログラムを作ってみたのですが
ttp://uploaders.ddo.jp/upload/1mb/src/1up5294.txt
コンパイルすれば通るものの実行してもファイルが作成されません
これはピンのつなぎ方などが間違っているのでしょうか?
0208デフォルトの名無しさん
2009/01/13(火) 12:50:400209デフォルトの名無しさん
2009/01/13(火) 16:10:020210デフォルトの名無しさん
2009/01/13(火) 17:18:19チェックしてみましたがどこもエラーは返ってきませんでした
>>209
すいません・・・
>>206と
ttp://msdn.microsoft.com/ja-jp/library/cc352330.aspx
の辺を参考にしてやってみたんですがどの辺がおかしかったでしょうか?
ソースフィルタ(URL)をフィルタグラフに登録、というのは
pGraph->AddSourceFilter(URL, L"Source Filter", &pSrc);
出力ピンを列挙してAVI Muxに1つずつ接続
というところはRenderStreamを2回行ってみたのですが
根本的に間違っていたりしたらすみません・・・
0211169
2009/01/13(火) 18:38:16一から書き直してきます
0212デフォルトの名無しさん
2009/01/13(火) 19:57:050213デフォルトの名無しさん
2009/01/13(火) 20:29:46安易に一歩踏み込むとすぐに樹海に迷い込むのがDirectShow。
0214169
2009/01/13(火) 22:44:13ttp://uploaders.ddo.jp/upload/1mb/src/1up5301.txt
AddFilterからどうしてもNULLポインタが返ってきたり
GetPinがコンパイルをとおらずPin同士の接続ができなかったりしますが
とりあえずそれらの部分を除外して実行した結果
http://localhost:7144/test.aviのようなファイルは保存に成功できました。
しかしライブストリーミングの場合は解像度と再生時間はきちんとできた動画が作成されたのですが
再生しようとしても再生されない動画ファイルでした
やはりAddFilterやPinの接続がきちんとできていないことが原因なのでしょうか?
GraphEditでは簡単にできても実際に作るのは難しいものなのですね
単に私が駄目なだけかもしれませんが
0215デフォルトの名無しさん
2009/01/13(火) 22:55:510216デフォルトの名無しさん
2009/01/13(火) 23:37:12MSDNの通りにプログラムが書けてない。
IGraphBuilderはCoCreateInstanceしない。
ICaptureGraphBuilder2からGetFiltergraphで取得する。
0217デフォルトの名無しさん
2009/01/14(水) 01:01:13なるほど
hr=CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,
CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2, (void **)&pBuilder);
hr=pBuilder->GetFiltergraph(&pGraph);
こういうことですね
しかしこうやってもGetPinがコンパイルを通らないのは変わらず
そこをコメントアウトして実行すると
hr=pGraph->AddFilter(pAVIMux,L"AVI Mux");の部分で
例外が出て終了する様になりました
これもコメントアウトしたばあいは前回と変わらず解像度と再生時間のみ正しい
再生されない動画ファイルが作成されるだけでした・・・
0218デフォルトの名無しさん
2009/01/14(水) 01:21:220219デフォルトの名無しさん
2009/01/14(水) 01:38:19これ使ってピン同士を接続するのかなと思ってコピペしてきたら
ただの自作メソッドでした
早とちりしてすみません
削っても動かないことに変わりはないのですが・・・
0220デフォルトの名無しさん
2009/01/14(水) 01:42:46もう少し頑張って勉強してからまたおいで。
エスパーじゃないから、そんなんでコンパイル通らないとか言われても困るわ。
0221デフォルトの名無しさん
2009/01/15(木) 15:41:50if( 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にはなりませんでした。
何が原因でしょうか?
0222221
2009/01/15(木) 19:18:33ちなみに上記のコードの後に読み込みと同時に1フレーム目を表示されようと
MediaSeeking->SetPosition ←上のコードには書いてないですが今はQueryInterfaceしてます
MediaControl->StopWhenReady();
VideoWindow->Visible( OATRUE );
を入れたのですが、何故か1回目の読み込み時には表示されず
2回目以降に表示されるのですが、何が原因ですか?
0223デフォルトの名無しさん
2009/01/15(木) 22:57:20作ったフィルタをregsvr32で登録しないで使う方法ってありますか?
登録するのは(ユーザーにとって)面倒だし
クラスの型がIBaseFilterにしか出来ないので
アプリケーション側からデータを渡したり出来ません。
0224デフォルトの名無しさん
2009/01/15(木) 23:06:15C#のCOMのラッピングのメカニズムも理解できていないんだろ?
0225デフォルトの名無しさん
2009/01/15(木) 23:08:01RemoveFilterに失敗します。処理は正常なのですが、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);
0226デフォルトの名無しさん
2009/01/15(木) 23:39:310227デフォルトの名無しさん
2009/01/15(木) 23:52:39エラーコードは何ぞ?
試してないから外してるかもしれないけど、
pin_DefaultDSDeviceToをReleaseしてないから、ってなオチはない?
0228デフォルトの名無しさん
2009/01/16(金) 00:01:29hr = pin_DefaultDirectSoundDevice->Disconnect();
0229デフォルトの名無しさん
2009/01/16(金) 00:43:07フィルターを削除する時繋いであったピンを解除。
繋ぎ換えるのにも解除後接続ですね。覚えました
意外と融通きかないんですね・・・
ありがとうございました。
0230デフォルトの名無しさん
2009/01/16(金) 03:43:18書けと言われたときはくらくらと眩暈がした。
0231デフォルトの名無しさん
2009/01/16(金) 12:36:290232デフォルトの名無しさん
2009/01/16(金) 13:31:35イベント通知コードは何になるんですか?
0233221
2009/01/16(金) 15:57:23どうやら一瞬表示してるみたいで
VideoWindow->Visible( OATRUE );の下にSleep( 1000 );と入れると
1秒間最は初のフレームを表示して、1秒後に消えてしまいます。
そして2回目に>>221を走らせた時はずっと最初のフレームを表示した状態になります
何が原因でしょうか・・・
0234221
2009/01/16(金) 16:11:44どうやらStatic Textに描画されてるのがまずかったみたいです。
Picture Controlにしたら消えなくなりますた。。。
なにこれ・・・
0235デフォルトの名無しさん
2009/01/16(金) 17:00:570236デフォルトの名無しさん
2009/01/16(金) 17:10:21では、どうぞw
0237デフォルトの名無しさん
2009/01/17(土) 01:24:290238デフォルトの名無しさん
2009/01/19(月) 09:02:440239デフォルトの名無しさん
2009/01/19(月) 16:28:00日本語でも英語でもプログラミング言語でも。
0240デフォルトの名無しさん
2009/01/19(月) 17:49:44その前にやってるSetMediaTypeはちゃんとS_OKが返ってきてます。
0241デフォルトの名無しさん
2009/01/19(月) 18:22:51繋げろ!
0242デフォルトの名無しさん
2009/01/19(月) 18:30:15言い忘れてましたが、VFW_E_NOT_CONNECTEDが出るのはGetConnectedMediaTypeだけで
他は普通にOKなので動画の再生はできています。
0243デフォルトの名無しさん
2009/01/19(月) 18:51:39そうでなければ別にサンプルグラバが繋がってなくても再生に支障はありませんよ。
少々面倒でもROTを登録して外部からフィルタグラフを覗けるようにしておくと
デバッグが便利ですよ。
0244243
2009/01/19(月) 18:52:57○ ROTに登録
0245デフォルトの名無しさん
2009/01/19(月) 19:03:42やりたい事はと言うと、再生して指定フレームの画像をbmpとして保存したかったのです。
その為にサンプルグラバでAddFilter後にビデオヘッダを取得したりと・・・
とりあえずGraphEditでみてみようとおもいます・・・
ちなみに、同じソースを別PCで動かすとGetConnectedMediaTypeでエラーはでませんし
正常にbmpファイルに落とすことができています。
0246デフォルトの名無しさん
2009/01/20(火) 00:24:24フレームで指定ってできるんだっけ?
○番目のフレームとか。
0247デフォルトの名無しさん
2009/01/20(火) 00:41:20とはいえ、TIME_MEDIA_TIMEしか使えないストリームだと
ちょっと難しいけど。
0248デフォルトの名無しさん
2009/01/21(水) 22:49:540249デフォルトの名無しさん
2009/01/21(水) 23:40:38>>247でも書いてるけど、すべてのストリームでTIME_FORMAT_FRAMEが使えるとは限らない。
本格的にやるならDESを使うんですかね。
自分はやったことないので分からないですが。
0250デフォルトの名無しさん
2009/01/22(木) 15:56:17BasicVideoのGetCurrentImageで画像を取ると3秒もかかってしまうのですが
これをもっと早く取る方法ってありますか?
0251デフォルトの名無しさん
2009/01/22(木) 16:27:45「コーデックの関係でSampleGrabberでの画像抽出ができず」辺りを
もう少し詳しく話した方が、いい話が聞けるかもよ?
0252デフォルトの名無しさん
2009/01/22(木) 16:56:00そうですね。失礼しました。
カノープス社のコードックであれしてるaviファイルから静止画を取りたいのですが
これが何故かSampleGrabber->GetConnectedMediaTypeでエラーになるんです。
ちなみにほかのaviファイルでは正常に静止画が取得できています。
それで試しにBasicVideoで静止画と取ってみたら取れたのですがこれが遅くて・・・
0253デフォルトの名無しさん
2009/01/22(木) 17:57:020254デフォルトの名無しさん
2009/01/22(木) 18:04:390255デフォルトの名無しさん
2009/01/22(木) 18:11:38今色々試してたんですが、SetMediaTypeするときの
サブタイプをMEDIASUBTYPE_RGB32にすると
GetConnectedMediaTypeでエラーが出ずに通ったのですが・・・
これすると、映像がさかさまになってる・・・
0256デフォルトの名無しさん
2009/01/22(木) 21:17:220257デフォルトの名無しさん
2009/01/22(木) 21:44:12可能な限り速くコマ送りするのってどうするんですか?
IVideoFrameStepを使うと1倍速以上にはならないし、逆方向には進めません。
独自レンダラでレンダリングした画像を
加工して1コマずつ連番BMP出力したいだけなんですが。
(将来的にはDirectShowを使った出力も実装したいが、取りあえずBMPで)
>>255
memcpyを使って画像を自力で反転するしかないのでは。
(画像の横幅*4byteのサイズでコピーを繰り返す)
4byteなのはMEDIASUBTYPE_RGB32で32bitの画像と指定したからです。
もしRGB24なら3byteです。
0258デフォルトの名無しさん
2009/01/23(金) 00:52:55BITMAPINFOHEADERか何かで上下反転してるかどうかの判定は
可能じゃなかったかな?
>>257
SampleGrabberを使ってた時の経験だけど、SetSyncSource(NULL)では
うまくいかなくて、SetRateで適当に100倍くらいを設定して全力取得したり
したことはあります。ただ、コーデックによってはうまくいかないかも。
0259デフォルトの名無しさん
2009/01/23(金) 09:47:42再生される以上どこかで電圧値に置き換わってると思うんですが、サウンドボードで変換されてるんですか?
MIDIデフォルトOUTを置き換えても不可能でしょうか?WAVE関連のものに置き換えできませんでした
0260デフォルトの名無しさん
2009/01/23(金) 10:15:08いえRGB32にすると映像の方がさかさまになるんですよ。
RGB24にすると映像は正常なのですがGetConnectedMediaTypeでエラーになりまふ
>>258
あ、そうなんですか?
ちょっとヘルプみてみます。
0261デフォルトの名無しさん
2009/01/23(金) 10:32:57取得できた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が
途中に入るかどうかによるのかもしれん。
0262デフォルトの名無しさん
2009/01/23(金) 10:38:29ありがとうございます。
しかしbiHeightが負で判別できた場合はどうやって映像を正常に表示できるんでしょうかこれ。
0263デフォルトの名無しさん
2009/01/23(金) 10:56:49レンダリング結果も上下反転してるの?
BMPに保存したときだけじゃなくて?
0264デフォルトの名無しさん
2009/01/23(金) 11:02:18まれに対応していないソフトもある
0265デフォルトの名無しさん
2009/01/23(金) 11:32:50静止画は正常で動画の方が逆になるんですよね・・・
でもRGB24にすると動画は正常になるけど
GetConnectedMediaTypeでエラーになって・・・
0266デフォルトの名無しさん
2009/01/23(金) 12:47:440267デフォルトの名無しさん
2009/01/23(金) 18:26:01SetPositionsでフレームを移動して取ると時間がかかるので
もっと効率的な方法はどうしたらいいですか?
0268デフォルトの名無しさん
2009/01/23(金) 20:41:02WavDestとFileWriterでよかばってん
>>267
ストリーム流しながらのサンプルグラバでよかばってん
0269デフォルトの名無しさん
2009/01/23(金) 20:52:300270257
2009/01/23(金) 22:24:25SetRateは(貴方が書いているように)コーデックによっては使えないので・・
SetSyncSource(NULL)しても再生は別スレッドで行われているのに
どうやって
レンダリング→BMP出力→レンダリング→BMP出力→...
のように同期させられるんでしょうか。
0271デフォルトの名無しさん
2009/01/23(金) 22:27:170272デフォルトの名無しさん
2009/01/23(金) 22:37:32サンプルグラバとNullRenderer使えよ
0273257
2009/01/23(金) 23:17:54push??pull?
ttp://unkar.jp/read/pc11.2ch.net/tech/1162913156
色々調べてみたら、これがヒットしました。
・・・ソースフィルタを作って加工したデータをこのフィルタに送るんでしょうか
0274デフォルトの名無しさん
2009/01/23(金) 23:20:490275デフォルトの名無しさん
2009/01/24(土) 11:38:54ダメです、MIDIParsaとWevDestがつながりません。
pMediaType->SetType(&MEDIATYPE_Midi);
の変更もしてみたんですがダメです。グラフエディタでつながらないと出ます
お願いします
0276デフォルトの名無しさん
2009/01/24(土) 13:47:34情報少なすぎてわかるわけがないよ。エスパーじゃないし。
わかるように書いてよ。
0277デフォルトの名無しさん
2009/01/24(土) 15:04:310278デフォルトの名無しさん
2009/01/25(日) 17:51:50音源はどこから引っ張ってくればいいんですか?
0280デフォルトの名無しさん
2009/01/26(月) 18:15:47このスレでも何度か話題に出てるんで探してみれ
0281デフォルトの名無しさん
2009/01/29(木) 21:59:010282デフォルトの名無しさん
2009/01/30(金) 13:26:27動画サイズのまんまではなくて縮小して取得したい時はどうしたらいいですか?
0283デフォルトの名無しさん
2009/01/31(土) 15:50:000284デフォルトの名無しさん
2009/02/02(月) 03:20:48どう作ればいいのか判りません。
最初の曲は、サビまでシークしてしてから、WAVEファイルにはできているようです。
ですが、2曲目を処理しようとすると、グラフを停止しないと、接続できないという現状です。
例えば、2つの曲をフェードインアウトで繋げる処理はどう書けばいいのでしょうか?
なにかヒントやサンプルなど教えてもらえるとありがたいです。
0285デフォルトの名無しさん
2009/02/02(月) 04:29:590286デフォルトの名無しさん
2009/02/02(月) 10:56:550287デフォルトの名無しさん
2009/02/03(火) 01:16:38DESってDirectshow編集サービスのことですよね。
ちょっと調べてみます。 ありがとうございました。
0288デフォルトの名無しさん
2009/02/05(木) 14:32:39MP4ファイルの頭に5Kほどのデータを付加したファイルを再生する
フィルターをASyncサンプルに手を加えて作りました。
GraphEditではファイルを選択して、VideoRendererとPIN接続すると、
MP4Splitterとffdshow codecが間に入り再生できます。
このファイルをGraphEditにD&Dするとはじかれます。
これをIGraphBuiderでグラフを作って再生したいのですが、
どうしても自作フィルターとMP4SplitterとのConnectで
CANNOT_CONNECTが帰ってきてしまいます。
自作フィルタにファイルパスを与えてグラフに追加するという、
GraphEditでの動作をどのようにプログラムしていいのかわかりません。
方法をご存知の方、ご教授ください。
ベースとするフィルタを間違えているのでしょうか?
0289デフォルトの名無しさん
2009/02/05(木) 15:14:590290デフォルトの名無しさん
2009/02/05(木) 15:17:29知らないならレスしないで下さい。ウザいだけです。。
0291デフォルトの名無しさん
2009/02/05(木) 16:01:110292デフォルトの名無しさん
2009/02/05(木) 16:50:34・・・じゃないよね。
自作フィルタはちゃんと自前でCoCreateInstanceしてる?
0293デフォルトの名無しさん
2009/02/05(木) 16:51:150294デフォルトの名無しさん
2009/02/05(木) 17:14:08後はRendaerFileでいいんじゃないの?
そうすりゃMP4Splitterとffdshow codecが勝手に間に入るだろ
0295デフォルトの名無しさん
2009/02/05(木) 23:36:50pMediaSeeking->SetPositions(&tmp,AM_SEEKING_AbsolutePositioning,
NULL,AM_SEEKING_NoPositioning);
AverageTimePerFrameを使ってシークするのって駄目なんですか?
たまに思った位置にシークできないファイルがあります。
0296デフォルトの名無しさん
2009/02/07(土) 01:54:57DirectShowでmp3を再生中にISampleGrabberのGetCurrentBufferを行うと、
再生中の場所の波形データが取得できると思うのですが、
毎回GetCurrentBufferを行っても、1秒間に約3回ほどしか取得するデータに変化がありません。
リアルタイムに現在再生中の場所の波形データを取得するにはどうしたらよいのでしょうか。
0297デフォルトの名無しさん
2009/02/07(土) 15:37:21http://okwave.jp/qa4600803.html
0298デフォルトの名無しさん
2009/02/08(日) 10:12:29ありがとうございます。
解決しました。
0299デフォルトの名無しさん
2009/02/08(日) 11:17:10それにしてもマルチポストなんて今時珍しいね。
回答が付いているところにも驚いた。
0300デフォルトの名無しさん
2009/02/08(日) 13:21:49キャプチャーボードにチューナ・S端子・コンポジットがあるのですが
その切り替えはDirectShowでできるのでしょうか?
カメラで入力した映像を解析ソフトを作ってみたのですがWebカメラでは物足りなくて
手元にあったボードを使ってみたのですが初期でチューナーになってしまうので
お願いします
0301デフォルトの名無しさん
2009/02/08(日) 16:32:300302デフォルトの名無しさん
2009/02/08(日) 17:28:15つ Crossbar
0303300
2009/02/08(日) 17:55:560304デフォルトの名無しさん
2009/02/09(月) 09:54:170305デフォルトの名無しさん
2009/02/09(月) 10:42:160306デフォルトの名無しさん
2009/02/09(月) 11:58:32あ、すみません。
そこの所をもうちょっと教えてください。
どこか参考になるサイトとかもあったらお願いしまふ
0307デフォルトの名無しさん
2009/02/09(月) 12:54:371つのソースでレンダラ2つ出したいならスプリッタを使う。
別々のソースを表示したいならグラフビルダ2つ用意する。
0308デフォルトの名無しさん
2009/02/09(月) 13:45:22別の動画を再生したいからグラフを2つ作るんですね。
それで再生とかする場合はMediaControlも2つですよね?
0309デフォルトの名無しさん
2009/02/09(月) 15:24:10IMediaDet::get_StreamLength() および get_FrameRate() で得られた値を使って
非圧縮AVIファイルの総フレーム数を取得するコードを書いていますが、
あるVista環境にて総フレーム数を間違うことがあります。
(822フレームと算出してもらいたいところ、830となったりします。)
何か特殊なフィルタがインストールされているのではないかと思うのですが、
客先環境のため、簡単にチェックできません。
とりあえず不具合回避策は準備したので緊急度は低いのですが、
このようなことが起こるケースについて何かご存知の方がいらっしゃいましたら、
ご教示ください。
0310デフォルトの名無しさん
2009/02/09(月) 16:11:460311デフォルトの名無しさん
2009/02/09(月) 16:16:20ですよね。
と、言う事はやはり再生等に必要なアレは2つずつ用意しないといけないんですね。
ちなみに、同じコールバック関数を呼ぶようにした場合ってどっちの動画か見分ける術ってありますか?
0312デフォルトの名無しさん
2009/02/09(月) 16:24:04アレじゃわかんない。
コールバックって何よ。ISampleGrabberCB::SampleCBだったら
パラメータのIMediaSample で区別ができるかもしれない。
が、流す動画による。
0313デフォルトの名無しさん
2009/02/09(月) 16:27:03BufferCBを使ってるんです><
ちなみにアレとは
MediaControl、MediaEventEx、SampleGrabber、VideoWindowです。。。
0314デフォルトの名無しさん
2009/02/19(木) 17:11:04XP64ビットOSでVC2009で32ビット用でコンパイルすると正常に動画再生ができるが
64ビット用でコンパイルすると音だけでて映像が表示されないんです。
お前達のようなゴミにはわからないかもしれませんが宜しくお願いします。
0315デフォルトの名無しさん
2009/02/19(木) 17:16:530316デフォルトの名無しさん
2009/02/19(木) 17:26:030317デフォルトの名無しさん
2009/02/19(木) 17:33:450318デフォルトの名無しさん
2009/02/19(木) 17:35:460319デフォルトの名無しさん
2009/02/19(木) 23:58:51もうちょっとヒントが多ければ優秀な推理マニアが現れるかもね。
0320デフォルトの名無しさん
2009/02/20(金) 00:53:510321デフォルトの名無しさん
2009/02/20(金) 02:26:180322デフォルトの名無しさん
2009/02/20(金) 08:21:22クズ呼ばわりってどんだけおめでたいんだ・・・。
コピペ厨房の俺でさえ知ってるわ。
0323デフォルトの名無しさん
2009/02/20(金) 09:56:16その程度の知識しかないから役立たずのクズって言ってるの
だから知らないならレスするなって
0324デフォルトの名無しさん
2009/02/20(金) 10:14:37容易に気が付くだろ。知識なんかほとんどいらね。
バカじゃねーの?
0325デフォルトの名無しさん
2009/02/20(金) 10:36:150326デフォルトの名無しさん
2009/02/20(金) 11:09:56が必死になってるのか。
0327デフォルトの名無しさん
2009/02/24(火) 11:30:20ウィンドウフレーム無しの動画が画面上に表示されるのですが
これHBitmapだからそのまま変換して画像としてファイルに保存できますか?
0328デフォルトの名無しさん
2009/02/24(火) 12:05:30指定したサイズで受け取るにはどうしたらいいですか?
0329328
2009/02/24(火) 15:01:36これをVideoWindowで再生させてるウィンドウサイズと同じ大きさにしたいです
0330デフォルトの名無しさん
2009/02/24(火) 16:02:56普通はレンダーが勝手に表示サイズ合わせるだろ
0331328
2009/02/24(火) 16:08:500332デフォルトの名無しさん
2009/02/24(火) 22:55:54地デジチューナーからSI情報を取得して、中身をさわってみたいと
思いました。
DirectShowでそんなかんじのことができるのでしょうか?
(SIのパースまで、という意味ではなく、データセクションが
抜ければ十分うれしいです)
参考になるURLなどございましたらご教授の程お願いできますでしょうか?
よろしくお願いいたします。
0333デフォルトの名無しさん
2009/02/24(火) 23:33:05質問の内容を十分理解せず、脊髄反射的回答しちゃうけど、
動画のリサイズはDESでできた気がするデス。
0335デフォルトの名無しさん
2009/02/26(木) 00:27:55この辺を参考にすると良いDES。
ttp://msdn.microsoft.com/ja-jp/library/ms867700.aspx
ttp://msdn.microsoft.com/ja-jp/library/dd148668.aspx
ほとんど329しか読まずに応えてしまったけど、
・ソースそのものが変化してしまう
・再生中にサイズを変えるとかは不可能
なんで要注意。
0336デフォルトの名無しさん
2009/02/26(木) 01:13:014chの音声を同期を取りながら再生する方法を一週間ほど考えているのですが、やり方が全くわかりません。
2つのオーディオチャンネルを結合して、ステレオにするフィルタはCodeZineで見つけたので作ってみました。
ただ、これだと(当然ですが)LとRから再生されてしまうので・・・。
単純にLとL、RとRを加算して一つのステレオとして出したいのですが、どうすれば良いのでしょうか?
お知恵を貸して下さい、よろしくお願いします。
0337デフォルトの名無しさん
2009/02/26(木) 02:20:380338デフォルトの名無しさん
2009/02/26(木) 08:40:430339デフォルトの名無しさん
2009/02/26(木) 10:39:120340デフォルトの名無しさん
2009/02/26(木) 15:19:59自分でMTRつくりたいのか?w
0341デフォルトの名無しさん
2009/02/26(木) 15:27:11お前みたいなクズはレスするな。
0342デフォルトの名無しさん
2009/03/18(水) 03:08:51ミキシングしたいのかな?質問が意味不明
0343デフォルトの名無しさん
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" でリストを表示すると、見えなくなっている。
- デバッグ実行でも、コマンドラインからの実行でも症状変わらず。
この問題について、何か心当たりのある方はいらっしゃいますか?
0344デフォルトの名無しさん
2009/03/18(水) 15:17:56Vista で実行して困っているのなら
http://msdn.microsoft.com/en-us/library/ms787252.aspx
0345343
2009/03/18(水) 16:45:18ありがとうございます。
環境書いてませんでした。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 ではリストにすら
表示されませんでした。
指定すべきモニカの文字列フォーマットが変わってたりするのでしょうか・・・。
0346343
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 が出ます。
どうもお騒がせしました。
0347デフォルトの名無しさん
2009/03/18(水) 17:11:09regsvr32 "C:\WINDOWS\system32\quartz.dll"
0348デフォルトの名無しさん
2009/03/18(水) 17:11:390349デフォルトの名無しさん
2009/03/19(木) 02:31:25明日はいいことあるさ
0350デフォルトの名無しさん
2009/03/23(月) 11:02:010351デフォルトの名無しさん
2009/03/23(月) 11:53:310352デフォルトの名無しさん
2009/03/23(月) 12:24:340353デフォルトの名無しさん
2009/03/23(月) 13:13:050354デフォルトの名無しさん
2009/03/23(月) 13:17:470355デフォルトの名無しさん
2009/03/23(月) 15:05:10サンプルプログラムやWMPに比べて異常に遅いと体感できる、
もしくは実測してこうだった、などの比較はできてますか?
とりあえずエスパーで二つほど。
・インストールされているコーデック(パック)を片っ端からアンインストールする
・予め使うことが予定されているフィルタをフィルタグラフに登録しておく
あとはもう少し詳しい状況を教えてもらえれば、他にも何か言えることがあるかも。
0356デフォルトの名無しさん
2009/03/23(月) 15:23:29早くする方法があったら教えてください
0357デフォルトの名無しさん
2009/03/23(月) 15:25:570358デフォルトの名無しさん
2009/03/23(月) 17:56:43関数の内部事情なんて僕には検討もつきませんが。
っていうか、知らない人はレスしないで下さい。ウザイだけですよっと。
0359デフォルトの名無しさん
2009/03/23(月) 18:11:52お前のとこだけで遅いのに理由がわかるわけないだろう。
0360デフォルトの名無しさん
2009/03/23(月) 18:16:06ちなみにファイルサイズは4GBくらい
まあ、どうせお前らの持ってるエロ動画なんて100MB前後だろ?
0361デフォルトの名無しさん
2009/03/23(月) 18:35:090362デフォルトの名無しさん
2009/03/23(月) 18:51:500363デフォルトの名無しさん
2009/03/23(月) 19:02:34たまたまシンプルな再生プログラム書いてたのでテストしてみたよ。
6GB超のAVIファイルを RenderFile() に突っ込んで要した時間は 169[ms] でした。
はい、次の情報どうぞ。
0364デフォルトの名無しさん
2009/03/23(月) 19:05:04んー、とりあえずお前らのソースみてやるからスレに貼ってください。
0365デフォルトの名無しさん
2009/03/23(月) 19:15:01{
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;
0366デフォルトの名無しさん
2009/03/23(月) 19:16:22hr = 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;
}
}
0367デフォルトの名無しさん
2009/03/23(月) 19:17:27return S_OK;
}
>>365-367 まとめてみてください。
RenderFile()を抜けた後の tTmp の値を教えてね。
エラー処理に関するコメントは No thank you です。
0368デフォルトの名無しさん
2009/03/23(月) 19:24:45ありがとうございます。
やってることはお前いや貴様と一緒ですね
やっぱその他の環境の問題なんですかねこれ。
あ、ちなみにOSはXP64ですよですよ。
もうちょい調べてみます。わざわざありがとうございました、
0369デフォルトの名無しさん
2009/03/23(月) 22:34:07で検索
0370デフォルトの名無しさん
2009/03/24(火) 10:53:260371デフォルトの名無しさん
2009/03/24(火) 11:38:520372デフォルトの名無しさん
2009/03/24(火) 11:47:370373デフォルトの名無しさん
2009/03/24(火) 11:50:58次に2秒かかると出て
次に4GBと出て
自分のソースは出さずに人に要求して
それからOSがXP64と出た
で、>>355のレスには何も反応していない。
これで原因分かるのに間抜けだよな。
0374デフォルトの名無しさん
2009/03/24(火) 12:26:250375デフォルトの名無しさん
2009/03/24(火) 14:44:080376デフォルトの名無しさん
2009/03/24(火) 14:59:53不快だったらゴメンね。
0377デフォルトの名無しさん
2009/03/24(火) 15:05:550378デフォルトの名無しさん
2009/03/26(木) 15:17:44コールバックで画像を取るのを作っているんですが
最初の1,2フレームでコールバックが来ないときがあるのですが
何が原因ですか?
0379デフォルトの名無しさん
2009/03/27(金) 08:11:590380デフォルトの名無しさん
2009/03/28(土) 13:59:38デバッガで実行するとRenderFileの所で、「現在の場所のソースコードを表示できません」と出て止まってしまいます。
デバッガ無しで普通に実行すると問題なく再生できるんですが、原因分かる方いますか?
mp3やaviなどその他のファイルはデバッガでも問題ないです。
環境はVCEE2008、XP32SP3、DXSDK(April 2007)です。
もしかしたらソニーがリバエン対策でアンチデバッグしかけてるのかな?とか妄想したりしてます…
0381デフォルトの名無しさん
2009/03/28(土) 14:16:280382デフォルトの名無しさん
2009/03/28(土) 14:58:48デバッグビルドですか、それは考えて無かったです
しかし、ブレークした後続行をするとAVが発生してしまうのです
0383デフォルトの名無しさん
2009/03/28(土) 23:53:54デバッカで動かす時、ソースファイル(再生したいファイル)どこに置いてる?
そんな基本的ミスする奴がDirectShowいじるわけねーか。
0384デフォルトの名無しさん
2009/03/29(日) 00:12:25>mp3やaviなどその他のファイルはデバッガでも問題ないです。
なのでパスの問題ではないです
寧ろ存在しないパス渡してもエラー吐かないみたいですが
できればSS入れている方で試された方いましたら情報頂けるとありがたいです
0385デフォルトの名無しさん
2009/03/29(日) 00:40:470386デフォルトの名無しさん
2009/03/29(日) 00:45:43デバッグビルド時に有効になるASSERTか何かで引っかかってるんでは?
根本的な問題が何かはよく分からんですが・・・。
0387デフォルトの名無しさん
2009/04/01(水) 14:50:10オープンとクローズ(GraphBuilderの破棄)にだんだん時間がかかるようになってしまいます。
2回目はだいたい200ms(前のをreleaseしてopenするまでの時間)なのですが、
これを20回もすると1秒はかかるようになってしまいます。
更に繰り返すとどんどん増えていくのですが、どうしたら増えずに一定で保てますか?
0388デフォルトの名無しさん
2009/04/01(水) 18:03:39>>365-367で示したコードで m_pGraph.CoCreateInstance() から CoUninitialize() の手前までを
forループでグルグル回してみたけど、特にGraphBuilderの破棄に時間がかかるような現象は
起きませんでした。(m_pGraph, m_pControl, m_pEventはループ終端で自力Releaseすること)
・>>365-367のコードで使用されているファイルを再生するとどうなりますか?
・>>365-367のコードとそちらのコードの違いがあれば簡単に教えてください。
・もし手持ちに複数のPC環境がある場合、どこで実行しても同じ結果ですか?
0389デフォルトの名無しさん
2009/04/01(水) 18:07:43DxVA2.0だと大体メドは立ってるんですが、DxVA1.0で自由に表示位置や
タイミングをコントロールする(自前のテクスチャにデコード結果を書き出す)
方法がいま一つ分かりません。
VMR9のメソッドをこうすれ、等アドバイスをいただけないでしょうか。
0390デフォルトの名無しさん
2009/04/01(水) 18:08:04試験ありがとうございます。。。
C++Builder2007を使っていたのですが、
どうやらデバッグモードでコンパイルしてるexeだと>>387の現象になるみたいでした。
リリースモードでコンパイルしたexeでは現象は出ませんでした。
ほんとすんませんでした。
0392デフォルトの名無しさん
2009/04/03(金) 15:51:542フレーム目のSampleTimeが0になる時があります。
どういう場合に0になりますか?
0393デフォルトの名無しさん
2009/04/03(金) 18:48:560394デフォルトの名無しさん
2009/04/04(土) 10:17:530395デフォルトの名無しさん
2009/04/04(土) 16:06:23というわけでただの人向けに書いてください。
0396デフォルトの名無しさん
2009/04/04(土) 16:33:490397デフォルトの名無しさん
2009/04/04(土) 17:02:29サンプルタイムはパーサがつけることが多いから、グラフ構成は
記しておいた方が良いね。
1フレーム目は0じゃないの?
0398デフォルトの名無しさん
2009/04/05(日) 12:50:560399デフォルトの名無しさん
2009/04/05(日) 14:45:33できるんですが、バッファ上に置かれたファイルを読み込ませるにはどうしたらいいですか?
0400デフォルトの名無しさん
2009/04/05(日) 15:14:100401デフォルトの名無しさん
2009/04/05(日) 16:50:46以下MSDNから引用
RenderFile メソッドは、ファイル名からデフォルトの再生グラフを作成する。
内部的には、このメソッドは AddSourceFilter を使って適切なソース フィルタを探し、
Render を使ってグラフの残りを作成する。
引用ここまで
要するにAddSourceFilterでソースフィルタ構築してソースフィルタの出力ピンを
Renderに渡して中間フィルタや出力フィルタを構築って事だと思うんですが、
AddSourceFilterに指定できるのもファイル名のみでバッファのポインタを渡せる場所がありませんでした
0402デフォルトの名無しさん
2009/04/07(火) 14:11:590403デフォルトの名無しさん
2009/04/07(火) 15:24:480404デフォルトの名無しさん
2009/04/07(火) 17:00:090405デフォルトの名無しさん
2009/04/07(火) 17:16:340406デフォルトの名無しさん
2009/04/07(火) 17:55:260407デフォルトの名無しさん
2009/04/07(火) 17:56:150408デフォルトの名無しさん
2009/04/07(火) 18:11:000409デフォルトの名無しさん
2009/04/08(水) 00:18:18ゆとり、って奴ですか?
0410デフォルトの名無しさん
2009/04/08(水) 16:51:100411デフォルトの名無しさん
2009/04/08(水) 17:58:550412デフォルトの名無しさん
2009/04/08(水) 18:05:150413デフォルトの名無しさん
2009/04/09(木) 16:22:04RenderFileで動画読み込んでからGraphBuilderとかを破棄せずにまた
RenderFileで読み込んでもいいのか?ああん?
0414デフォルトの名無しさん
2009/04/09(木) 16:54:580415デフォルトの名無しさん
2009/04/09(木) 17:29:350416デフォルトの名無しさん
2009/04/10(金) 00:07:53大丈夫、OK、全然、ほんとだってwww
0417デフォルトの名無しさん
2009/04/10(金) 10:19:39いいよ、CPU負荷とか気にしないなら
あ、動画支援機能は1本限定、これ豆知識な
飛べない豚より
0418デフォルトの名無しさん
2009/04/10(金) 10:25:30おお、きちんとできたぜ!
これいちいちcreateやreleaseしなくていいから早くて最高だぜ!
お前達ブタって知識はないけどたまには役に立つんだんだなwww
0419デフォルトの名無しさん
2009/04/10(金) 13:45:09タスクマネージャのメモリ使用量を見てるとちゃんと開放されてないみたいで、どんどん使用量が増えているので
そこら辺が問題だとおもうのですが、以下のソースでどこがダメですか?
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( );
}
0420デフォルトの名無しさん
2009/04/10(金) 18:30:00RenderFileコール時のエラーコード値はいくつ?
0421デフォルトの名無しさん
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);
0422デフォルトの名無しさん
2009/04/21(火) 15:02:53どこでエラーが起きてるんでしょうか?
エラーコードは?
0423デフォルトの名無しさん
2009/04/22(水) 13:06:44ほとんど全くのDirectShow初心者です。
ビデオ編集ソフトを作りたいと思っています。
そこで、複数のビデオを合成するトランジションフィルターみたいなものを
作りたいのですが、Sample Grabberみたいなものを使って、それぞれ1フレームずつ
持ってきて、例えばα合成してやるみたいな方法が一般的なのでしょうか?
それとも、2つを入力を持つトランジションフィルタを作って、グラフでつないで
レンダリングして終わり?
速度的に前者は厳しいように思いますが、フィルターの形で実装しないで済む分、
作りやすいのかなと思ったり。
どういう実現方法が一般的でしょうか?
0424デフォルトの名無しさん
2009/04/22(水) 13:18:56あれこれ一からココで教えるのもナンなので、このスレでも何度か名前が挙がっている
とりあえずDES(DirectShow編集サービス)についてお勉強するとよろしいかと。
ttp://msdn.microsoft.com/ja-jp/library/dd148668.aspx
"DirectShow DES"でググるだけでもアルファブレンディングのサンプルを
公開しているサイトに行き当たりますが、まずはDirectShowを使って
多少なりともプログラムが書けるようになってからの方が理解しやすいでしょう。
0425デフォルトの名無しさん
2009/04/22(水) 13:30:26すばやいご回答、有難うございます!!
勉強します!!
0426デフォルトの名無しさん
2009/04/22(水) 14:31:50DESのサンプルを見ようと思い、色々探したんですが、
DirectShowって、今はDirectX→Platform SDK(Windows SDK)に移動してますよね?
DESのサンプルは、DirectX 9.0 Extrasのものでいいのでしょうか?
0427デフォルトの名無しさん
2009/04/22(水) 14:54:48基本的には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 ってのがでてるねえ・・・。
0428デフォルトの名無しさん
2009/04/22(水) 15:07:08VS2008ではコンパイル通らなかったです。
Windows SDKの中を探したのですが、見つからず...orz
もうちょっと探してみます。
有難うございます!!
0429デフォルトの名無しさん
2009/04/23(木) 23:55:43再生中の動画上に文字をオーバーレイする方法がわからず苦慮しています。
再生自体は下記のページと同じようなやり方で行っているのですが、
お知恵を貸してください。よろしくお願いします。
ttp://www.independence-sys.com/weblog/item/88
0430デフォルトの名無しさん
2009/04/24(金) 00:09:010431デフォルトの名無しさん
2009/04/24(金) 01:33:37サンプルのDxTextが使えそうです。
どうもありがとうございました!
0432デフォルトの名無しさん
2009/04/26(日) 04:21:26現在、ActiveMovie Windowという子ウインドウで動画が再生できるとこまで来ました。
そのウインドウがアクティブの状態でキーボードから再生や停止やらの操作をしたいと
思うのですが、キーダウンのイベントをどう設定すればいいのかわかりません。
IVideoWindowのput_MessageDrainでForm1.Handleを指定してはみたのですが
キーボード入力を転送してくれるものの、子ウインドウを移動させようとしても
親ウインドウが代わりに動いたりするので困ってしまいます。
ActiveMovie Windowに対するキーダウンイベントのやり方、
もしくはMessageDrainでキー入力だけ転送するようなやり方を
どなたかご教授ください。
0433デフォルトの名無しさん
2009/04/26(日) 06:27:36再生できないファイルの音声コーデックは
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というサンプルは画面キャプチャができるけど音声がならなかったのでその辺のソースを
上記の記述のように貼り付て偶然、音がなるようになりましたが理屈は微塵もわかりません。
0434432
2009/04/26(日) 07:02:42DirectShow.Net の Samples\Players\DxPlay で音声を
ちゃんと再生するにはどう記述すればよいのでしょうか?
自分はjavascriptくらいしかまともに触ったことがなく
C++のソースを参考にC#に直すことができません。
IntPtrって何?hrって変数は何してるの?という調子で
C#初心者の自分にはDirectShow.Netはさっぱりです。
それと、>>432の件ですがSetWindowForegroundで常に
最前面に表示させることで中途半端に自己解決しました。
0435デフォルトの名無しさん
2009/04/26(日) 22:44:00>>434
DirectShowのドキュメントと相互運用マーシャリングのドキュメントを一通り読んだほうがいいよ。
0436432
2009/04/27(月) 08:15:49ずっと構造も簡単でそうしたかったのですが
PlayWndで静止画保存ができませんでした。
DirectShow.Net以外に静止画保存の手段があれば
というか、せめてNETでまともにDirectXが扱えてれば
ド素人が苦労しなくて済むのに…
0437デフォルトの名無しさん
2009/04/27(月) 11:19:490438デフォルトの名無しさん
2009/05/15(金) 11:02:29短形を切り出してアルファ付きのtgaファイルとして保存したいのですが
どうやったら良いのでしょうか?
0439デフォルトの名無しさん
2009/05/15(金) 11:10:140440デフォルトの名無しさん
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型を使う)
0441デフォルトの名無しさん
2009/05/15(金) 14:08:47ありがとうございます
参考にしながら頑張ってみる
0442デフォルトの名無しさん
2009/05/28(木) 11:58:510443デフォルトの名無しさん
2009/05/29(金) 14:20:37IGraphBuilder::AddFilter で キャプチャデバイスと nullnull フィルタを
追加しておいてから、ICaptureGraphBuilder2::RenderStream すると
問題なく終了するのですが、nullnullフィルタを RenderStream の後に
追加して、IGraphBuilder の Disconnect と Connect で挿入すると
デバッグモード終了時に、nullnull.axに3オブジェクトがアクティブで
残っていると出ます。参照カウント管理が不正なためだと思うのですが
Disconnect と Connect でフィルタを挿入しているサンプルがどこかに
ありましたら教えてもらえませんでしょうか?
0444デフォルトの名無しさん
2009/05/29(金) 15:13:53矩形じゃねーの?
だとしてもどうして短形になったのか…
0445デフォルトの名無しさん
2009/05/29(金) 15:19:28質問と関係ないレスならしないでほしい。ウザ杉
0446443
2009/05/29(金) 18:26:57IPin::QueryPinInfo で取得した PIN_INFO の pFilter を Release していませんでした
お騒がせしました
0447デフォルトの名無しさん
2009/05/29(金) 18:31:09>>443
サンプル中をDisconnectやConnectで検索はしてみたの?
・・・と思ったら解決していた
0448デフォルトの名無しさん
2009/05/30(土) 21:58:15ISampleGrabber インターフェイスっていうのがありますが、MSDNを読みますと
(http://msdn.microsoft.com/ja-jp/library/cc369550.aspx)
ヘッダー : Qedit.h をインクルードすること。このヘッダー ファイルは、バージョン 7 以降の Microsoft® Direct3D® ヘッダーとは互換性がない。
ライブラリ : strmiids.lib を使うこと。
との記述があります。
最新のSDKでは、ISampleGrabberインターフェースは無くなってしまったのでしょうか、または互換性のある、関数が定義されていうのでしょうか?詳しい人教えてください。
0449デフォルトの名無しさん
2009/05/31(日) 03:25:58qedit.hでググるとわかるが、そのまま#includeしてもエラーがでて使えないってだけ。
詳しくは自分で調べてくれ
0450デフォルトの名無しさん
2009/05/31(日) 06:17:59ttp://social.msdn.microsoft.com/forums/en-US/windowssdk/thread/ed097d2c-3d68-4f48-8448-277eaaf68252/
こうしとけば、OKってこと?
0451デフォルトの名無しさん
2009/05/31(日) 07:21:39というか、なぜわざわざ英語を。英語得意じゃないんだから困った
MSDNか。公式フォーラムだからか。
0452デフォルトの名無しさん
2009/05/31(日) 10:03:08そうそう、公式フォーラムだったんで、俺も英語あまり良く分からないけど、参考にしました。
そして、やってみました
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のライブラリィを作っています、こんな調子で今日中にできるかな(^^;
0453デフォルトの名無しさん
2009/06/02(火) 20:18:070454デフォルトの名無しさん
2009/06/12(金) 17:08:38他の処理も行っていると動画が遅くなります。
しかし他の処理の中でDebug.Writelineで
イミディトウィンドウに文字を出し続けていると
動画が遅くならない謎の現象になっています。
これだとリリース出来ません。なにか知っている人が
いたら教えてもらえないでしょうか?
0455デフォルトの名無しさん
2009/06/12(金) 17:17:410456454
2009/06/15(月) 12:33:45別スレッドの中でWhileでDoEventsを呼び続けると
なんとかなりそうでした。まだわかりませんが。
全体の処理時間は少し遅くなりました。
0457デフォルトの名無しさん
2009/06/24(水) 13:54:47流れ的には以下の様な感じで、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の
使い方がほとんど資料が無くて困っています。
0458デフォルトの名無しさん
2009/06/25(木) 16:05:520459デフォルトの名無しさん
2009/06/26(金) 00:04:24うろ覚えで役に立つか分からんけど…
・直接RenderStreamへ接続したら駄目だったはず。(MUXが必要。)
・Timelineを生成するまでの各段階でのエラー判定で色々悩まされた記憶がある。
0460デフォルトの名無しさん
2009/06/26(金) 15:39:02ありがとうございます。
DESは資料が少なくて困りますよねー。
またよろしくです。
0461デフォルトの名無しさん
2009/07/08(水) 11:02:38ICaptureGraphBuilder2::SetOutputFileName()って、MUXを返すけど、
任意のMUXを指定したい場合は、どうするのかな?
AddFilterでMUXとSinkを設定するの?
0462デフォルトの名無しさん
2009/07/09(木) 00:58:42フィルタを生成時にモーダレスダイアログを表示するサンプルありませんか?
アプリではないため親ウィンドウが存在せず、
hWndも取れないしインスタンスハンドラも取れないもんでやり方ちょっと難しいっす。
0463デフォルトの名無しさん
2009/07/09(木) 01:12:59コンストラクタかCreateInstanceかQueryInterfaceかでモードレスダイアログを
作るなりポップアップするなりすればいいんでないの?
もしかしてプロパティページの実装の仕方を聞いてる?
0464デフォルトの名無しさん
2009/07/09(木) 01:16:47窓の作り方知っていれば特に難しい事でないけど。
0465デフォルトの名無しさん
2009/07/09(木) 01:31:07こんすとらくたでモーダレスダイアログ作りたい。
ですが、いまいちわからず…
デスクトップからハンドラ引っ張ってメッセージループ処理に飛ばそうとして失敗しました。
そこで参考サイトをみて見比べようと思った次第です
0466デフォルトの名無しさん
2009/07/09(木) 10:12:12ウインドウは作れてるけどウインドウを
うまく動かせないとかなら、
メッセージループ処理に問題があるかもしれない。
もう少し問題点を詳しく書いてみたら?
0467デフォルトの名無しさん
2009/07/09(木) 12:18:57ICaptureGraphBuilder2::RenderStream()に、MPEG2のエンコーダーを指定してます。
Muxは、最初はSetOutputFileName()で返ってきたのを使っていましたが、エラーとなったため、
MPEG2のMuxerとMPEGのFileWriterを作り、2つのピンを繋いで、そのMuxを渡していますが、
やっぱりRenderStream()でE_FAILが返ってきます。
Encoder、Muxer、FileWriterは、GraphEditで繋いで動くのは確認しています。
0468467続き
2009/07/09(木) 12:20:03ICaptureGraphBuilder2* 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); // ピン接続
(続く)
0469467続き
2009/07/09(木) 12:21:43long 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);
}
}
0470デフォルトの名無しさん
2009/07/09(木) 13:08:26DS_Compressorをフィルタグラフに登録(AddFilter)してないのは問題ないんですか?
0471デフォルトの名無しさん
2009/07/09(木) 14:23:02それです、それでした!!
とりあえずエラーなしでMPEG2ファイル書き出せました!!
自分でAddFilterしなくちゃダメなんですねー。
有難うございますーm(__)m
0472デフォルトの名無しさん
2009/07/10(金) 01:23:12DirectShowでGeekなページを参考に動画再生をするプログラムを作りました
http://www.geekpage.jp/programming/directshow/change-rate.php
参考URLでは『put_Rateの引数を2.0などに変更すると倍速再生になります。
put_Rateの引数に負の値(マイナスの値)を渡すと巻き戻し再生になります』
とありますが、
put_Rateの引数を負の値にしても大部分のフィルタは逆再生をサポートしていないため実行されません。
そこでIMediaSeekingかIMediaPositionを用いて巻き戻しをするプログラムを作りたいのですが、
どうすればよいのやら困っています。
何か良い考えはないでしょうか?
是非知恵をおかしください!
0473デフォルトの名無しさん
2009/07/10(金) 02:03:09DirectShowで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で
動画の巻き戻しをするプログラムを作りたいのですが、どうすればよいのやら困っています。
何か良い考えはないでしょうか?
是非知恵をおかしください!
0474デフォルトの名無しさん
2009/07/10(金) 02:04:060475デフォルトの名無しさん
2009/07/10(金) 04:43:47自前で逆再生をサポートしたフィルタを作成するか、
適当に逆方向にシークさせていくかぐらいしかないんじゃない?
てかマルチポスト・・・
0476デフォルトの名無しさん
2009/07/10(金) 10:41:06逆方向再生をサポートしてない限りスムーズには出来ない。
0477デフォルトの名無しさん
2009/07/10(金) 11:19:00キーワードは「MPEG」「フレーム間予測」・・・
これらを理解した上で、あなたならどのように逆方向再生を実現しますか?
たぶんMPEG系ではTIME_FORMAT_FRAMEが使えないので、
1枚ずつシークとか難しいと思います。
0478デフォルトの名無しさん
2009/07/10(金) 14:11:33使えてもかなりガックリな結果しか得られないけど。
0479デフォルトの名無しさん
2009/07/10(金) 19:57:34未だフィルタでモーダレスダイアログを表示するプログラムが出来ない
ので教えてください。
詰まっている箇所はインスタンスハンドルの取得だと思います。
コンソールアプリにて以下のソースでダイアログが表示することを確認。
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になりメッセージループ処理には飛びません
0480デフォルトの名無しさん
2009/07/11(土) 00:32:58NULLって何?アフォ?
そしてスレ違い
0481デフォルトの名無しさん
2009/07/11(土) 01:19:00反応ありがとうございます。
コーディングする前からDirectShowフィルタでの
インスタンスハンドルの取得方法を悩んでいました。
CreateDialogの3つめの引数NULLの
hWndはデスクトップを親にするために0でいいと思う。
1つめの引数はインスタンスハンドルを書けばいいのですが
何を書いたらよいかわかりません。
普通WinAPIではWinMainの引数として与えられていたり
GetWindowLong、GetModuleHandleなどで取得できます。
しかしFilterでは出来ないのです。
よかったら取得方法を教えてください。
0482デフォルトの名無しさん
2009/07/11(土) 01:23:230483デフォルトの名無しさん
2009/07/11(土) 09:27:25IDD_DIALOG1 のあるモジュールのハンドル
これがわかりません。
IDD_DIALOG1はフィルタ自身が持っています。
メッセージボックスやオープンCVの窓は表示出来る。なんでダイアログが上手くいかないんだろう
0484デフォルトの名無しさん
2009/07/11(土) 10:43:05正直フィルタにダイアログを生成させる仕様から考え直したほうがいいと思うけど
0485デフォルトの名無しさん
2009/07/11(土) 14:30:36ありがとう。確認してみます。
仕様についてはデバッグ用であり、グラフエディット上でパケットモニタしたいと考えてました。
フィルタで枠実装しておけばアプリケーションで問題あっても容易にデバッグできるから…
0486デフォルトの名無しさん
2009/07/13(月) 12:06:25ハードディスク上ではなく、メモリ上に(ごく小さい)AVIファイルを読み込んでから
再生させたいと思っているのですが、ソースフィルタには何を使えば良いでしょうか?
もしくは、IGraphBuilder::RenderFile()で直接メモリを指定する方法などは
ありますでしょうか?
0487デフォルトの名無しさん
2009/07/13(月) 12:42:37これの互換フィルタ作ればいい
0489デフォルトの名無しさん
2009/07/17(金) 15:56:39IGraphBuilder::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)のハンドル。
0490デフォルトの名無しさん
2009/07/17(金) 16:15:59試行錯誤してます。(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点です。
よろしくお願いいたします。
0491デフォルトの名無しさん
2009/07/17(金) 16:22:50普通はレンダラから、IVMRWindowlessControl や IVMRWindowlessControl9 で設定する。
0492デフォルトの名無しさん
2009/07/17(金) 23:55:12そもそもTeeを通さず直接Dumpして欠落無いか確認した?
0493490
2009/07/18(土) 00:18:46Demultiplexer/Transport Information Filterが無いとチューニングが行えない(「Microsoft統合
チューニングモデル」参照)ため、Dumpを接続するには必ずTeeが必要になります。
いったんチューニングが行われた後、Demultiplexer/Transport Information Filterを削除する
とデータ欠落が無くなるのは前記のとおり確認しています。(これが「Teeを通さず直接Dump」
と実質的に同じ状態と思われます。)
0494デフォルトの名無しさん
2009/07/18(土) 00:59:100495デフォルトの名無しさん
2009/07/19(日) 01:11:24デコードされた、PCM(5.1ch)を、PCM(2ch)*3に分割すうような
動作をするフィルターを探しています。
用途は、ステレオ*10の出力はあるけど、5.1ch出力は出来ない
オーディオカードから5.1chを吐かせたいのです
何かよいフィルタ(スプリッタ?)はごぞんじないでしょうか?
0496デフォルトの名無しさん
2009/07/19(日) 01:38:29仮にpinを3つに分岐させたとして、どうやってレンダラに繋ぐんだ?
ステレオ*10ってのがまず謎だ。
0497デフォルトの名無しさん
2009/07/19(日) 01:50:08フィルタの作り方わかる方、教えてください。
まずこれ↓をやりたいのですが・・・
input.avi -> スプリッタ -> ffdshowデコーダ -> ffdshowエンコダ ->mux ->out.avi
0498デフォルトの名無しさん
2009/07/19(日) 02:03:45フィルタの作り方、っていうのが何か勘違いされているような・・・
とりあえずGraphEdtで自分のやりたいことができてますか?
0499497
2009/07/19(日) 02:09:44GraphEditではできています。
それをプログラム上で再現したいのですが、CLSIDなど
どう設定してよいかがわかりません。
0500デフォルトの名無しさん
2009/07/19(日) 02:15:38レンダラを
ステレオ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系統ついている奴です
あと、後段でディレイをかけるので問題はないです
0501デフォルトの名無しさん
2009/07/19(日) 13:27:21既存のフィルタを組み合わせるだけならフィルタを作る必要は無い
なんにせよ大体のことは>>2あたりを見るだけで事足りる
それでもわからないことがあったらまた聞きにきな
0502497
2009/07/19(日) 14:08:05一応、ここ↓を参考にして、
ttp://geocities.yahoo.co.jp/gl/akt_trade/view/200906
このようにコーディングしてみたのですが、
CoCreateInstance(CLSID_FFDSHOW, NULL,CLSCTX_INPROC_SERVER, IID_IffDecoder, (void**)&iff);
ヘッダはどうしたらよいのか・・・・
そもそもこのコードがあっているのでしょうか?
0503デフォルトの名無しさん
2009/07/19(日) 15:11:26そのページには
>この辺は、海外のffdshowのソース?みたいなところを漁ったら出てきます。(ライセンス的にどうなのかはわかりません)
って書いてあるからどうやらヘッダはffdshowのソースからとってきてるみたい
使うならちゃんとライセンス確認してから使うこと
ただffdshowっていろんなバージョンがあったと思うけど互換性は大丈夫なのかな
0504497
2009/07/19(日) 15:36:47もう少し調べてみます。
普通、ffdshowのフィルタはプログラム上からはあまり使わない感じなんですかね?
0505デフォルトの名無しさん
2009/07/19(日) 17:52:17というよりもエンコーダ/デコーダを特定のものに固定することが少ないんじゃないかな
ffdshow固有の機能を使いたいというなら別だけどね
そうでなくて単にAVIを変換したいというだけならこことか見てみるといいかも
AVI ファイルの再圧縮
ttp://msdn.microsoft.com/ja-jp/library/cc370561.aspx
0506497
2009/07/19(日) 22:19:55考えていたのはaviファイルをリサイズ、音量操作などをしてから再圧縮保存したいと考えていたので
多機能のffdshowをプログラム上で使えれば楽かなっと思っていました。
0507デフォルトの名無しさん
2009/07/19(日) 22:37:000509デフォルトの名無しさん
2009/07/21(火) 12:46:44Thanks!
0510デフォルトの名無しさん
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() )
0511デフォルトの名無しさん
2009/07/27(月) 01:55:00テンプレート使っていないなら、参照カウンタあたりが怪しいけど。
破棄されているのに、更にReleaseしてアドレスがたまたま有効なために不正にコードが実行されてしまったケースを想定。
チェックが甘い実装だとこのケースで落ちそうな気がする。
0512510
2009/07/27(月) 02:14:56ありがとうございます。
>ソースフィルタ側のドライバの問題でない?
その可能性もあると思います。
使っているキャプチャボードがIntensityProとSAA7103-TVPCIなのですが、
IntensityProのほうはドライバがあまり安定していないという報告をよく聞きますし。
>破棄されているのに、更にReleaseして
一応、以下のようなSAFE_RELEASEマクロでそういったことが起こらないよう心がけています
SAFE_RELEASE( x ) { if( x ) { ( x )->Release(); ( x ) = NULL; } }
しかし、Releaseし忘れの恐れは残りますが・・・(慎重にチェックはしているものの(汗))
もう一つ、少し心配なのが、>>510の3番のスマートティーフィルタのフィルタグラフからの削除です。
このスマートティーはインテリジェント接続により生成されるもので、
基本的にはDirectShow側で生成、解放等の管理をしてくれていると思うのですが、
それに対してアプリ側でRemoveFilterするのは問題ないのだろうか?と・・・
しかし、>>511さんのご意見通り、ドライバの問題が有力な気がします。
もう一枚キャプボがあるので、怪しいIntensityProを外して他の2枚で切替を行うテストをして、
問題がないかを試してみようと思います。
ドライバのせいにできれば、アプリ作成者側としては気が楽になりますので期待してます(笑)
どうもありがとうございました。
0513デフォルトの名無しさん
2009/07/27(月) 03:52:510514510
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()とすればちゃんと
解放(おそらく参照カウントを必要なだけ複数下げてくれている)してくれます。
この対処をした後はブルースクリーンクラシュは起こらなくなり、安定して動いています。
とてもよい解決策を教えてくださって、ありがとうございました!
0515デフォルトの名無しさん
2009/07/28(火) 00:58:01CComPtr以外にBoostでもテンプレートがあったきがす。
最初から入っているCComPtr使うほうが楽だけどね。
0516デフォルトの名無しさん
2009/07/28(火) 01:10:540517デフォルトの名無しさん
2009/07/28(火) 02:23:30いやCComPtr::Releaseは参照カウント一つしか減らさないぞ…。ヘッダファイルにソース書いてあるから読んでみるといい。
まぁ元のプログラムで参照カウントの増減おかしかったのが正しくなったんだろう。
なんにせよCComPtrを使っておくのは正しい対処だ。
>>515
CComPtrにNULL代入するのとCComPtr::Releaseは全く同じことしかやらないような。
0518デフォルトの名無しさん
2009/07/28(火) 03:19:00NULLの代入とReleaseが同じなのはその通りだけど、
hoge.Release();は、間違えてhoge->Release();としてもコンパイルが通ってしまうから
避けるべきだと>>515は考えているのだと思う。
0519デフォルトの名無しさん
2009/07/28(火) 08:29:06CComPtrで ->AddRef と ->Release はコンパイル通らないようになってるよ。
確かVC6の頃は通ってたな。
0520510
2009/07/29(水) 01:35:32CComPtrを使う前よりは耐性(?)は増したか・・・と思うと、
再起動直後、数回のデバッグ起動でガチャン・・・
CComPtrを以ってしても敵わないとは・・・恐るべしDirectShow・・・!
>>516
具体的にはどうするのでしょうか??
Detachだと、CComPtrが対象生ポインタの所有権を棄却するだけで、
解放は施されないようですが・・・
>>517
たしかにそうでした(汗)
となると、例の参照カウント異常上昇分を抑え切れてない可能性もありますね・・・
>>519
その通りで、->Releaseのほうはコンパイラに怒られました。
一度、怪しいCOMポインタについては、CComPtrを使わず、ソフト終了寸前に、
参照カウントが0になるまでRelease()を繰り返すといった方法を試してみようと思います。
0521デフォルトの名無しさん
2009/07/29(水) 02:11:03これはやってはいけない。そもそもAddRedやReleaseの返す値は使用してはいけないルールです。
参照値なんて自分で作ったもの以外は基本的にわからんよ。
再利用すると挙動不審になるデバイスなんでね。破棄して再生成してしまえ。
実行時間が同じくらいなら安定した方法で手抜き実装。
0522デフォルトの名無しさん
2009/07/29(水) 07:27:54それに沿ったら?
0523デフォルトの名無しさん
2009/08/02(日) 19:39:32directshowの既存のフィルタでプログラムできますか?
aviの音声そのままでwavの音声も重ねたいのですが・・・
0524デフォルトの名無しさん
2009/08/02(日) 21:26:390525510
2009/08/03(月) 07:37:49ありがとうございます!
確かに怖いですねw
>実行時間が同じくらいなら安定した方法で手抜き実装。
DirectShowって、フィルタ開発とかを除けば、基本的に時間を気にしないといけないところは
少ないですし、おっしゃる通り、遠回りでも、じじぐさくても、安定するように組むのがセオリーのようですね。
>>522
ありがとうございます!
その方法でやってみました。
はじめは、それでもOS毎落ちる事態は発生していましたが、どうもセットで生成されるスマートティー
を削除するのがよくないようで、これも残すようにし、再接続の際はスマートティー(在れば)から
接続してグラフを構築するようにしたところ・・・ついにブルースクリーンが出ないようになりました!!
何度も再接続を繰り返し、それまでであればほとんど落ちていたような回数でもぜんぜん落ちる
気配がありません。
みなさん、良いご助言を下さり、ありがとうござました!!
0526デフォルトの名無しさん
2009/08/07(金) 16:14:48IVideoWindow::SetWindowPosition で、ソース画像の1/2以下の
Windowエリアに割り当てると描画しなくなります(SetWindowPosition はS_OKを返します)
その後 SetWindowPosition で再設定しても描画されず、グラフを再作成するしかないようです。
他のDVカメラでも画像の1/2以下に割り当てると同じようなことが起きますか?
Windowリサイズ時に(ソース画像の1/2+1)ピクセル以上に割り当てるようにしていますが
この1/2で他のDVカメラに通用するのかが知りたいです。
0527デフォルトの名無しさん
2009/08/07(金) 21:26:16SetOneShot( true )
でワンショットモードにしてから再生しているのですが、
いつまでたってもグラフが停止しません。
(キャプチャデバイスからのライブソースです)
ワンショットモードでは、サンプルを1枚受け取ると、グラフを停止するとmsdnにも書いています。
WaitForCompletion( INFINITE, &evCode );
を挿入し、この関数から返ってくるのを待っても、一向に返ってこず、再生が続いたままになります。
とりあえず、Sleep( 100 )として対応していますが、
このようなことをせず、ちゃんとサンプルの受信が完了したのを確認してから
サンプルを取得できるようにするにはどうすればよいでしょうか??
0528デフォルトの名無しさん
2009/08/08(土) 03:19:27入力設定を「HD 1080 PsF 24」にして、グラフ構築ができるでしょうか?
GraphEditを使ったのですが、自分の場合、どのフィルタも繋がらりません・・・
「接続に必要な中間フィルタの組み合わせが見つかりませんでした。」
のエラーメッセージが出てしまいます。
構築ができる方や、実際にPS3などからの24p出力を取り込められている方が
おられましたら、フィルタグラフの構成を教えてください。
よろしくお願いします。
0529デフォルトの名無しさん
2009/08/10(月) 00:56:04また、そのときは、インテリジェント接続で自動的に生成されたフィルタについても、
アプリ側で検索して削除すべきでしょうか?
削除しなくても問題は(一見)起こっていませんが、行儀よく終わる方法を知りたいと思いました。
0530デフォルトの名無しさん
2009/08/10(月) 01:10:00メディアサブタイプがHDYCのはずだから、Blackmagic Designe DecoderDMO挟んでみるとか
>>529
自分で追加したフィルタと、グラフを解放するだけで問題ない、はず。
0531デフォルトの名無しさん
2009/08/10(月) 11:31:03後片付けのためにRemoveFilterを使う必要はない
0533528
2009/08/11(火) 07:26:53ありがとうございます。
しかし、24fps設定ではBlackmagic Design Decoder (DMO)すら繋がりませんでした(汗)
0534デフォルトの名無しさん
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秒以上になっているようです。(カメラがコマ落ちしているようです。)
(長くなりましたので分割いたしました。次のレスに続きます。)
0535デフォルトの名無しさん
2009/08/14(金) 23:43:08音声のデータは、0.5秒おきに正しく取得できているので、問題がないようです。Stopから次のStartとの間が連続しています。
同じカメラとマイクを直接AVIMUXフィルタに繋げてAVIファイルを作成すると、きちんとしたAVIが出来上がりますので、コマ落ちなどはIMediaSample.SetTimeでちゃんとフレーム補間されるものと思っていましたが、
違うのでしょうか?
直接つなげた場合と、いったんデータを横取りした場合と、何が違うのでしょうか?
ただし、かといって、MediaSample.SetTimeをでたらめな数値にするとだめなことから、一応SampleTimeは参考にされているようですね。
一応、今回はコマ落ち分のフレームを直前のフレームで代用して、サンプルタイムを調整して姑息的に対応しようと思っています。しかし、これが正しい方法でしょうか?きちんとした使い方を知っておきたいのです。
AVIMUXの正しい使い方、同期の取り方等を教えていただける方を待望しております。
八方ふさがりで、このスレに期待しております。
よろしくお願いします。
0536デフォルトの名無しさん
2009/08/15(土) 02:00:15オーディオのタイマーとビデオで使われるタイマーが別なのはよくあること。
本来ずれないものだが、ずれる環境もある。
0537デフォルトの名無しさん
2009/08/15(土) 10:26:39早速のアドバイスありがとうございます。
サンプルの取得時の時間は、カメラやマイクが起動してからの時間なので、
AVIMUXにかけるときには、各々の頭のタイミングが0になるように各サンプルの時間を差し引いています。
具体的には、画像の取得開始が50000なら、取得したデータの各サンプルの時間を50000減じてからAVIMUXに送っています。
音声データも同じです。ただ、起動時間にずれがあるので、開始が60000とかになります。
しかし今回の問題は、開始時間がずれているのではなく、徐々にずれていくのです。
ビデオでたとえますと、音はそのまま、画像は早送り(0.05倍速くらいの微妙)です。
タイマーは同じPCにマイクとカメラを接続してますので、同じだと思います。
>>534-535で疑っているのは、
カメラでリアルタイムに取得した画像は、10fpsとしても、1秒に10枚取れるときもあれば、8枚や9枚しか取れないときもあります。
10秒で100枚ほしいところ、結局90枚しか取れなかったということが普通にあります。
それをAVIMUXに入れたときにはきっちり10fpsでレンダリングされて9秒しか動画が得られない。
取得時間はきちんとしていますが、AVIMUXであいまいに処理されているんじゃないかと、
疑っています。
0538デフォルトの名無しさん
2009/08/15(土) 11:13:17これをINTERLEAVE_CAPTUREやINTERLEAVE_FULLにしましたら、固まりました。
このモードはソースがプッシュだとだめでしょうか?
カメラやマイクなどのキャプチャフィルタはプッシュだと思うんですが。
私のAVIMUXに対する期待は、AVIMUXに1秒間に何枚送ろうが、サンプルに付けたタイムを元に、
適当に表示時間を調整してくれることです。
これが過大な期待なのかどうか、機能の正確なところが知りたいです。
よろしくおねがいします。
0539デフォルトの名無しさん
2009/08/20(木) 03:36:37具体的には、その中でもPIN情報を取得する方法です。条件としてフィルタの生成は行いません。
何か情報がありましたらお知らせください。
0540デフォルトの名無しさん
2009/08/22(土) 17:39:590541デフォルトの名無しさん
2009/08/22(土) 18:37:12CheckTransform( 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
0542デフォルトの名無しさん
2009/08/22(土) 20:07:310544デフォルトの名無しさん
2009/08/24(月) 23:26:02を作りたいんですが、うまくいきません。
なるべく速度が低下しないように、
・動画の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
0545デフォルトの名無しさん
2009/08/27(木) 01:13:50Aだろ
説明ではアップストリームを基準にトランスフォームフィルタの説明してるんじゃないかな
0547デフォルトの名無しさん
2009/08/29(土) 20:45:44.netFrameworkをインストールしないと「構成が正しくない」というようなエラーが出て立ち上がりませんでした。
Directshowプログラムを動かすには.netFrameworkのインストールが必須なのでしょうか?
それとも、Directshowとは関係ないAPIによるものでしょうか?
Ole系関数やatlcomcli.hの関数が怪しいかと思うのですが・・・
0548デフォルトの名無しさん
2009/08/29(土) 21:00:170549デフォルトの名無しさん
2009/08/29(土) 21:21:29まさか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
0550547
2009/08/30(日) 09:39:39やはりそうでしたか(汗)
>>549
>まさかCLRプロジェクトにしていないよな?
いえ、Win32プロジェクトで作成していますし、プロジェクトのプロパティでも
「共通言語ランタイムサポートを使用しない」にしています。
.netテクノロジーは噛んでいないはずですよね。
>そうでなければ、本当に必要なのは.NET FrameworkではなくVisual C++ランタイムだと思う。
URLを教えてくださってありがとうございます。
今はソフトを作り直していて、余計なAPIなどが関わっていないか注意しているので、
これが完成したら、配布テストとしてVisual C++ランタイムでちゃんと動作するか試したいと思います。
どうもありがとうございました。
0551名無しさん@そうだ選挙に行こう
2009/08/30(日) 11:53:250552名無しさん@そうだ選挙に行こう
2009/08/30(日) 12:34:19Dependency Walkerかdumpbinで、依存してるdllを洗い出してみるのが手っ取り早いと思うよ。
というか>549の言ってるように、Visual C++ランタイムが無いだけだと思うんだが…
Win32プロジェクトでも純粋にWinAPIだけで組むか、ライブラリをスタティックリンクにしない限り
ランタイムが必要になる。(Cの標準関数(printf等)ですらアウト)
0553デフォルトの名無しさん
2009/09/01(火) 18:56:041.メディアプレイヤーで動画を再生
2.ペイントでキャンバスをRGB(16,0,16)で塗りつぶす
3.ペイントをメディアプレイヤーの上に重ねると下の動画が透けて見える
XPクラシックモード&WMP11で確認
0554デフォルトの名無しさん
2009/09/01(火) 19:19:38ビデオオーバーレイを使ってるときはそうなるかもね。
0555547
2009/09/01(火) 19:36:24そうでしたか。
.netFrameworkはインストールを要求するには大掛かりで憚られるので、
避けたいと思っていましたし、よかったです。
ありがとうございます。
>>552
便利なツールを教えてくださってありがとうございます。
これで調査して適切なライブラリを洗い出します。
0556デフォルトの名無しさん
2009/09/03(木) 23:48:43コンパイラはVisualStudioか?
7月28日にATLに当たったセキュリティパッチの影響で、
dllが足りていても更正が正しくないと出ることがあるぞ。
もしそれだったら、最新版の再頒布パッケージ入れないと動かないぞ。
http://www.microsoft.com/japan/technet/security/bulletin/MS09-035.mspx
0557デフォルトの名無しさん
2009/09/04(金) 01:03:29そういうのは使えないのか?
0558デフォルトの名無しさん
2009/09/04(金) 20:28:26に
出力すると、
ttp://kissho.xii.jp/1/src/1jyou90085.png
こんなふうにおかしな映像が出力されてしまいます。
しかし、自作変換フィルタ後にAVIデコンプレッサを介してVMR7に接続すると、
正しく映像が出力されました。
AVIデコンプレッサは幅768にアラインしているのでしょうか?
その場合、それと同様のことを変換フィルタに組み込むには、
具体的にどこにどう実装すればよいのでしょうか?
よろしくお願いします。
0559デフォルトの名無しさん
2009/09/05(土) 14:04:16VMRのメディアタイプのbiWidth見れば分かるが、768とかになってるはず。
>その場合、それと同様のことを変換フィルタに組み込むには、
変換時にアライン分飛ばせばいい。
0561デフォルトの名無しさん
2009/09/06(日) 14:49:43なかなか良い書籍やサイトが見つからないのですが、みなさんはどうやって勉強しているのでしょうか?
0562デフォルトの名無しさん
2009/09/06(日) 15:09:36SDKのサンプルとドキュメント1択。
0563デフォルトの名無しさん
2009/09/09(水) 12:44:39このとき無圧縮だったり、そのほかのコーデックで圧縮したりするようにするにはどうすればいいんだ?
どのフィルタの部分でそのコードを書く?のだね 初心者だから教えてみてみ
0564デフォルトの名無しさん
2009/09/09(水) 13:37:02VFW使え。それが一番簡単。
0565デフォルトの名無しさん
2009/09/10(木) 02:21:14VFWはファイルサイズ2G以下の壁が…
正直grapheditのが簡単な希ガス。
0566デフォルトの名無しさん
2009/09/10(木) 02:32:510567デフォルトの名無しさん
2009/09/10(木) 16:53:30H264のaviファイルの各コマ画像を連続で取り出すことって
簡単に出来るのでしょうか・・・
対応コーデック(フィルタ?)を入れれば再生は簡単に出来そうですが、、
0568デフォルトの名無しさん
2009/09/10(木) 18:36:400569デフォルトの名無しさん
2009/09/10(木) 18:54:40余裕
>>568
フィルタ作れ
0570デフォルトの名無しさん
2009/09/13(日) 22:09:06EZRGB24っていうサンプルが参考になるよ
0571デフォルトの名無しさん
2009/09/16(水) 03:11:58輝度でばっさり二値化するのでいいのか?
色で判断して二値化するほうがいいの?
閾値はどうする?プロパティページで変更出来るようにしたい?
スライス方式って上下限の閾値ってのもあるぞ
お好みを指定してくれ。
後、ソースはやらん
0572デフォルトの名無しさん
2009/09/17(木) 02:03:11適応的二値化でお願いします
cvAdaptiveThreshold()を呼び出すだけより格段に速いやつを
0573デフォルトの名無しさん
2009/09/17(木) 09:11:36それはまんどくさ
0574デフォルトの名無しさん
2009/09/18(金) 22:24:21まんま使うとかはダメなのか?
仕事として受けるなら設計書とソース提出するよ
0575デフォルトの名無しさん
2009/09/19(土) 17:35:55ありがとうございました
0576デフォルトの名無しさん
2009/09/22(火) 14:06:10Microsoft SDKs\Windows\v6.1\Samples\multimedia\directshow\baseclasses
にある Streams.h をインクルードしたら
IReferenceClockTimerControl が定義されてないと出ました。
これはどういった対処をすれば良いのでしょうか?
0577デフォルトの名無しさん
2009/09/22(火) 14:10:050578デフォルトの名無しさん
2009/09/22(火) 16:46:07俺が昔そうだったから保障するw
0579デフォルトの名無しさん
2009/09/22(火) 23:12:02ヘッダー全部もってこい。
もしくはちゃんとパスを通せばおk
0580デフォルトの名無しさん
2009/09/28(月) 21:56:54MicrosoftSDKや、DirectX SDKと、VC++のヘッダファイルで同名のがあるから
インクルードの順番も注意しろ。
0581デフォルトの名無しさん
2009/10/09(金) 14:15:28マークが上と下(Y1とY0)に2つ表示されてしまいます
これを上1つ(Y1)だけ表示されるのにはどうしたらいいですか?
0582デフォルトの名無しさん
2009/10/09(金) 14:16:09誤爆してしまいました
0583デフォルトの名無しさん
2009/10/11(日) 07:36:37調べてみるとPCによってはちゃんと表示されるものもある(カメラのドライバーは同じ物を使用)
USBコントローラの数が関係してるのかと思うんだけどわからない。
ここには解説出来るような人いる?
0584デフォルトの名無しさん
2009/10/11(日) 07:47:510585デフォルトの名無しさん
2009/10/11(日) 13:33:390586デフォルトの名無しさん
2009/10/11(日) 14:14:540587デフォルトの名無しさん
2009/10/11(日) 14:30:020588デフォルトの名無しさん
2009/10/12(月) 21:08:27>>587
態度を改めます。私程度の力ではわからないため
お願いします教えてください。
【質問】
同機種のカメラ複数台接続してGrapheditで1個しか表示されない
カメラドライバの問題でなく「PC側によって」使えるものと
使えないものがあるが、何が違うのかわかりません。
【現在わかっている事】
ノートPCの一部ではUSBコントローラが複数あり
別々のUSBポートにつないでいれば同機種のWebカメラでも
利用可能。
また、ググると下記の記述があり私が試してみた感じ同じ考えです。
・同じ型番でもドライバが対応していれば大丈夫
・同じメーカーでも型番が違えば大丈夫
・片方のカメラにUSBハブを挟めば大丈夫
・メーカーが違えば大丈夫
http://blogs.yahoo.co.jp/honebuto_honebuto/28960469.html
よろしくお願いします。
0589デフォルトの名無しさん
2009/10/16(金) 21:17:21よくあるパターンだがDirectShowに限らず初心者はその「基本的なこと」が何なのかすら判らないことが多い
で、ググってもそういう事が書いてあるページがなかなか見つからない罠。結果挫折する・・・
0590デフォルトの名無しさん
2009/10/17(土) 01:48:31入力1080と720などの切り替えをしたいのですが、
DirectShow では IAMStreamConfig を使ってできましたが、
WindowMediaEncoderSDK いわゆるWMEncoderLib.dll系を使って
できないでしょうか?
0591誰か助けて。
2009/10/18(日) 21:37:48mpeg2をビットマップにすることは出来ましたが、
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でした。
0592誰か助けて。
2009/10/18(日) 21:40:53this->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);
0593デフォルトの名無しさん
2009/10/18(日) 22:53:11解決してないけど解決しました。
どうもよくわかりませんが、そのムービーファイルの数フレームだけ、
GetCurrentBuffer()でVFW_E_WRONG_STATEが返ってくるようです。
しょうもないので、GetCurrentBuffer()でエラーが返ってきても無視すると
うまく行くようになりました。こんなんでええんだろうか・・・
0594デフォルトの名無しさん
2009/10/18(日) 23:13:12>Webカメラで撮影して保存したファイルでは失敗します。
このファイルがどんなファイルなのか、作っているGraphがどうなっているのか、等が分からないと、答える事は難しい。
よく分からないんだったら、IVMRWindowlessControl::GetCurrentImageあたりを使ったほうが無難だと思う。
0595デフォルトの名無しさん
2009/10/21(水) 18:01:21自動的にストリーミング再生される、ということでいいのでしょうか?
DirectSound等での再生は自分でストリーミング再生用のプログラムを書く必要があったので、そうならかなり有り難いのですが
0596デフォルトの名無しさん
2009/10/21(水) 19:03:510597デフォルトの名無しさん
2009/10/21(水) 21:47:06ソースフィルタを自作しなければならない
ローレベルなことをやろうとすると途端に厄介なことになるのが
DirectShowの世界
0598デフォルトの名無しさん
2009/10/21(水) 22:16:22どうもありがとうございました
0599デフォルトの名無しさん
2009/10/21(水) 23:31:38明示的にやりたいなら、自分でピンを繋げるコードを書く必要がある。
0600デフォルトの名無しさん
2009/10/22(木) 03:21:57それは質問者の意図している部分とはちょっと違う気がする。
まあ、RenderFile()では思うようにできないことが分かったときに、
>>599の意味が分かるのかもしれないけどね。
0601デフォルトの名無しさん
2009/11/30(月) 18:54:12OSDをしたくて一時停止の画像をミキシングしたあとポーズをすると、
osd.pause()
mctrl.pause()
一時停止の画像が表示されたりされなかったりします。
それは非同期で動いているからとわかるのですが、
やっぱりこれは1フレーム待つしかないのでしょうか。
0602デフォルトの名無しさん
2009/12/08(火) 00:52:26WMVでライブ配信したいのですが、いい資料とかサンプルソースとかありませんか??
0603デフォルトの名無しさん
2009/12/15(火) 21:28:59JMエンコーダーで使えるHDサイズのyuv画像って
ネットにないでしょうか?・・・
自作するしかない?・・・
0604デフォルトの名無しさん
2009/12/16(水) 11:17:13H.264のエレメンタリストリームでよければ適当な.mp4ファイルを
デマルチプレクスすればいいんでないかな?
「JMデコーダーで使える」って要件が今ひとつ分からんけど。
少なくとも「HDサイズのyuv画像」は転がってないんじゃないかな。
ファイルサイズ考えたら・・・
0605デフォルトの名無しさん
2009/12/16(水) 19:58:26H264の1920*1080サイズの動画を
コマ落ちなしで再生できるんですか?
0606sage
2009/12/18(金) 13:59:14#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を書き換えなくていいように上記の方法をとったのに、構文エラー。
どういうことなの…
0607デフォルトの名無しさん
2009/12/18(金) 14:50:410608606
2009/12/18(金) 19:40:280609デフォルトの名無しさん
2009/12/19(土) 20:53:09ISpecifyPropertyPages でとってきて、
OleCreatePropertyFrame で、プロパティページを表示して、
変更すれば、できるんですが、毎回やるのは面倒。
プログラムでできませでしょうか?
具体的やりたいのは、Sony MPEG Decoderをノンインタレースにしたいのです。
#最初からノンインタレースをデフォルトにしとけばいいのに。ソニーさん。
0610デフォルトの名無しさん
2009/12/21(月) 03:37:160611デフォルトの名無しさん
2010/01/26(火) 11:46:36ひどい遅レスですまんが標準画像じゃダメなの?
エンコーダーやデコーダー作ってる人とかDTV板のエンコオタは大抵これ使ってるけど
http://media.xiph.org/video/derf/
0612デフォルトの名無しさん
2010/01/31(日) 21:30:27なお、通信部分に関してはフィルタグラフの外で実装しています。
フィルタの流れとしては、
送信部分は キャプチャ → エンコーダ → 自作レンダラ
受信部分は 自作ソース → デコーダ → レンダラ
という流れにしようと考えています。
送信部分の自作レンダラはエンコーダから受け取ったデータを
ソケットに渡すように実装できたのですが、
受信部分の自作ソースフィルタをデコーダに接続する部分がうまくいきません。
具体的にはwma通信の、
自作フィルタ → WMAudio Decoder DMO → レンダラ
の自作ソースからデコーダへの接続で「共通するメディアの種類が無い」と言われてしまいます。
出力ピンのメディアタイプもメジャータイプをMEDIATYPE_Audio
マイナータイプをWMMEDIASUBTYPE_WMAudioV8 としています。
push、pullの両方を実装して試してみたのですが、どこが悪いのかわからなくなってしまいました。
ご教授お願いします。
0613デフォルトの名無しさん
2010/02/01(月) 10:18:13Decoderが要求するMediaTypeとか取得できたような気がする。
しばらくDirectShowから遠ざかっているので違ったらスマン。
0614デフォルトの名無しさん
2010/02/01(月) 13:46:230615612
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型でいいのでしょうか?
0616デフォルトの名無しさん
2010/02/01(月) 17:58:54メジャーサブの値は、モジュールをロードせずにフィルタ構築のヒントに使われるもの。
列挙で返すメディアタイプはきっちり値を設定していないと、「メディアがないぞゴルァ」エラーが出たような。
ビデオでそんな経験をしたことがある。
0617612
2010/02/01(月) 18:14:22>>616
書き忘れていましたが、フォーマットに関してもWAVEFORMATEXの型で周波数等すべての
データを設定しています。
GraphEdit上で自作フィルタの出力ピンのプロパティを見ると、
ASF Readerでwmaファイルを指定した場合の出力ピンとと同様になっています。
WMAudio Decoder V8との接続ではメディアタイプ以外のネゴシエイト等も行っているのでしょうか?
0618デフォルトの名無しさん
2010/02/01(月) 21:39:51必要なインターフェイスがないと繋がらないケースもある。
0619612
2010/02/01(月) 23:47:39>>618
なるほど、インターフェイスに関しては考えていませんでした。調査してみます。
調べ方としてはCUnknown::NonDelegatingQueryInterfaceをオーバーライドして、
引数や返り値を見る方法を考えているのですが、それでいいのでしょうか?
また、もっと簡単な方法等ありましたらご教授お願いします。
0620612
2010/02/02(火) 22:54:42問い合せられて失敗していたのは
IAMOpenProgress
IAMDeviceRemoval
IAMFilterMiscFlags の3つでした。
特に問題になっているのは3つ目のIAMFilterMiscFlagsのような気がするので
インターフェイスを実装して接続を試してみます。
0621612
2010/02/03(水) 18:36:40上の書き込みの通り、問い合わされたインターフェイスを実装し、接続を試してみましたが、
「共通のメディアの種類が無い」と言われて失敗。
CheckMediaTypeでは、formattypeの中身まで完全に一致してS_OKを返しています。(なぜか何回も)
ソースフィルタはCSourceを、出力ピンはCSourceStreamをそれぞれ継承した形で作成していますが、
この構成ではWMAudio Decoder DMOに接続することはできないのでしょうか・・・
本来ならば、上記のデコーダはWM ASF Readerと繋がるもので、
WM ASF Readerはファイルからの読み込みとデマルチプレクサの機能を備えた上でプッシュモデルでデータを流しています。
実装したいもの自体は
「ネットワーク越しに飛んできたWMAデータをバッファから読み出して下流のデコーダへと流す」という単純な仕組みのものなのに、
作るのはこんなにも難しいのかと愕然としています。
解決方法等ご存知の方が居りましたら、ぜひご教授ください。
0622デフォルトの名無しさん
2010/02/03(水) 21:12:48理論上、透過的な自作フィルタを作れば上手くいくと思うが、やはり何かが足りないのだろう。
フィルタとピンそれぞれインターフェイスが必要だし、ドキュメントが間違っていることも時々あるので地道に調べよう。
0623質問です
2010/02/14(日) 23:44:40AM_MEDIA_TYPE として取得した{73646976-0000-0010-8000-00AA00389B71}のようなGUIDから、
"MEDIATYPE_AnalogVideo"のような文字列を引く方法ってありますか?
VC++2008です。
0624デフォルトの名無しさん
2010/02/15(月) 00:28:200625デフォルトの名無しさん
2010/02/15(月) 00:48:59Baseclasses\wxdebug.cppが参考になるよ。DisplayTypeメソッドの中で
GuidNames[pmtIn->majortype]
のような形で文字列を得ている。
GuidNames 自体は同ファイル内に実装されているマクロ。
そいつをパクって自分のソースに持ってくればいいんじゃねーの?
ただしuuids.hに記載されているタイプに限る。
実際に動かしてないから保証できないけど参考になれば。
0626質問です
2010/02/17(水) 13:48:13Microsoft DirectX SDK (February 2010)をインストールしていますが、
wxdebug.cppファイルがありません。
しかもBaseclassesフォルダもありません。
なぜでしょうか?OSはwin7です
0627デフォルトの名無しさん
2010/02/17(水) 14:53:230628デフォルトの名無しさん
2010/02/17(水) 15:08:57Microsoft DirectX SDK (February 2010)のドキュメントのトップ頁に書いてある
0629質問です
2010/02/17(水) 21:36:34どうもありがとうございます^^)
0630デフォルトの名無しさん
2010/02/23(火) 11:43:17#include "afxwin.h"をやらないで、DllEntryPointもDllMainも自作関数ならOKっぽい。
いくつかテストで作ってみたが、登録もGraphEdtへの追加がうまく行っても、
GraphをRunさせると、staticなメンバが異常で落ちるなどなど。
DirectShowのFilter作るのにMFCは使えないのかな?
0631デフォルトの名無しさん
2010/02/23(火) 13:22:150632デフォルトの名無しさん
2010/02/26(金) 12:45:170633デフォルトの名無しさん
2010/03/05(金) 08:19:06動画プレイヤーみたいなのを作ってて
イコライザみたいなことをしたいんだけど
音声データってこれで取り出せるの?
0634デフォルトの名無しさん
2010/03/05(金) 23:38:02映像用の高速なサンプルグラバ書いたけど
DX8.1時代のものだが欲しい人いるかな?
0635デフォルトの名無しさん
2010/03/05(金) 23:45:110636デフォルトの名無しさん
2010/03/05(金) 23:55:07デフォルトのと違って処理時間に関係なく
再生しながらコマ送りせずに全コマ取得可能
0637デフォルトの名無しさん
2010/03/06(土) 00:07:53サンプルグラバって、コールバック受けて処理するんじゃなかったっけ?
0638デフォルトの名無しさん
2010/03/06(土) 00:25:31こっちは正確にはサンプルグラバの子クラスじゃなくて
ビデオレンダラの子クラスと補助的な関数で構成してある
要るなら個人情報削除してからソースをアップするよ
0639デフォルトの名無しさん
2010/03/06(土) 03:24:04DirectShowでmp3とかmidiとかoggの波形データを取得する
プログラムを作ろうと思ってるんだけど、それの参考になりそうだから欲しい
0640デフォルトの名無しさん
2010/03/06(土) 14:48:30ttp://www1.axfc.net/uploader/File/so/39920.zip
0641デフォルトの名無しさん
2010/03/06(土) 20:38:36あんがと、頂きました。
休日だからと12時間も寝てしまった・・・時間損した気分
0642デフォルトの名無しさん
2010/03/06(土) 20:51:00CCaptureRenderer::DoRenderSampleとCVideoFile::TryGetFrameがかなり汚いコードですみません
ここがDShowの厄介な部分で試行錯誤の結果なので
mp3のデコード結果ならCCaptureRendererのようにCRenderer系のオーバーロードすれば作れるはず
0643デフォルトの名無しさん
2010/03/06(土) 21:46:100644デフォルトの名無しさん
2010/03/06(土) 22:01:19グラバはコールバックでロックできない
グラバはコマ送りにしないと勝手に再生位置が進むから連続で取れない
グラバはコマ送りにすると連続でいけるがものすごく遅い
もしこれらが解決されてるなら>>634は神
0645デフォルトの名無しさん
2010/03/06(土) 23:50:48ISampleGrabber::SetCallback
ttp://msdn.microsoft.com/ja-jp/library/cc369545.aspx
「データ処理スレッドは、コールバック メソッドから戻るまで動作を停止する」
って書いてあるが。>644のいうロックって、同じことなんじゃないの?
0646デフォルトの名無しさん
2010/03/07(日) 00:07:10だが出来なかったんだ
具体的には残り再生時間が1分だとすると
コールバック開始から1分以内に処理しないとコールバックのスレッドが終了する
だから最後のほうのフレームが取れない
しかもフレーム単位のシークが糞
0647デフォルトの名無しさん
2010/03/07(日) 10:01:200648デフォルトの名無しさん
2010/03/08(月) 06:52:48メディアタイプをメインMEDIATYPE_Audio、サブMEDIATYPE_PCM、にして
mp3ファイルを指定してレンダリングすると
ソースフィルタ → MPEG1スプリッタ → ffdshowデコーダ → サンプルグラバ → レンダラ
になるのに
NULLレンダラも追加して同じことすると
ソースフィルタ → MPEG1スプリッタ → サンプルグラバ → NULLレンダラ
ってなるのはなんでなんだぜ?
ソースフィルタ → MPEG1スプリッタ → ffdshowデコーダ → サンプルグラバ → NULLレンダラ
ってなると思ったんだが
0649デフォルトの名無しさん
2010/03/08(月) 12:54:46NULLレンダラはなんでも繋がる。
0650デフォルトの名無しさん
2010/03/08(月) 17:34:39なんかおかしくね?
0651デフォルトの名無しさん
2010/03/08(月) 19:03:28試してみた。俺は ソースフィルタ → MPEG1スプリッタ → NULLレンダラ だったぞ。
0652デフォルトの名無しさん
2010/03/08(月) 19:35:22WaitForFreeとSelectPixelQualityって何に使うん?
上の削除して適当に書いたらコンパイル通った
多分元のコード?から削除し忘れたんだろうけど
0653デフォルトの名無しさん
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の環境によるんだろうけど・・・
もそっとインテリジェント接続の仕組み調べないとだな・・・
0654デフォルトの名無しさん
2010/03/08(月) 23:21:390655デフォルトの名無しさん
2010/03/08(月) 23:35:27もちろん使ってるよ、グラフエディット
でもメディアタイプ変更できないから、完全な再現ができないんよ
俺が知らないだけで、実はできたりする?
0656デフォルトの名無しさん
2010/03/08(月) 23:40:030657634
2010/03/08(月) 23:48:48ついでに説明も更新した
ttp://www1.axfc.net/uploader/File/so/40088.zip
0658デフォルトの名無しさん
2010/03/09(火) 01:19:29それ知らなかった・・・できたんだそんなこと・・・
という訳でやってみたら
ソースフィルタ → MPEG1スプリッタ → NULLレンダラ (サンプルグラバは接続されず)
となってました。
疑問は全て解けました。ありがとう。
インテリジェント接続を使う場合にNULLレンダラ使いたいなら
NULLレンダラをグラフに追加してない状態でRenderしてから追加→再接続しかないのかな
0659デフォルトの名無しさん
2010/03/09(火) 01:24:320660デフォルトの名無しさん
2010/03/09(火) 01:30:40こんな時間にわざわざありがとう
これ使ってちょっとサンプルグラバとの比較ベンチマーク作ってみるよ
>>658
CRendererの派生クラス作ってNULLレンダラもどき作ればいいかも
そうすれば接続を限定してインテリジェント出来ると思う
0661660
2010/03/09(火) 23:31:35簡単な比較ベンチ書いたよ
結論は
無圧縮AVIは同じくらい速い
DivXは数割速い
wmvやflv、mpg、mp4は数倍速い
h264のmp4は速いけどtsはかえって遅い
もしかしたら使い方間違ってるかも…
コードは↓
ttp://hypersugiyama.hp.infoseek.co.jp/uploader/cgi-bin/file/test.zip
0662デフォルトの名無しさん
2010/03/10(水) 02:36:58コードざっと斜め読みしただけだけど、サンプルグラバの方は、
データがディスクキャッシュ上にのってたりしない?
データのサイズが書かれていないので、はっきりしたことは言えないけど、
>無圧縮AVIは同じくらい速い
とか
>wmvやflv、mpg、mp4は数倍速い
とか
>tsはかえって遅い
とか、へんじゃないかな?
後、出力先が32ビット固定になってるけどデータは他のフォーマットで、
フォーマット変換が発生しているとかもありうる。
そういう意味では、BitBltしなくてもいいんじゃない?>計測
0663デフォルトの名無しさん
2010/03/10(水) 03:16:18その「へん」なのがDirect Showなのだよワトソン君
ビルドして確かめればいいのでは?
キャッシュ?二回実行すれば?
コードもらったからもう寝るよ
0664デフォルトの名無しさん
2010/03/10(水) 12:22:01>wmvやflv、mpg、mp4は数倍速い
ニコニコから落としたmp4読ませたら31fpsに対して213fpsとか吹いたw
酷い場合は6対173とかになるし
いくらなんでもサンプルグラバが遅すぎるから使い方間違えてるんだと思う
FFdshowのせいかもしれんがErrorが1とか2ぐらい出るファイルが多い
あとコード汚すぎ
cppインクルードしすぎ
0665デフォルトの名無しさん
2010/03/10(水) 19:49:36じゃあ正しいサンプルグラバの使い方って何?
0666デフォルトの名無しさん
2010/03/10(水) 23:07:23コンバートが挟まってるだけなんじゃないの?>バラバラな結果
0667デフォルトの名無しさん
2010/03/14(日) 00:07:37どうすればDirectXのサーフェスに直接出力できますか?
テクスチャのアドレスを与えると何故か部分的に透明化したり色が化けるようです。
CVideoFile::GetFrameはDLLに実装して、
ゲーム本体にはDirectShowのヘッダーは入らないようにしました。
0668デフォルトの名無しさん
2010/03/14(日) 00:35:000669デフォルトの名無しさん
2010/03/14(日) 01:09:15ありがとうございます。
その点は自己解決しました。
しかし、いろが入れ替わっているような現象と、
画像が前のフレームと重なって切れたようになってテクスチャの描画がうまくいきません。
0670デフォルトの名無しさん
2010/03/14(日) 01:23:40ARGBじゃなくてABGRでした。
あと、スレッドは1つにしないといけないようです。
0671デフォルトの名無しさん
2010/03/24(水) 17:02:19CLSID_WMASFWriterを使用してAVI→WMVに変換しようとしています。
元動画のビデオサイズ/ビットレート/オーディオ情報等を維持して変換
したいのですがデフォルト設定だとW320×H240/225Kbpsになってしまいます。
ProFile設定を行う事でビデオサイズの変更等が出来る事はわかったのですが
元動画からカスタムProFileに必要な情報を取得する方法がわからないので
参考になる日本語サイト、無ければ英語サイト等ありましたら教えて下さい。
考え方が間違えていたらご指摘ください。よろしくお願いします。
開発環境は VisualC++2008、Platform SDK 2003 SP1、DirectX SDK August 2009 です 。
0672デフォルトの名無しさん
2010/03/24(水) 17:11:19ProFileの設定はIID_IConfigAsfWriterとIWMStreamConfigを使用して
ビデオサイズ等を登録してConfigureFilterUsingProfileで変更しています。
0673デフォルトの名無しさん
2010/03/26(金) 16:05:09ttp://www.usagi-goten.com/jp/AVI_structure.html
0674デフォルトの名無しさん
2010/03/29(月) 08:54:15他にもありましたらご指摘をお願いします。
0675デフォルトの名無しさん
2010/04/09(金) 13:19:400676デフォルトの名無しさん
2010/04/21(水) 22:41:34AVIファイルに出力する処理を考えています。
過去ログを見て、CSourceStream::FillBufferを独自フィルタで書き換えるというのがあり、
試してみたのですが上手くいきません。
サンプルを見ながら以下のことはできました。
BouncingBallサンプル(CSourceStream)→圧縮フィルタ→AVI Mux→FileWriter→AVIファイル
ただ、このBouncingBallサンプルは、FillBufferメソッド内部において描画処理を
行っており、ここに外部から画像データをコピーすることができません。
やりたいことは以下の通りです。
メモリ上の画像データ配列→ソースフィルタ→圧縮フィルタ→AVI Mux→FileWriter→AVIファイル
(これを任意のタイミングで行う)
VFWを使えば簡単なのですが、このAVIにWAVを合成する必要があるのでVFWではできません。
(できないよね?)
ちなみに画像データ配列のもとは専用キャプチャボードからの入力なので、
入力自体はDirectShowでは取得できません。
一体どうすれば良いのでしょう?
0677デフォルトの名無しさん
2010/04/21(水) 23:08:43普通にプッシュ型のソースフィルタを作るだけだろ。
あとvfwでも音も入れられる。
>一体どうすれば良いのでしょう?
きちんとドキュメントとソースコード読め。
0678676
2010/04/22(木) 07:28:39ご回答ありがとうございます。
>普通にプッシュ型のソースフィルタを作るだけ
外部からのデータをどのようにソースフィルタへ渡すかが分からない
のです。画像データのポインタを渡すだけとか、何か簡易な方法
でできないか考えていましたが、分かりませんでした。
>現在のデータをキューなり、リストなり好きなもので受け渡す
プロセス間通信を使うわけですね。これならデータを渡せそうですね。
>vfwでも音も入れられる
そうなんですね。勉強不足でした。ありがとうございます。
「普通にプッシュ型のソースフィルタを作る」ことに関して、
どのようにデータを渡すかを、もう少し詳しく教えていただけると
助かります。
0679デフォルトの名無しさん
2010/04/22(木) 10:03:49ballサンプルよりもpushsourceの方がわかりやすいんじゃないかな
(ビットマップを展開して送り出している)
フィルタからデータをポインタなどで渡したいなら、Interfaceを自作してみてはどうか。
0680デフォルトの名無しさん
2010/04/22(木) 12:54:35DirectShow以前の、初歩的な話なんだよな〜
0681676
2010/04/22(木) 22:20:05お返事ありがとうございます。
ballサンプルを使っているのは、検索した時にBouncingBallのFillBuffer()を
改造すべし、とのちょっとした記述があったため、試しに使ってみました。
後、開発環境が古いっていうのもありますが。
Pushsourceのサンプルを見るためにWindowsSDKをインストール中です。
>>680
お返事ありがとうございます。
何というか、結局DirectShowはデフォルトでメモリ上の画像データを
AVIに吐き出す機能は備えていないということなんですね?
VFWだと逆にストリームなどの概念がないため、メモリ上の画像データを
1コマずつAVIとして出力するので簡単なのですけど。
なぜDirectShowにはそのような機能がないのか不思議に思います。
0682676
2010/04/22(木) 22:31:21失礼、PlatformSDKですね。
0683デフォルトの名無しさん
2010/04/22(木) 23:52:12だからソース読めって言ってるだろw
機能がないとかじゃなくて、お前が全くDirectShowの使い方を知らないだけ。
>>677 で既に実装方法書いてるだろ。
0684デフォルトの名無しさん
2010/04/23(金) 05:05:57読むとソースコードできるんじゃないんですか?
0685676
2010/04/27(火) 22:09:35初心者で申し訳ないです。
ソースフィルタにプロセス間通信でデータを渡すことのできる機能
を実装する、ということですよね?
今はその方向で検討中です。
0686デフォルトの名無しさん
2010/04/30(金) 08:31:33USBカメラのフィルタのプロパティページを表示し
設定しています。この設定値、毎回初期化されて困っています。
IID_IAMCameraControl、IID_IAMVideoProcAmpインターフェースで
カメラ設定タブ、ビデオ設定タブはプロパティページを介さず設定できたのですが
USBカメラ固有のプロパティを設定するインタフェースはどうればよいのか教えてください。
目的は、フィルタのプロパティページでカメラ固有のプロパティが
保存したいというものでそのような方法あればどのような形でも
結構ですのでお願いします。
0687デフォルトの名無しさん
2010/04/30(金) 11:05:57OLE/COM Object Viewerでどんなインタフェースを持っているのか調べてみたら?
0688デフォルトの名無しさん
2010/05/09(日) 12:49:05ttp://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);
ができません。
上手な手はないでしょうか?よろしくお願いします。
0689デフォルトの名無しさん
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);
ができません。
上手な手はないでしょうか?よろしくお願いします。
0690デフォルトの名無しさん
2010/05/09(日) 13:07:250691デフォルトの名無しさん
2010/05/09(日) 21:43:442つに出力を分配するフィルタって、標準でありましたっけ?
0692686
2010/05/11(火) 13:53:34OLE/COM Object Viewerをつかって
いろいろためしてみたのですが、USBカメラのインタフェースまでたどりつけませんでした
毎回、毎回シャッタースピードを設定するのがめんどうで
どうにかして保存したいのですが、いまだ方法みつからず
0694デフォルトの名無しさん
2010/06/14(月) 17:24:50C#のスレッドで質問してスレ違いと指摘もらいましたので、こちらに転載します。
USBカメラからの静止画だけをキャプチャしたいのですが、どのようにしたらよいのでしょうか。
動画をキャプチャすることを前提に静止画をキャプチャするサンプルはいくつかあったのですが、
これだと動画をキャプチャしている間はなぜかKeyDownイベントがフォームで受け取れず、KeyDown
で一度ブレークポイントをはって止めると、そのあとはKeyDownが効くようになってしまいました。
どのみち動画は不要なので、静止画だけをキャプチャする方法が知りたいです。
よろしくお願いします。
0695デフォルトの名無しさん
2010/06/14(月) 17:48:31http://pitecan.com/~tsuka/programming/usbcamera.html
DirectShow.NETが新しくなってるから多少書きかえる必要はあるけど。
0696デフォルトの名無しさん
2010/06/14(月) 18:11:21ありがとうございます。
ただ、そのサンプルだと動画も表示していないと静止画がキャプチャーできないようです。
動画無しにはできないでしょうか。
0697デフォルトの名無しさん
2010/06/14(月) 18:12:33http://msdn.microsoft.com/ja-jp/library/cc369762.aspx
俺もひっかかったクチだわ
0698デフォルトの名無しさん
2010/06/14(月) 18:14:20プレビューしなけりゃいいこと。
0699デフォルトの名無しさん
2010/06/14(月) 18:29:52理由は多くのWebカメラ対応しようとしてこの辺を自前で実装しようとするとめんどくさいからなんだけどね。
AVI DecompressorとColor Space Convetorが基本で、あとはMJPEGやMPGやOverlayMixerとか使うな
時間かけても良くて、速度にこだわるのならFOURCCから色空間判読して自前実装も止めやしないけどね
誰か色空間の相互変換Transform Filter作ってくれないかなー
探したけどffdshow raw video filterぐらいしか見つからなかったわ
0700デフォルトの名無しさん
2010/06/14(月) 19:07:15便乗質問させて下さい。
MessageDrain に WM_WHEEL を流す方法はないものでしょうか…。
ビデオレンダラを再実装でもしない限りやっぱり無理でしょうか。
0701デフォルトの名無しさん
2010/06/14(月) 20:13:16自分の場合はMessageDrainするWndではなくて、ParentWndがWM_WHEELを受け取る設計にしてる
どうしてもそれが無理ならGlobalHook使えばいいと思うよ
0702デフォルトの名無しさん
2010/06/14(月) 20:23:020703デフォルトの名無しさん
2010/06/15(火) 13:14:18ありがとうございます。
> ParentWndがWM_WHEELを受け取る設計
こんなことが可能なのですか…。メッセージの流れ方を勉強して出直してきます。orz
0704デフォルトの名無しさん
2010/06/17(木) 17:17:36今、VMR9を使って、二つの動画のミキシング再生を行うソフトを作っています。
IVMRMixerControl9でそれぞれの動画の位置を変えたりできるので
ミキシングモードで動画を読ませるまでは行けたようなのですが、
それぞれの動画用のIMediaControlやIMediaSeekingが取れないので、うまく
動画の再生開始やシーク位置調整ができません。
どうしたら、どうすればそれぞれの動画用のIMediaControlやIMediaSeekingを
生成できますでしょうか?
それとも根本的に間違っているのでしょうか?
ヒントだけでも教えてもらえたら助かります。よろしくお願いします。
0705デフォルトの名無しさん
2010/06/17(木) 22:37:580706704
2010/06/18(金) 02:34:37レスありがとうございます。
ですが、その方法では動画を二つ読ませるミキシングモードではうまく
いかなくて困っています。
(前略)
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の動画の位置を個別にコントロールできるので、何らかの方法で
この状態の二つの動画の片方づつへと再生開始等のコマンドが送れるはずだと
思うのですが、まだ見つけることができません。
よろしくお願いします。
0707デフォルトの名無しさん
2010/06/18(金) 03:00:370708デフォルトの名無しさん
2010/06/18(金) 14:04:47VMRのグラフへ同時に入れれるようにしないと無理なんじゃないかね。
0709デフォルトの名無しさん
2010/06/18(金) 16:33:11VisualC++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文字セットでビルド通すにはどうすればよいでしょうか?
0710デフォルトの名無しさん
2010/06/18(金) 21:12:500711デフォルトの名無しさん
2010/06/18(金) 21:45:500713デフォルトの名無しさん
2010/06/27(日) 16:46:59既存のフィルタを継承させてclass定義みたいなことって出来るんですかね?
結局CBaseFilterを継承させて内部でその既存のフィルタ呼び出してみたいなことをしないといけないのかな?
COMよく分からない。。。
0714デフォルトの名無しさん
2010/06/27(日) 22:54:10自作フィルタ内にてDirectShowをアプリケーション利用するって方式を想像してるかもしれませんが、Wrapperは相当難しいと思う
おそらく、一番楽そうなのはDLL Hackの方法かな
0715デフォルトの名無しさん
2010/09/12(日) 12:01:45DirectShowでnVIDIAの3D Vision対応動画を表示させることになったが、
IRリミッターの制御やらなんやらがさっぱりわからん。
#この点はスレ違いですまん
NVAPIあたりを触ればいいというところまでは解ったけども、
本当に表示できるのかどうかがわからなくなってきた。
とりあえず、このコードでサンプル3D映像を表示できる、というものが
どこかにないかい?
0716デフォルトの名無しさん
2010/09/12(日) 12:48:300717デフォルトの名無しさん
2010/09/12(日) 12:58:500718デフォルトの名無しさん
2010/09/17(金) 18:11:40長文で申し訳ありません。
m2tsファイルをレンダーして、そのファイルの時間幅を
IMediaSeekingのGetDurationを使用して取得しています。
自分のPCでは問題なく取得できているのですが、特定のPCで取得できません。
違いがあるとすれば
私のPC:WindowsXP SP2
ダメなPC:WindowsXP SP3(もしくはWindows7)
です。
WindowsXP SP2以前のPCでは大丈夫のようです。
XPがSP2からSP3に変わることで何かDLLなりが更新されたのでしょうか?
コーデック等全て同じ条件でインストールしているつもりです。
(勿論SP3特有のコーデックがあるのは知ってますが)
動いてたSP2をSP3にUpdateすると動かなくなります。
ちなみにフィルタの構築も自分で全部指定していますしレンダーもオートレンダーではなく、自分で全て構築しています。
フィルターの構築・ピンの接続等でエラーが発生しないのはデバッグモードでも確認済みで、レンダーは正しく完了しています。
後出しですみません。
動画の再生自体はSP2でもSP3でも問題なく出来ます。
再生してる途中でGetCurrentPositionやGetPositionsを実行すると正しいカレント位置が返ってきますが
GetDurationが失敗して正しい値が取れません。
(エラーコードが0x80004001が返ってきます)
もう一つSetPositionsを実行するとエラーになります。
(エラーコードが0x80004001が返ってきます)
最初から最後まで再生して、最後の位置でGetPositionsを実行すれば動画ファイルの時間幅は取得できるのですが
再生前にGetDurationなどで時間幅情報を取得するのにエラーが返ってくるという状況です。
(IMediaSeekingはGraphBulderからQueryInterfaceで取得してます。)
0719デフォルトの名無しさん
2010/09/17(金) 19:25:180720デフォルトの名無しさん
2010/09/17(金) 22:36:02USBカメラの調整をOleCreatePropertyFrameでできると思いますが、これと
同じ調整を値を指定してソフトから設定してやることはできるでしょうか。
(たとえば明るさを50にする等)
よろしくお願いします。
0721デフォルトの名無しさん
2010/09/18(土) 01:27:56MPEG2-TSのファイルだったらMPEG2デマルチプレクサフィルタの仕様によるんじゃないか
>>720
IAMVideoControl
IAMVideoProcAmp
IAMCameraControl
あたりじゃないかな
0722デフォルトの名無しさん
2010/09/21(火) 13:21:59のサンプルをVS2008ではビルド&実行できたのですが、VS2005でDshow.hが見つからない
エラーするのですが、Platform SDKや、DirectX SDK をインストールする必要が
ありますか?
0723デフォルトの名無しさん
2010/09/23(木) 13:02:500724デフォルトの名無しさん
2010/09/28(火) 15:59:311>main.obj : error LNK2001: 外部シンボル "_IID_IBaseFilter" は未解決です。
1>main.obj : error LNK2001: 外部シンボル "_CLSID_VideoInputDeviceCategory" は未解決です。
1>main.obj : error LNK2001: 外部シンボル "_CLSID_SystemDeviceEnum" は未解決です。
1>main.obj : error LNK2001: 外部シンボル "_IID_ICreateDevEnum" は未解決です。
1>main.obj : error LNK2001: 外部シンボル "_IID_IMediaControl" は未解決です。
1>main.obj : error LNK2001: 外部シンボル "_CLSID_CaptureGraphBuilder2" は未解決です。
1>main.obj : error LNK2001: 外部シンボル "_IID_ICaptureGraphBuilder2" は未解決です。
1>main.obj : error LNK2001: 外部シンボル "_CLSID_FilterGraph" は未解決です。
1>main.obj : error LNK2001: 外部シンボル "_IID_IGraphBuilder" は未解決です。
は何が悪いんでしょうか?
VS2005です
0725デフォルトの名無しさん
2010/09/28(火) 16:18:06これをググってから出直せ。
0726デフォルトの名無しさん
2010/09/28(火) 16:19:340727デフォルトの名無しさん
2010/09/28(火) 16:41:220728デフォルトの名無しさん
2010/09/28(火) 18:30:470729デフォルトの名無しさん
2010/09/29(水) 00:57:010730デフォルトの名無しさん
2010/09/29(水) 03:27:510731デフォルトの名無しさん
2010/09/29(水) 12:11:390732デフォルトの名無しさん
2010/09/29(水) 13:15:070733デフォルトの名無しさん
2010/09/29(水) 16:41:26誰にも説明できないだろ。
悟れよ。
0734デフォルトの名無しさん
2010/09/30(木) 11:52:55小学生までだよねー(AAry
0735デフォルトの名無しさん
2010/09/30(木) 15:14:45ダイレクトに答えを示せよ。だからDirect Showだろ。
0736デフォルトの名無しさん
2010/09/30(木) 15:24:25DXVAが出る前なんかはDirectShowにDirect感が全くしなかったし、むしろDXVA主流の今こそDirectXに入るべきだろう。
逆にDirectSoundはカーネルミキサーを越えられないならDirectXから外れていいよ。
0737デフォルトの名無しさん
2010/09/30(木) 16:20:590738デフォルトの名無しさん
2010/09/30(木) 21:55:540739デフォルトの名無しさん
2010/09/30(木) 23:40:170740デフォルトの名無しさん
2010/10/02(土) 09:34:50DirectShowのヘルプのファーストステップガイドに書いてある。
0741デフォルトの名無しさん
2010/10/21(木) 23:49:59スライスヘッダからビット状態で続くんでしたっけ?・・・・
スライスヘッダの参照IDだけ変えたいんですがビット数がかわってずれるのを
どこまでずらせばいいのかわかんねorz
0742デフォルトの名無しさん
2010/10/23(土) 00:31:340743デフォルトの名無しさん
2010/10/25(月) 21:28:28RenderFileで読み込んだファイルの種類を判別するにはどうすればいいですか?
ユーザーが音楽以外の動画や画像ファイルを読み込もうとした場合に弾きたいのです
0744デフォルトの名無しさん
2010/10/25(月) 23:42:080745デフォルトの名無しさん
2010/10/28(木) 02:43:22NullRendererをグラフに追加してからグラフを作成してみたりしましたが、ファイルにより音声が破棄されたり
動画が破棄されたりまちまちで困ってます。
入力されるファイルの形式が予測できないのでインテリジェント接続を使いたいのですが・・・
0746デフォルトの名無しさん
2010/10/28(木) 03:08:470747デフォルトの名無しさん
2010/10/28(木) 04:03:07ありがとうございます
0748デフォルトの名無しさん
2010/10/28(木) 10:47:07ファイル名のエクステンションをチェック
>>745
グラフを構築した後、ビデオレンダラーをNullRendererに置き換える
ビデオレンダラーのウィンドウハンドルをNULLにする手もあったかな、ちょっと自信がないが…
0750デフォルトの名無しさん
2010/10/29(金) 01:06:340751デフォルトの名無しさん
2010/10/29(金) 06:59:38ムダなフィルタは一切はいらんじゃろ。
その辺はGraphEditとかで操作してイメージ掴んでからコードに落としてみなされ
0753デフォルトの名無しさん
2010/11/15(月) 12:08:550754デフォルトの名無しさん
2010/11/22(月) 13:37:20とか考える場合wmvにするしかないのですか?
0755デフォルトの名無しさん
2010/11/23(火) 19:52:11どういう流れで作ればいいの?
教えてエロい人
0756デフォルトの名無しさん
2010/11/24(水) 00:07:570757デフォルトの名無しさん
2010/11/24(水) 00:11:100758デフォルトの名無しさん
2010/11/24(水) 02:25:29カメラのようなデバイスを扱うものは、OSがラップしてDirectShowとして使えるようになっていた気がする。
ドライバ作るよりは、フィルタで作ったほうが簡単だろう。
てか、それを自力で調べられないなら作るのは厳しいと思われる。
0759デフォルトの名無しさん
2010/11/28(日) 01:02:08フィルター作るの大変すぎ
0760デフォルトの名無しさん
2010/11/28(日) 01:05:530761デフォルトの名無しさん
2010/11/28(日) 02:20:11スレ違いだけどヒントだけ
透明ウィンドウを作って文字を書く
他のものに重ねたいならさらにレイヤードィンドウ
0762デフォルトの名無しさん
2010/11/28(日) 02:20:530763デフォルトの名無しさん
2010/11/28(日) 09:56:04ありがとうございます。
でもなんかできないです。
DirectXの画面はこう言うのできないんじゃないですか?
0764デフォルトの名無しさん
2010/11/28(日) 10:21:41レイヤードウィンドウで解決できるものもあれば、ゲーム画面のサーフェスに書かなきゃならない場合もある
しかしすべてDirectShowの範囲じゃない。スレ違いなんだから素直に消えてくれ
以後レスあってもスルーする
スレ違失礼
0765デフォルトの名無しさん
2010/11/28(日) 10:33:01文字列を書くことです。ゲームではないです。
0766デフォルトの名無しさん
2010/11/28(日) 13:13:090767デフォルトの名無しさん
2010/11/28(日) 13:18:08環境依存が激しいみたいです
なんかハードの設定によって使えないとかあるみたいです><
0768デフォルトの名無しさん
2010/11/28(日) 13:22:09VMRならDirectXに対応しないものは全部とか。
嫌なら自分でフィルター書け。
0769デフォルトの名無しさん
2010/11/28(日) 14:11:360770デフォルトの名無しさん
2010/11/28(日) 22:33:59ありがとう。それも調べてみるね。
0771デフォルトの名無しさん
2010/11/30(火) 11:35:49FlashMediaLiveEncoder(以下、FME)で読み込めるDirectShowFilterを作成中です。
テンプレート、フィルター、ピン情報を修正して、GraphEditのVideo Capture Sourcesに登録する事はできました。
私が作ったFilterが、FMEのDeviceリストに表示されているのですが、選択すると、
Problem with video capture device.
Please verify that the video capture device is working correctly and is not
already in use.
と警告が出てしまいます。
FMEのEncodingLogには、
Tue Nov 30 2010 11:29:16 : Selected video input device: PrjNikoFilter
Tue Nov 30 2010 11:29:17 : Error : Could not find the selected video device
Tue Nov 30 2010 11:29:17 : Error : Could not find the selected video device
Tue Nov 30 2010 11:29:17 : Problem with video capture device. Please verify that the video capture device is working correctly and is not already in use.
と出力されていました。
VS2008で追ってみたところ、コンストラクタが呼ばれた直後にデストラクタの呼び出しが行われていました。
(逆アセンブリまで行ってしまったので、呼び出し履歴やステップ実行で追えませんでした)
どうやったら正常にFMEに認識させる事ができるのでしょうか?
同じ症状の解決方法をご存じの方いましたら、お願いします。
0772デフォルトの名無しさん
2010/11/30(火) 12:34:410773デフォルトの名無しさん
2010/11/30(火) 12:49:34あと動作確認するならSkepeでの動作も見ないとな。使用者が多いのでこれで正常動作しないと運用に困ることになる。
0774デフォルトの名無しさん
2010/11/30(火) 15:40:02http://alax.info/blog/1138
0776デフォルトの名無しさん
2010/12/04(土) 16:58:24regsvrex32でレジストリに登録しようとするとエントリポイントが見つからないって言われて...
エントリポイントって
extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
return DllEntryPoint((HINSTANCE)(hModule), dwReason, lpReserved);
}
じゃダメなの?
0777デフォルトの名無しさん
2010/12/04(土) 18:26:59DllGetClassObject
DllRegisterServer
DllUnregisterServer
があるかどうかじゃね?普通に作れば実装されていると思うが・・・
0778デフォルトの名無しさん
2010/12/04(土) 22:55:470779デフォルトの名無しさん
2010/12/14(火) 01:19:580780デフォルトの名無しさん
2010/12/14(火) 01:24:10ユーザーが動かしてないとき・・・タイマーで再生位置取得→スライダーの位置更新
ユーザーが動かしているとき・・・スライダーの位置を元に再生位置変更
0781デフォルトの名無しさん
2010/12/14(火) 01:25:01再生位置を取得/設定するのはIMediaSeekingでも使えばいいんじゃない?
0782デフォルトの名無しさん
2010/12/14(火) 03:32:20ありがとうございます、頑張ってみます
0783デフォルトの名無しさん
2010/12/14(火) 16:00:520784デフォルトの名無しさん
2010/12/14(火) 16:03:58DirectShow & Windows7 で mpeg2 のファイルを再生
(最終的には各フレームの画を抜き出)してみたいと思っています。
・WMP では問題なく再生できます。
・GraphEdit にファイルを入れると「このムービーのストリームには、
サポートされていない形式のものがあります。」とエラー?が表示され、
音声のみのグラフが形成されます。複数の mpeg2 ファイルで同様です。
・avi ファイルなどは問題なく動画と音声を再生することができます。
・Microsoft DTV-DVD Video Decoder を自分で挿入してその後ろに
Video Renderer や Sample Grabber などをつなげようとしても
「接続に必要な中間フィルターの組み合わせがみつかりませんでした」と
エラーが表示されます。
・プログラムで IMediaControl::RenderFile を使用して mpeg2 のファイルを
設定しようとすると 0x00040242 のエラーコードが返ってきます。
環境は Windows7 で、OS をインストールした後に VisualStudio2008 を入れ、
WMP のセットアップを走らせただけの状態です。
GraphEdit は SDK などをインストールしないで実行ファイルのみを
コピーしました。念のため GraphStudio でも同じことをしてみましたが、
エラーメッセージが表示されないだけで結果は同じでした。
1. Microsoft DTV-DVD Video Decoder の Video Output1 ピンに先の
Video Renderer や Sample Grabber を繋げるにはどのようにすればよいのでしょうか。
2. IMediaControl::RenderFile の戻り値 0x00040242 の意味を知りたく、
ヘッダファイルを検索してみたのですが見当たりませんでした。VS の
エラールックアップのようなものはないでしょうか。
ご教示いただければ幸いです。
0785デフォルトの名無しさん
2010/12/14(火) 18:50:21FORMAT_VIDEOINFOを要求するフィルタには接続できないんだろう。
0786デフォルトの名無しさん
2010/12/14(火) 20:21:470787デフォルトの名無しさん
2010/12/14(火) 23:12:55んじゃプルのDemuxもあるのか?
0788デフォルトの名無しさん
2010/12/14(火) 23:28:04WMPでは再生できるけど。
0789784
2010/12/15(水) 09:41:55やっぱりそうですよね。
このまま使うならお勉強して対応するピンをもったフィルタを作らないといけないのか。。。
※無理っぽい
VFW_S_PARTIAL_RENDER なんて定義があったのですね。
勉強不足でした。
0790デフォルトの名無しさん
2010/12/15(水) 12:53:510791784
2010/12/15(水) 16:43:12てきとうなサンプル見つけて動かして、改造して‥‥
ピンが接続されていないので、操作は続行できません。0x80040209
ってなんだー、と頭を抱えてるところ。w
0792デフォルトの名無しさん
2010/12/15(水) 16:54:560793デフォルトの名無しさん
2010/12/15(水) 16:55:21このページを参考にシークバーを作成してみたのですが、FLVファイルをシークしようとするとエラーが出て止まってしまいます。
HEAP[tes.exe]: HEAP: Free Heap block 8365fe0 modified at 8388f50 after it was freed
Windows によって tes.exe でブレークポイントが発生しました。
ヒープが壊れていることが原因として考えられます。tes.exe または読み込まれた DLL にバグがあります。
あるいは、tes.exe がフォーカスを持っているときに、ユーザーが F12 キーを押したことが原因として考えられます。
可能であれば、出力ウィンドウに詳細な診断情報が表示されます。
FLVファイルはYouTubeからダウンロードしたもので、
スプリッタにはFLVSplitter.axがデコードにはffdshowが使われています。
他のmp4やwmvなどでは問題なかったのですが、どなたか原因を知りませんでしょうか?
0794デフォルトの名無しさん
2010/12/15(水) 17:44:04IMediaSeeking::SetTimeFormatでタイムフォーマットをTIME_FORMAT_MEDIA_TIMEにすると
IMediaSeeking::GetDuration()で100 ns単位の値が返ってくるので秒に換算したらよかろう
100 ns
=100*10^(-9) s
=10^(-7) s
1 s
=10^7 * 100 ns
0795デフォルトの名無しさん
2010/12/15(水) 17:58:34thx
なんででるんだろう。。。
0796デフォルトの名無しさん
2010/12/15(水) 18:16:110797デフォルトの名無しさん
2010/12/17(金) 18:34:23ことってできませんか?
0798デフォルトの名無しさん
2010/12/17(金) 18:43:080799デフォルトの名無しさん
2010/12/17(金) 23:57:22わかったんですが、どれが映像のフィルタでどれを削除すれば
いいんでしょうか?
0800デフォルトの名無しさん
2010/12/18(土) 00:18:42ダミーのビデオレンダラを生成してそれを後で削除って方法や色々やりようがあると思うけど。
0801デフォルトの名無しさん
2010/12/21(火) 01:18:50IMediaControl::Stop()
IMediaSeeking::SetPositions(0, AM_SEEKING_AbsolutePositioning, duration, AM_SEEKING_AbsolutePositioning)
IMediaControl::Play()
考えられる原因はなんでしょうか?ご教授お願いします。
0802デフォルトの名無しさん
2010/12/21(火) 21:02:15プライマリーバッファがクリアされないためにノイズが出る不具合が
知られているが、それか?
対策は、停止した時[再生する前]に無音データを0.2秒ほど再生する
0803デフォルトの名無しさん
2010/12/21(火) 21:08:08に変更
0804デフォルトの名無しさん
2010/12/21(火) 22:08:48試してみます。
0805デフォルトの名無しさん
2010/12/28(火) 11:04:351. 自作でフィルタを作ろうと思います。
このフィルタの入力形式(ピンの設定)に優先順位を指定することは可能でしょうか。
たとえばサブタイプを、RGB32 > YUY2 の優先順位にして、フィルタの組み合わが
存在するのであれば IMediaControl::RenderFile() などによるグラフの自動生成の際に
RGB32 を入力としたグラフを生成させることは出来ますか。
今の環境ではレンダラフィルタを作成する場合に CBaseRenderer::CheckMediaType をオーバーライドして
RGB32 でも YUY2 でもどちらも接続を許してしまうと YUY2 で接続されてしまいますが、
RGB32 の方が処理が楽なので、出来ればそちらで繋いでほしいのです。
2. フィルタ内の処理の高速化について。
素人考えでは、画素数の大きな動画ファイルの形式変換などを行なう場合、
画素ごとに処理をベタで行なうとかなりの時間が掛かるように思います。
それ自体はミリ秒単位ですむので人間の感覚としては大したことはないのですが、
普通の動画の秒辺りのフレーム数などを考えると処理が間に合わなくなりコマ落ちしそうです。
それでも出回っているフィルタでは、複雑そうなことをしているものでもコマ落ちなどはしていないと思います。
ベタな処理の高速化というと、処理をマルチスレッド化して、たとえば処理するフレーム画を
数分割して別個のスレッドに平行して処理させるなどの方法くらいしか思いつかないのですが、
このあたりはどのように考えるべきなのでしょうか。
以上、ご教示ください。
0806デフォルトの名無しさん
2010/12/28(火) 11:28:490807デフォルトの名無しさん
2010/12/28(火) 14:23:471. できるけど、相手側にも都合があるよ
2. そこが腕の見せ所
0808805
2010/12/28(火) 20:37:46>>806
Direct Memory Access のことでしょうか。
ハードでやってるいるのなら参考には出来ないですね。。。
>>807
いくつかの種類の動画を特定のフォーマットに変換するプログラムを作成したく、
動画の中の各フレーム画を抜き取るために DirectShow を使えないかと考えています。
それで、対応する(元の)動画の中に個性的なフィルタを使用しなければならないものがあって、
それに対応しつつ、他のフィルタにも同じように使用できるフィルタを作りたいな、と。
後ろに動画の情報を流してあげる必要がないので、いまのところはレンダラフィルタを想定しています。
1. やるとしたら、どのような方法になるのでしょうか。
2. この類の経験がなく、方向性に悩んでいます。
もしご存じでしたら、方法論のヒントだけでもいただけないでしょうか。
0809デフォルトの名無しさん
2010/12/28(火) 22:25:47そういう用途なら素直にTransformフィルタベースでいいと思うよ。
後ろにはNULLレンダラを繋げておけば良い。
動画変換と同時にリアルタイムプレビューするのでなければコマ落ちの心配はいらん。
0811デフォルトの名無しさん
2010/12/30(木) 06:56:21自分が過去にやったネタ
(1) サンプルグラバを使う
(2) サンプルにあるDumpフィルタをカスタムして使う
敷居が低いのは前者だけど、
いろいろ細かいことがやりたいなら後者がオススメ。
Nullレンダラも不要。
もちろん代償もあるけど、
Transformフィルタベースで作ったって大変だし。
0812デフォルトの名無しさん
2010/12/31(金) 12:33:03おい525、ここも荒らす気か?
0813デフォルトの名無しさん
2010/12/31(金) 21:22:18http://hibari.2ch.net/test/read.cgi/avi/1291483163/
0815デフォルトの名無しさん
2011/01/04(火) 23:01:29avi以外の形式でビデオキャプチャすれば可能な気がするのですが方法がわかりません。。
0816デフォルトの名無しさん
2011/01/05(水) 01:42:480817815
2011/01/05(水) 07:50:47はい。
0818デフォルトの名無しさん
2011/01/05(水) 10:38:150819デフォルトの名無しさん
2011/01/05(水) 13:09:290820815
2011/01/05(水) 16:22:35他のデータと同期をとるためにミリ秒レベルでわかれば嬉しいんですが、、、
0821デフォルトの名無しさん
2011/01/05(水) 17:00:120822デフォルトの名無しさん
2011/01/05(水) 17:51:550823デフォルトの名無しさん
2011/01/05(水) 18:14:18いつから待機する仕様になったんだ?
0824デフォルトの名無しさん
2011/01/06(木) 08:45:40フィルタ挟み込んで調べる以外に方法はないだろうな。
茨の道だとは思うが。
0825デフォルトの名無しさん
2011/01/06(木) 21:04:22IGraphBuilder::RenderFile(FILENAME, NULL) でオート接続した場合に選択されるデコーダフィルタのCLSIDを
取得するにはどのようにすれば良いのでしょうか?
やりたいことは
SourceFilter->DecoderFilter->SmartTee Filter->PreView側:RenderFilter
->Capture側:SampleGraber
と手動で接続することです。
DecoderFilterのCLSIDが取得できれば CoCreateInstanceでフィルタを作成して
IGraphBuilder::AddFilter()でフィルタを追加した後に手動で接続することができるのですが、
CLSID が取得できないため手詰まりとなっております。
ヒント等で結構ですのでご教授願います。
0826デフォルトの名無しさん
2011/01/07(金) 00:49:200827デフォルトの名無しさん
2011/01/07(金) 00:51:48VMR9のレンダーレスモードを使ってコールバックされる
タイミングをチェックするのが最適かと。
ただ、その場合描画も自前でやる必要があるけど、
精度にこだわるならそれくらいしてもいいでしょ。
0828デフォルトの名無しさん
2011/01/07(金) 00:51:580829デフォルトの名無しさん
2011/01/07(金) 00:55:37AddToRot→GraphEditは便利だよね
0830815
2011/01/07(金) 07:42:45描画を自前で用意することも考慮にいれてもう少し模索してみたいと思います。
0831825
2011/01/07(金) 18:50:24ですが私の言葉足らずで質問の意図が伝わっていなかったため再度質問させて下さい。
あらかじめファイルフォーマットがわかっている場合にはグラフエディタを用いてデコーダフィルタのCLSIDを取得する方法でも可能ですが、
任意のファイルフォーマットで下記グラフフィルタを構成するための方法がわからず困っています。
SourceFilter->DecoderFilter->SmartTee Filter->PreView側:RenderFilter
->Capture側:SampleGraber
SmartTeeフィルタをグラフに挿入後にPreviewピンとCaptureピンをRenderFilterとSampleGraberに接続する方法だと
それぞれにデコーダフィルタが挿入される構成になり、処理に無駄が生じてしまっています。
SourceFilter->SmartTee Filter->PreView側:->DecoderFilter->RenderFilter
->Capture側:->DecoderFilter->SampleGraber
どのようなアプローチがよろしいのでしょうか?
アドバイスをお願いいたします。
0832デフォルトの名無しさん
2011/01/07(金) 18:57:04一旦自動で繋いだ後にフィルタを列挙し、
レンダラの直前にSmartTeeを挿入する
0833831
2011/01/07(金) 22:10:44アドバイスありがとうございます。
なるほど、その手がありましたか。
�@IGraphBuilder::RenderFile でフィルタグラフを生成
�AIGraphBuilder::EnumFilters でフィルタを列挙
�Bフィルタピンを列挙してそれがレンダフィルタピンに接続しているかを判定していき、レンダフィルタの前のフィルタを特定
�C特定したフィルタとレンダフィルタの間にスマートフィルタを接続
という方法でいけそうですね。
うまくいきましたらご報告します。 ありがとうございました。
0835825
2011/01/09(日) 00:03:59たびたびのアドバイスありがとうございます。
ようやく�@〜�Cのやり方で所望の動作を実現できました。
と思ったら、832さんがもっと簡単な方法をアドバイスしてくれていたんですねw
ですがせっかくのアドバイスを理解できないため、もしよろしければもう少しアドバイスください。
レンダラは自分でAddFilterしています。
レンダラの直前のフィルタを特定するために�A〜�Bを実行したのですが、もっと簡単な方法があるのでしょうか?
0836832
2011/01/09(日) 08:03:39レンダラの入力ピンのConectedToで接続元のフィルタの出力ピン、
そこからそのフィルタ、って分かるんじゃなかったかな、
と思ったんですが、今手元にPCがないので
自信ないすorz
0837デフォルトの名無しさん
2011/01/09(日) 19:10:470838825
2011/01/09(日) 23:52:21たびたびのありがとうございます。
教えて頂いた方法でうまくいきました!。
�@レンダラフィルタの入力Pinから IPin::ConnectedTo() で接続先のピンインタフェースをを取得
�A取得したIPinからIPin::QueryPinInfo で接続フィルタを特定することが可能!
おかげでコードもずいぶんすっきりしました。
この度はいろいろとありがとうございました。
0839デフォルトの名無しさん
2011/01/14(金) 09:41:14一部を切り取ったり、拡大縮小してPictureboxに
表示したいのですがそんなことは可能ですか?
0840デフォルトの名無しさん
2011/01/14(金) 13:35:130841デフォルトの名無しさん
2011/01/14(金) 14:48:53ヒントをもらえませんか?
ドキュメント読んでSampleGrabberを使用して
キャプチャ出来るところまでは出来たのですが
一部切り出しなど加工方法がわからないのです。
0842デフォルトの名無しさん
2011/01/14(金) 14:54:000843デフォルトの名無しさん
2011/01/18(火) 11:05:25この状態で、最後のフレームを識別する確実な方法はないでしょうか。
以下のようなことをしてみました。
・ IMediaEventEx::SetNotifyWindow でイベント通知を受ける
-> 非同期のためソースフィルタが最後のフレームを処理したタイミングで通知が来てしまい、
サンプルグラバはまだ途中のフレームを取得しているらしい
・ IMediaSeeking::GetDuration と ISampleGrabber::GetConnectedMediaType で取得した
再生時間とビデオヘッダ中のフレームあたりの時間からフレーム数を計算して、
それとサンプルグラバで受け取ったフレーム数を比較して判定する
-> 計算結果が微妙に異なることがある
ネットで調べた限り、フレーム数そのものを受け取る方法は見つけられませんでした。
ほかには、ふたつめの方法と「その後しばらくデータを受信しなければ最後だった」との判定を
組み合わせるくらいしか思いつきません。
確実な方法があれば教えていただけませんか?
0844デフォルトの名無しさん
2011/01/18(火) 13:16:280845デフォルトの名無しさん
2011/01/18(火) 13:45:58GetDuration と同じ結果になっても当方は一切関知しない
0846843
2011/01/19(水) 13:46:37ありがとうございます。
>>844
再生が停止するまでというのは、IMediaEventEx::SetNotifyWindow による通知のことでしょうか。
それとも他のイベント検知よる判定でしょうか。
基本、非同期で扱っているので、これまでに調べた方法によればあまりあてにはできませんでした。
>>845
試してみます。w
0847デフォルトの名無しさん
2011/01/19(水) 14:07:510848デフォルトの名無しさん
2011/01/21(金) 21:58:580849デフォルトの名無しさん
2011/01/23(日) 20:43:03仮想カメラデバイスってどうやったら作れますか?
既存ウェブカメラやデスクトップのスクリーンキャプチャを入力として、
エフェクトを加えて、Ustream配信とかしたいんですが。
オープンソース、フリーでやるつもりなので
GPLなコードとか紹介してくださるだけでもOKです。
0850デフォルトの名無しさん
2011/01/23(日) 21:21:170851デフォルトの名無しさん
2011/01/23(日) 21:24:56このへん具体的に知りたいんですが。。。
0852デフォルトの名無しさん
2011/01/23(日) 21:50:260853デフォルトの名無しさん
2011/01/23(日) 22:32:55基礎をちゃんと学べ
0854デフォルトの名無しさん
2011/01/25(火) 13:38:380855デフォルトの名無しさん
2011/01/26(水) 15:25:12知らないならレスしないで下さい。ウザいだけです。
0856デフォルトの名無しさん
2011/01/26(水) 20:18:35不快です死んでください
0857デフォルトの名無しさん
2011/01/27(木) 03:11:01って、君も荒らしか?
0858デフォルトの名無しさん
2011/02/08(火) 12:05:48クリック音や再生中の音楽などを丸ごとキャプチャしたいです。
0859デフォルトの名無しさん
2011/02/08(火) 12:45:250860デフォルトの名無しさん
2011/02/09(水) 12:53:00どうやるかは知らん
0861デフォルトの名無しさん
2011/02/09(水) 22:18:160862デフォルトの名無しさん
2011/02/16(水) 05:57:11http://msdn.microsoft.com/ja-jp/library/cc353346.aspx
>プッシュ モードでは、出力ピンはアプリケーションまたは別のフィルタにより構成する必要がある
とありますが、作成中のフィルタからdemuxフィルタの(映像でも音声でもない)出力ピンを構成するには、どのタイミングでどのようにすればいいのでしょうか?
0863デフォルトの名無しさん
2011/02/18(金) 04:42:550864デフォルトの名無しさん
2011/02/18(金) 10:14:46よく落ちないな。
0865デフォルトの名無しさん
2011/02/23(水) 18:52:11.22DirectX 9.0 SDK Update (October 2004) の前のVerにdirectshowが含まれているっぽいのだけどアップされていない。
場所を知っている人がいましたら教えてください。
0866デフォルトの名無しさん
2011/02/23(水) 18:59:30.940868865
2011/02/24(木) 00:33:10.88下記サイトに
http://blogs.msdn.com/b/hiroyuk/archive/2008/04/30/msdn-directx-sdk.aspx
DirectX SDK日本語ドキュメントは2002年版と2004年版があり、directshowは2002年版にしか含まれていないとあります。
そこで2002年版を探していますが見つけることができません。
知っている方がいたら教えてください。
0869デフォルトの名無しさん
2011/02/24(木) 00:52:38.790870デフォルトの名無しさん
2011/02/24(木) 01:17:29.092002年のに拘る理由はなによ
VC6? ご愁傷様です
0871デフォルトの名無しさん
2011/02/24(木) 05:33:29.610872デフォルトの名無しさん
2011/02/24(木) 13:18:07.55ttp://msdn.microsoft.com/ja-jp/library/cc353899.aspx
Webで見れるやつはダメなん?
0873865
2011/02/25(金) 01:42:34.09今までどおりWebのやつをみます。
いろいろとレスありがとうございました。
0874デフォルトの名無しさん
2011/02/27(日) 07:20:38.17動画をフレームごとに静止画形式のPNGに変換してくれるフィルターはないですか?
0875デフォルトの名無しさん
2011/02/27(日) 07:34:38.230876デフォルトの名無しさん
2011/02/27(日) 08:46:21.06ありがとうございます。
そのフィルターの名前とかダウンロード先を教えてください。
0877デフォルトの名無しさん
2011/02/28(月) 14:23:33.78GraphEdit でグラフを構成して再生ボタンを押下すると以下のエラーが出ます。
これはどういうときに出るエラーなのでしょうか。
調べているのですが、今のとこ意味がよく分かりません。
同じフィルタ構成でも、入力のメディアファイルによって出たり出なかったりします。
code : 0x80040204
enum : VFW_E_ALREADY_CONNECTED
text : 処理に含まれるピンが既に少なくとも 1 つ接続されている。
GraphEdit のエラーメッセージボックスのメッセージ表示
The graph could not change status.
この操作で使用されているピンの中で、少なくとも1つは既に接続済みです。
(Return code: 0x80040204)
0878デフォルトの名無しさん
2011/03/03(木) 11:45:08.34端的に言うと、Null Renderer の CBaseRebderer::IsStreaming() を使用したいのですが、
DirectShow でこれを使用する場合、インターフェイスの形でインスタンスを取得すると思います。
こんな↓感じで。
CoCreateInstance( CLSID_NullRenderer, NULL, CLSCTX_INPROC, IID_IBaseFilter, (LPVOID*)&nullRenderer );
試してみると、(CBaseRebderer*)&nullRenderer でもいけるようなのですが、
IBaseFilter はそもそも CBaseRebderer を含んでいません。また大量に繰り返していると
プログラムが落ちるようです。他の原因かもしれませんが
うえの方法が間違っている場合、
Null Renderer から CBaseRebderer* を取得する方法としてはどのような手段があるでしょうか。
0879デフォルトの名無しさん
2011/03/03(木) 13:12:13.870880878
2011/03/03(木) 17:21:37.10ありがとうございました。
0881デフォルトの名無しさん
2011/03/09(水) 17:18:21.52その間にメインウィンドウのスレッドから IMediaControl::Stop すると Stop から制御が返ってこなくてプログラムが停止します・・・
なんか解決策ありますか?
0882デフォルトの名無しさん
2011/03/09(水) 18:03:05.12スレッド毎の実行位置調べれば、何が悪いのかすぐわかるだろう。
0883デフォルトの名無しさん
2011/03/10(木) 21:32:24.58ところでここで聞くことではないかもしれませんが、スレッド毎の実行情報を見る便利なツールはありますか?
0884デフォルトの名無しさん
2011/03/10(木) 21:39:32.860885881
2011/03/10(木) 22:36:35.51処理待ちのメインウィンドウに別スレッドからSendMessageしてました・・・・
ありがとうございました。
0886デフォルトの名無しさん
2011/03/14(月) 17:41:33.09指定PIDのストリームを受け取って何かするレンダラフィルタを作成しているのですが、
ソースによって、動画がドロップします。
自作フィルタに届くIMediaSampleの表示開始ストリームタイムが、その時点でのストリームタイムより小さい時に起こるようで、
demuxからの送出が間に合わず、その結果、動画再生に影響が出ているのかと想像しています。
一度demuxから出力ピンを生やせば、自作フィルタをNullRendererに差し替えても、何も接続してなくてもドロップするという状況ですが、
解決するために試せる事があれば、ご教示下さい。
0887デフォルトの名無しさん
2011/03/17(木) 01:01:21.39もう少しわかりやすく書かなきゃわからん
transformフィルターを作ったんだけど、
その中でデバッグ用にファイル作成しています。
ただ、フレームごとにファイルが作られない理由がよくわからないため教えてください。デバッグを終了するといっぺんにファイルが作られるようです。
やっていること
transformメソッド内でfopen()を書いて画像データをファイルに書いています。
当然最後にfclose()しています。
処理が重すぎるのでしょうか?
0888デフォルトの名無しさん
2011/03/24(木) 23:11:24.00Windows7が当たり前になってきた昨今ですが、
DirectShowって映像系のソフトではまだ主流の技術ですか?
Windows7でもDirectShowにかわる別物は出てきていないのですか?
言語はC++ですか?いまだにCOMが生きていると考えて良い?
それともC#ですか?
0889デフォルトの名無しさん
2011/03/24(木) 23:21:05.210890デフォルトの名無しさん
2011/03/25(金) 00:10:49.27ありがとうございます!
0891デフォルトの名無しさん
2011/03/25(金) 03:11:58.440892デフォルトの名無しさん
2011/03/30(水) 03:13:25.31ttp://msdn.microsoft.com/ja-jp/library/cc370411.aspx
連番のBMPを用意して最初のファイルをセット、
SetDefaultFPSでフレームレート設定。
で、実行してみると1枚だけ表示されてあとは真っ黒。
ttp://homepage1.nifty.com/yasunari/VB/VB006.htm
ここのサンプルも試してみましたが同様でした。
なにか解決方法ありますかね…
0893デフォルトの名無しさん
2011/03/30(水) 03:22:59.68連番ファイルのサンプル数が少なすぎていたようでした
0894815
2011/04/08(金) 17:27:57.08保存中(Run実行中)にPauseを行うと、どちらかのカメラor両方のカメラ映像がフリーズするんですけど原因がわかりません・・・。
1.カメラ1のRun実行
2.カメラ2のRun実行
3.カメラ1のPause実行
4.カメラ2のPause実行
5.カメラ1のRun実行
6.カメラ2のRun実行
6実行後にカメラ映像のフリーズ発生。
特に自作フィルタをつないだりしていないシンプルなコードなのですが。
ちなみに同じ手順をPreviewやAVIファイル再生時に行っても映像のフリーズは発生しません。
0895894
2011/04/08(金) 17:31:35.016の手順の後にGetStateでそれぞれのカメラの状態を確認すると、映像がフリーズしていてもRun状態が返ってきます。。
0896デフォルトの名無しさん
2011/04/08(金) 19:51:14.72カメラでPauseの件はやったこと無いのでよく分からんが、ぐぐったら録画を一時停止するのは見つかった
"DirectShow run pause camera"でぐぐって上から2つ目とかその辺
0897デフォルトの名無しさん
2011/04/08(金) 20:50:44.892台のカメラの映像をミックスしてファイルに落としてるのか?
2台のカメラの映像をそれぞれ違うファイルに落としているのか?
プレビューpinやファイル再生の場合はレンダラにスレッドが居る。
キャプチャpinはそのピン自信がスレッドを持つ。
その辺の違いか?
0898894
2011/04/09(土) 03:45:17.66情報ありがとうございます。ControlStreamも試してみましたが、やっぱりフリーズしてしまいます。
>>897
レスありがとうございます。長くなりますがこんな感じのソースです。↓
// エラー処理略
IGraphBuilder *pGraphBuilder_1;
ICaptureGraphBuilder2 *pCaptureGraphBuilder2_1;
IMediaControl *pMediaControl_1;
IGraphBuilder *pGraphBuilder_2;
ICaptureGraphBuilder2 *pCaptureGraphBuilder2_2;
IMediaControl *pMediaControl_2;
IBaseFilter *pFileOut_1;
IBaseFilter *pFileOut_2;
ICreateDevEnum *pCreateDevEnum = NULL;
IEnumMoniker *pEnumMoniker = NULL;
IMoniker *pMoniker = NULL;
ULONG nFetched = 0;
CoInitialize(NULL);
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(LPVOID *)&pGraphBuilder_1);
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(LPVOID *)&pGraphBuilder_2);
CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC,IID_ICaptureGraphBuilder2, (LPVOID *)&pCaptureGraphBuilder2_1);
CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC, IID_ICaptureGraphBuilder2, (LPVOID *)&pCaptureGraphBuilder2_2);
pCaptureGraphBuilder2_1->SetFiltergraph(pGraphBuilder_1);
pCaptureGraphBuilder2_2->SetFiltergraph(pGraphBuilder_2);
// MediaControlインターフェース取得
pGraphBuilder_1->QueryInterface(IID_IMediaControl, (LPVOID *)&pMediaControl_1);
pGraphBuilder_2->QueryInterface(IID_IMediaControl, (LPVOID *)&pMediaControl_2);
0899894
2011/04/09(土) 03:50:43.61CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (PVOID *)&pCreateDevEnum);
pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumMoniker, 0);
pEnumMoniker->Reset();
// 最初のMonikerを取得
if (pEnumMoniker->Next(1, &pMoniker, &nFetched1) == S_OK) {
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pDeviceFilter_1 );
pGraphBuilder_1->AddFilter(pDeviceFilter_1, L"Video Capture2");
pMoniker->Release();
}
// 2番目のMonikerを取得
if (pEnumMoniker->Next(1, &pMoniker, &nFetched2) == S_OK) {
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pDeviceFilter_2 );
pGraphBuilder_2->AddFilter(pDeviceFilter_2, L"Video Capture2");
pMoniker->Release();
}
pEnumMoniker->Release();
pCreateDevEnum->Release();
pCaptureGraphBuilder2_1->RenderStream(&PIN_CATEGORY_PREVIEW,NULL, pDeviceFilter_1, NULL,NULL);
pCaptureGraphBuilder2_2->RenderStream(&PIN_CATEGORY_PREVIEW,NULL, pDeviceFilter_2, NULL, NULL);
0900894
2011/04/09(土) 03:51:13.71// 出力ファイル名を設定する
pCaptureGraphBuilder2_1->SetOutputFileName(&MEDIASUBTYPE_Avi,L"test1.avi", &pFileOut_1, NULL);
pCaptureGraphBuilder2_2->SetOutputFileName(&MEDIASUBTYPE_Avi, L"test2.avi", &pFileOut_2, NULL);
pCaptureGraphBuilder2_1->RenderStream(&PIN_CATEGORY_CAPTURE,NULL, pDeviceFilter_1, NULL, pFileOut_1);
pCaptureGraphBuilder2_2->RenderStream(&PIN_CATEGORY_CAPTURE, NULL, pDeviceFilter_2, NULL, pFileOut_2);
// カメラキャプチャ開始
pMediaControl_1->Run();
pMediaControl_2->Run();
pMediaControl_1->Pause();
pMediaControl_2->Pause();
pMediaControl_1->Run();
pMediaControl_2->Run();
// 以外停止指示があるまで待機。その後stop及びメモリ、COMの解放実施。
0901デフォルトの名無しさん
2011/04/09(土) 08:57:07.26人間が操作する程度の間隔でないと不確定の動作になるとかMSの人が言ってたな.
これこれ
DirectShow: フィルタグラフのRun/Stop などの状態遷移について
http://blogs.msdn.com/b/windows_multimedia_jp/archive/2011/03/03/directshow-run-stop.aspx
0902894
2011/04/09(土) 21:26:30.11レスありがとうございます。RunとPause、PauseとRunの間隔をそれぞれ2秒あけてみましたが、結果は同じくフリーズします。。
(たま〜に正常に録画できたりはしますが)
実行順序を
カメラ1のRun→カメラ1のPause→カメラ2のRun→カメラ2のPause→カメラ1のRun→カメラ2のRun
に変更すると映像はフリーズせず正常に録画できます。
でも何故そうなるのかわからないのですっきりしなくて・・・。
順序を変えて録画できるのも、今の実行環境でたまたまできているだけで、環境をかえるとやっぱりできないのかな?とか考えてしまいます。。
0903デフォルトの名無しさん
2011/04/09(土) 22:16:32.54フリーズってのは映像の動きがパタリと止まること?
or
それともデッドロックみたいに一切プログラムが動かなくなる?
(pMediaControl->Pause()が戻ってこないとか)
0904894
2011/04/10(日) 08:43:49.08映像の動きがパタリと止まります。
映像が止まっている状態でGetStateを実行するとRun状態が返ってきます。。
0905デフォルトの名無しさん
2011/04/10(日) 09:14:21.530906デフォルトの名無しさん
2011/04/10(日) 11:25:14.45フィルタ内部では流しっぱなしにしておけばいいんでないの
なんとなくWebCam側でPauseを考慮していない無い気がする
Pauseって、「一旦流れを止めて、次回続きから再開」ってことだろ
データ垂れ流しのWebCamで、続きから再開って(こっちでバッファ用意しないと)出来ないし
0907デフォルトの名無しさん
2011/04/10(日) 14:44:56.88次にRunしたときにレンダラが送られてくるフレームのタイムスタンプが古いので
表示しないとか、そんな現象があったような。
例えば最初にRunをして3秒後くらいにPauseして、更にRunすると
3秒くらい映像が固まるがその後また動き出すとかそういう現象はないか?
0908894
2011/04/10(日) 21:17:15.95PauseやStop以外に録画を止める方法があるのでしょうか?
何故Pauseにこだわっているかというと、カメラ2台の映像とその撮影対象のデータ(数値)の同期をとりたいのですが、Run開始から実際に映像が保存されるまでに時間がかかるため、RunしてすぐにPauseをかけて録画準備時間+α待ってから再度Run実施、という方法をとっています。
みなさん2台のカメラキャプチャを行う時の同期はどうやってとっていますか?そもそもPauseを使って同期をとろうとしていること自体間違っているのでしょうか…。
>>907
2度目のRunのあと一瞬(1〜2フレームくらい)動くことはありますがその後すぐに映像が止まります。1度目のRunの時間とは関係ないようです。
0909デフォルトの名無しさん
2011/04/10(日) 21:56:28.51うろ覚えで悪いけど、フィルタチェイン丸ごと、別のフィルタグラフに移動する関数があったはず
それが無理そうなら、自作フィルタを作る。
タイムスタンプで同期をとるようなやつ
0910デフォルトの名無しさん
2011/04/11(月) 10:21:16.900911894
2011/04/11(月) 16:33:41.77ありがとうございます。
909さんの方法を試してみることにします。
アドバイスしてくれたみなさん本当にありがとうございました。
0912デフォルトの名無しさん
2011/04/11(月) 23:54:24.09なるようダミーフレームを自動で挿入してくれる既存のフィルタってありますか?
0913デフォルトの名無しさん
2011/04/12(火) 17:25:29.66MSDN では後者を使えってあるんだけども。
0914デフォルトの名無しさん
2011/04/18(月) 19:25:49.90デバイスを見ると、どれにもピン情報が一つもありません(pin 00:のような)。
ところが実際にインサートしてみると、ちゃんとピンが表示されており、
他のフィルタとピンを接続すればちゃんと動作します。
これは一体どういう状況なのでしょうか?
0915デフォルトの名無しさん
2011/04/18(月) 21:19:55.06実際のピンは実行時に決まる。
0916デフォルトの名無しさん
2011/04/19(火) 00:10:50.66ありがとうございます。
ただその後試しにプログラム中でそのAudio Capture Sourceをマネージャーに
登録後、Enumしてピンを見てみると Input Pin(Rendered)というピンしかありませんでした。
本来ならGraphEditで見られるCaptureなどといったピンもあるはずなのですが、
なぜこうなっているのか事情がよく判らないんのですよ。
0917デフォルトの名無しさん
2011/04/19(火) 00:44:42.84接続状況で変化したり色々。
0918デフォルトの名無しさん
2011/05/01(日) 14:21:29.41【MPEG Video Decoder】-【Filter】-【Video Renderer】
とつなぐと、動作はするもののレンダラがGDIからDirectDrawに切り替わりません。
フィルタは CTransformFilter からの派生で、
http://msdn.microsoft.com/ja-jp/library/cc370535.aspx
の擬似コードの内容は実装しているつもりですが、レンダラが切り替わらない原因を
取得するメソッドとかありますか?
0919デフォルトの名無しさん
2011/05/01(日) 21:41:57.800920デフォルトの名無しさん
2011/05/02(月) 19:19:44.61サンプルソースのありかだけで良いから教えて欲しい。
プレビューピンとかキャプチャピンとか、訳わかんね。
出力ピン2つ用意して、カテゴリでプレビューとキャプチャ返しても、繋がりやしねぇ。
MSの解説ページは意味不明だし...
ほんと、企業はどうやって作ってんのよ?
0921デフォルトの名無しさん
2011/05/02(月) 21:14:05.700922デフォルトの名無しさん
2011/05/03(火) 00:21:12.89ソースフィルタだよね?色々なインターフェイス問い合わせるから、実装していないインターフェイスがあると動作してくれないプログラムがよくある。そういう状況なんじゃないかな。
0923デフォルトの名無しさん
2011/05/03(火) 02:18:14.17キャプチャデバイスとしてウェブカムみたいに認識させたいならそういう方法はあるし、
カメラとかにはプレビューピン無いのもあるから別にキャプチャピンだけで事足りるし
0924デフォルトの名無しさん
2011/05/03(火) 13:06:12.32もしビデオキャプチャソースというのを単純なソースフィルタのことをさしているならそのサンプルでよいと思う。
でも本当にUSBカメラなどのドライバとしてのビデオキャプチャソースを作りたいならDDKを見ないとダメだろう。
DDKも古いやつしか知らないが、WDMモデルでビデオキャプチャクラスみたいなクラスがあるんだろう。
そしてそのミニクラスドライバを書くとかそういう話になるんじゃないかな。
0925920
2011/05/03(火) 14:05:42.25まさにUSBカメラのキャプチャソースみたいなものを作りたいんだ。
キャプチャピンのみなら問題ないんだけど、そこにプレビューピンを追加したいんだ。
つまりフィルターを使う側はRenderStream()でPIN_CATEGORY_PREVIEWで繋ぎにいきたいんだ。
そこで出力ピンを2つ用意して、GetPin()でキャプチャピンとプレビューピンを返すようにしてもうまく動かない。
(レンダーフィルターに繋がらない)
MSの解説見て未意味不明だから、皆さんのお知恵に頼ってみた。
>>924
ちょっとDDK見てくる。
0926デフォルトの名無しさん
2011/05/03(火) 19:43:17.08DDKルート\src\wdm\videocap\testcap
これだな。
かなりデカイさんぷるなんで読む気がしないが
なんかHTML読むと、このドライバはDShowでは4つのフィルタに見えるらしい。
0927920
2011/05/04(水) 00:18:18.39videocap\usbintelとか1394dcamとかいうのがあったので見てみたが、これはDirectShowフィルターではない...
というか、このサンプル全部検索したが、どこにもDirectShowフィルターを作ってない...
DDKを探してくる...
0928デフォルトの名無しさん
2011/05/04(水) 12:01:31.15DisplayTypeとか使ってQueryAcceptで渡されたサーフェイスの情報を
調べてみるといいよ。
サーフェイスの種類を判別するためにトップとボトムが逆になってたり
プライマリサーフェイスではBI_BITFIELDSが渡されたりする
(プライマリではコーデックが拡大縮小したりしなきゃいけないので面倒)。
0929928
2011/05/04(水) 20:47:12.24サーフェイスの違いの判断はHeightが負かどうかで
ボトムアップが逆になるのはRGBの時(YUVは常にトップダウン)だったかな。
スマソ
YUVはディスプレイドライバによって色や輝度の変換式が異なったりするので注意してね。
CVideoTransformFilterはフォーマット変更やフレームスキップを考慮したクラスに
なってるよ。
0930デフォルトの名無しさん
2011/05/06(金) 10:24:49.25ありがとうございます。
>>CVideoTransformFilterはフォーマット変更やフレームスキップを考慮したクラスに
QueryAcceptはCheckMediaType経由でCTransformFilter::CheckTransformを呼び出す
と記述されているので、そこでS_OKを返してみたのですが、追いかけてみます。
0931920
2011/05/06(金) 10:37:59.58すごく馬鹿なところでポカしていた。
出力ピンでNonDelegatingQueryInterface()をやってなかった..._| ̄|○
同じところでつまづく人がいないようにメモ。
やりたいこと:
独自のソースフィルタをキャプチャデバイスのように扱いたい
やったこと:
1)PushSourceを元に、まず通常のソースフィルタを作成
2)フィルタのカテゴリを「CLSID_VideoInputDeviceCategory」に変更
3)出力ピンを2つ作成(「~Capture」と「Preview」)
4)ピンクラスをコピーして2つ作成(キャプチャ用とプレビュー用)
5)各ピンにIKsPropertySetインターフェースを追加
6)各ピンでDECLARE_IUNKNOWNを宣言
7)各ピンでNonDelegatingQueryInterface()を実装
8)フィルタで各ピンのオブジェクトを作成、保持
※本当は画像のフォーマットをあわせたりしなくちゃいけないらしいけど、省略
これでアプリから、
RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pSrcFilter, NULL, NULL);
で表示できるようになった。
0932デフォルトの名無しさん
2011/05/06(金) 11:35:10.46DDKは必要なかったようだね
0933デフォルトの名無しさん
2011/05/07(土) 09:36:33.34>>922の言うように他のソフトからだとインターフェース不足になることが多いんだよな
強引だけどこんな方法で解決した。ログ出すのとか面倒だったんでw
hr = CSourceStream::NonDelegatingQueryInterface(riid, ppv);
/*
if (FAILED(hr)) {
TCHAR buf[255];
StringFromGUID2(riid, buf, 255);
MessageBox(NULL, buf, CAM_NAME, MB_OK | MB_TOPMOST);
}
*/
これで足りないインターフェースのGUID出るから、後はググって要りそうなのを実装した
ちなみに俺が使いたいソフトで必要だったのはIAMDroppedFramesだった・・・分かるかよw
0934デフォルトの名無しさん
2011/05/07(土) 12:38:37.76DirectShowじゃないけどShell namespace関係で同じようなデバッグしたことある
0935デフォルトの名無しさん
2011/05/12(木) 11:47:42.28このアスペクト比を DirectShow を使用して取得することは可能でしょうか?
可能であればその方法を教えてください。
0936デフォルトの名無しさん
2011/05/12(木) 11:56:31.87ファイルやデコーダやデマルチプレクサによっては無い事もある
0937デフォルトの名無しさん
2011/05/12(木) 12:02:06.26VIDEOINFOHEAER2:dwPictAspectRatioX と dwPictAspectRatioY ですね。
VIDEOINFOHEAER の場合は、bmiHeader のなかの biYPelsPerMeter と biXPelsPerMeter から
計算できそうですね。
0938デフォルトの名無しさん
2011/05/25(水) 21:25:08.82WM ASF Writerを使ってwmvファイルの書き出しをしてるんだけれど、
そん中のコーデックの指定はどうやってやるの?
IWMCodecInfo3を使ってコーデック(WIndows Media Video v7 / v8 / 9とか)の
列挙はできたんだが、コーデックをsetする方法が分からんです。。。
0939デフォルトの名無しさん
2011/05/25(水) 22:16:29.36ってのがまんまあるじゃないか
0940デフォルトの名無しさん
2011/05/26(木) 21:05:07.79BITMAPINFOHEADER::biCompressionをセットしたらできたよ。ありがと!
実は以前も同じようにやったんだけど、その時はsubtypeしか指定してなかったから
うまく動かなかっただけでした。
とりあえず感謝!
0941デフォルトの名無しさん
2011/06/06(月) 15:53:31.47Win7 SP1/64bit版で、ffdshowはrev3866で行き詰ったので今はrev3154に落とした。
GraphEditでUSBキャプチャ->ffdshow raw->EVRと接続して、
ffdshowの設定でリセット状態から変更したのは、Outputのページで
"Set interlace flag in oouput media type"にチェックを入れただけ。
映像からはさっぱりコーミングノイズが消えない。
ffdshowのInfoページを見ていると望みどおりYUY2のまま出力されてる。
EVRの代わりにVMR9にしてみても状況は同じ。どこか理解できずに手順抜けているんだろうか?
よろしくお願いします。。ちなみにGPUは内蔵intelHDです。
0942デフォルトの名無しさん
2011/06/09(木) 09:11:34.65書いといた方がいいと思う
radeonかGeForceで試すことはできないの?
0943デフォルトの名無しさん
2011/06/12(日) 21:42:36.79つーか、COMのインターフェースのヘッダファイルくらい付けてくれよ
0944デフォルトの名無しさん
2011/06/12(日) 23:15:26.480945デフォルトの名無しさん
2011/06/13(月) 00:43:08.61ドキュメントもいい加減だし
0946デフォルトの名無しさん
2011/06/13(月) 02:14:12.55943はまず自分自身を疑うこと覚えよう。
デバッグの鉄則だ。
0947デフォルトの名無しさん
2011/06/13(月) 10:27:11.66そりゃビルドは出来るよ
でも、設定したした通りにエンコード出来ないんだわ
つーか、ビルドって何をビルドしたの?
0948デフォルトの名無しさん
2011/06/16(木) 02:16:20.930949デフォルトの名無しさん
2011/06/24(金) 11:26:45.74という現象に誰か心当たりがあれば原因を教えてくれないだろうか。
繋ぎ方はソースフィルタ(ES送信用)-MPEG2デコーダ-擬似レンダラ(結果取得用)で、
プッシュモードからGOP単位分のES、例えばIBBPBBPBBPBBPBBの15フレームを送っても
12フレームしか結果が出力されない(レンダラにIMemInputPin::EndOfStreamが来る)。
余分に次の3フレーム(IBB)を送ると、今度は15フレーム出力されたのでこれで
凌ごうかとも思ったけど、後述の無視出来ない量のリークがこれに関連してる気が
して来たので、解決が必要かなと思ってる。
追記:
結果出力後にフィルタを停止してタスクマネージャを見ると、それに相当すると
思われるメモリリーク(1440×1080で約20M。RGB32設定)が検出されるので(・∀・)、
デコーダ内部でデコードは終わってるけど「何か」を待っていて残りのサンプルを
放出してくれていないような印象。
受信出来た分のサンプルのリークではないと思う。AddRef/Releaseで確認すると
常に参照カウント1なので、この分はReceiveから戻り次第デコーダが解放するはず。
_CRTDBG_LEAK_CHECK_DFのDEBUGビルドでも報告は無いし、大物GDIリソースも解放漏れは無いっぽい。
上流からES送信後にIPin::EndOfStreamを送るのを暫く待っても無駄だった。
下流からIQualityControl::Notifyが必要かとも思ったけど、それなら6フレーム送った時にも
3フレームしか出力されないのが解せない。グラフへのSetSyncSource(NULL)も効果なし。
プッシュモードの限界という結論だったら泣ける(・∀・)。
0950デフォルトの名無しさん
2011/06/24(金) 11:30:26.850951デフォルトの名無しさん
2011/06/24(金) 15:25:10.020952デフォルトの名無しさん
2011/06/24(金) 16:59:59.56ファイル名はCLVsd.axとなってる(日時09/08/24-22:00 バージョン8.4.0.730のもの)。
0953デフォルトの名無しさん
2011/06/24(金) 22:09:06.200954949
2011/06/25(土) 10:33:30.29(入力フレーム5,6を交換すると出力フレーム2,3が入れ替わった)。
ますます分からない。後のPフレームがデコード出来るって事は、最初のIフレームも理解出来ているのは確定に思えるが…。
何かの判断で手遅れの3フレームがカットされているとか?
0955デフォルトの名無しさん
2011/06/25(土) 17:37:01.270956949
2011/06/25(土) 23:59:20.43その後もアロケータや入力ピンをラップしてトレースしたり色々と調べた結果、以下のような流れらしいと結論。
・デコーダはレンダラとのピン接続時にひとまずレンダラの提案するアロケータを使用する事を計画。
ただしそれは720x480固定で3フレーム分(SetPropertiesより)。
・1440x1080のESを流し始めると、最初の数チャンク(Iフレームの一部)を送った時点でデコーダはレンダラに動的フォーマット変更を要求。
しかしこの時点で既にデコーダは内部に独自アロケータを確保して処理を始めているらしく、ReceiveConnectionに対して
レンダラ側がDecommit/SetProperties/Commitでバッファを拡大してもその後レンダラ側のアロケータは一切使われない(・∀・)
・GOP分のESを流し終えてEndOfStreamを送ると、デコーダは出力を始めるが最初のI-P区間のフレームが全て削られている
・何か不明なバッファが20M確保されている。デコーダを停止・解放してもグラフを解放しても消えない
動的フォーマット変更を発生させない方向、つまりIフレームの入力前に必要バッファ量≡解像度をデコーダに正しく伝えられれば良いかと思ったけど、
・レンダラ側のGetAllocatoraaRequirementsで最大解像度のバッファ容量を提案してみる
→デコーダは華麗に無視(・∀・) (デコーダからアロケータへの最初のSetProperties要求が何も変わらず、依然としてReceiveConnection発生)
・デコーダとレンダラのConnectDirect時にメディアタイプをNULLでなく最大解像度で明示的に指定してみる
→解像度の変更はおろか、たとえデコーダがEnumMediaPinで受入表明したメディアタイプと完全一致でも明示的に指定すると拒否される(・∀・)
ダメだこりゃ。
レンダラへの出力がIフレーム以外も全てSetSyncPoint(TRUE)されてるのが少しひっかかるけど、もう限界。
最初に最大解像度のダミーIフレームを流して(当然出力されない)、その後にフィルタをStopせず利用し続ける位しか思いつかない。
後はPause/Playでも新たなリークが発生する仕様でない事を祈る位だけど、何か気づいた事があればアドバイス頼む。
0957949
2011/06/26(日) 00:01:23.54ひょっとしてこのデコーダだと他のアプリでも同じ問題が発生するのでは?
と思って某ソフトで1440x1080→1920x1080とチャンネルを切り替えたらやはり20Mリークが発生してた。
(VMR9で確認、受入形式はRGB32でなくYUV2のようだが無関係らしい)
確認は難しいけど720x480を超える(つまり通常の)ストリームを最初に流した時も発生していると思う。
デコーダも色々癖があるって事でFAなのか。それとも同社製デコーダでも後のバージョンだと改善されてるのか。
フィルタを一時停止する事すら少なく、高解像度への変更も数える程な視聴用にはともかく、編集用アプリには微妙過ぎる。
調査が完璧とは思わないし、プルモードでもこうと決まった訳じゃないけどさ。組み方次第で50GOP処理毎に1GBリーク(・∀・)
0958デフォルトの名無しさん
2011/06/26(日) 01:37:39.030959デフォルトの名無しさん
2011/06/28(火) 08:37:56.02真のストリームの先頭なのか、GOPでぶった切りした物か分からんけど、OpenGOP/CloseGOPに関わらず、
先頭数フレームはデコード出来ないと思った方が良い
あと、demuxerがAM_MEDIA_TYPEの為に先頭1M程読んでポインタがそのままで、数フレデコード出来ない
事も有る
各社のSDK毎にもっと詳しく書いてあげたいけど、こちらも仕事なので許されよ
0960デフォルトの名無しさん
2011/06/28(火) 09:48:45.730961デフォルトの名無しさん
2011/06/28(火) 11:01:32.380962デフォルトの名無しさん
2011/07/04(月) 00:19:55.56必要に応じて中間フィルタも追加してもらいたいのですが、IFilterGraph::ConnectDirect
だと中間フィルタを追加しないのです。
たとえば通常だとYUY2で接続できてしまうフィルタを、中間フィルタを挟んでRGB32とかで
接続したいのですが。。。
0963デフォルトの名無しさん
2011/07/04(月) 11:27:16.430964962
2011/07/05(火) 19:36:58.22のは理解しているつもりなんですが、この時にメディアタイプを指定したい
のです。
あれ?何か根本的に間違ってますか?
0965デフォルトの名無しさん
2011/07/05(火) 21:58:37.87だいぶ昔のことなので忘れた。
名前はキャプチャーグラフビルダーだけど、キャプチャーしない用途でも気にしないでバンバン使っていいから
0966962
2011/07/06(水) 21:35:02.29ICaptureGraphBuilder2::RenderStreamで指定できるのはメジャータイプだけのようです。
うーん、やっぱり普通はこんなことしないんですかねぇ。。
それにしてもキャプチャ関連でなくてもICaptureGraphBuilder2は使えるんですね。
これは知りませんでした!
0967デフォルトの名無しさん
2011/07/06(水) 21:51:39.69古いソース引っ張り出して確認してみたが
IGraphBuilder::ConnectDirectつかってるな。
アップストリームフィルタの出力ピンとダウンストリームの入力ピンを指定のメディアタイプで接続してる。
試してみて。
0968デフォルトの名無しさん
2011/07/06(水) 21:55:56.48じゃあだめだね。
すまん
0969デフォルトの名無しさん
2011/07/06(水) 22:51:21.51流れから言って既存のレンダラを使う話なんだろ?EVRかVMR9か知らんけど
インテリジェント接続で規定の優先順位に逆らいたいという事なら、入力ピンをラップするか
前にバイパスフィルタをかますかしてから入力ピンのIPin::QueryAcceptで不都合なメディアタイプを蹴るしか無いんじゃないか
どうも目的を聞いてみたら他の方法でいいだろという結論になりそうな匂いがしてならないが・・・
0970962
2011/07/07(木) 10:58:53.37やはり直接的な方法は無さそうですね。まぁ普通は必要ないですもんね。。。
今回は969さんの言われたように適当なバイパスフィルタを通して対処すること
で対応できました。ありがとうございました!
0971デフォルトの名無しさん
2011/07/20(水) 17:38:02.49急にDirectShowをいじることになって色々資料を漁ったりしているのですが、時間が限られており、
自分が理解しやすい形式になっているサンプルを探しています。
0972デフォルトの名無しさん
2011/07/21(木) 13:19:31.97相談です。USBキャプチャの挿抜を検出してグラフの停止、再起動を自動化すべく戦ってます。
(C# + DirectShowLib + MediaFundationLib)
キャプチャデバイスかどうかを調べるにはGUIDを較べるしかないのかなと思うのですが、手持ちのデバイスで実験したところ
DsDevice()のClassID、DEV_BROADCAST_DEVICEINTERFACE構造体のdbcc_classguid、デバイスマネージャで見えるデバイスクラスID
これら全部が異なっていることを確認して途方に暮れてます。。
ちなみに現在は、GraphEventのDeviceLostを使って抜かれた検出だけに対応しています。
できれば挿されたときにも履歴にあるデバイスの場合は自動でグラフ作成してやりたいのです。アドバイス下さい。
0973デフォルトの名無しさん
2011/07/22(金) 01:13:26.650974デフォルトの名無しさん
2011/07/27(水) 16:24:02.76普通にポーリングすれば良いんじゃない?
UVCならフィルタドライバ書くとか
USBデバイスIDは書かれて無いのしか見た事無いけど(安物しか買えないので…)ロジクールやMSのは書かれてるらしいので、デバイスを限定するとか
0975デフォルトの名無しさん
2011/07/28(木) 08:16:26.64とりあえず、少なくともグラフが未構築のときに(キャプチャに限定せず)なんらかUSBデバイスが挿されたら、
コンフィグするかポップアップして尋ねるようにしました。しばらく使ってみて余計なお世話感が出るようだったら
この機能、削除します。難しいっす。
0976デフォルトの名無しさん
2011/08/04(木) 10:02:49.10もう解決してるかもしれないけど、とりあえず置いとく。MFCでってのがいいね。
OCNアク禁そろそろ解いてくんないかな。
http://3rd.geocities.jp/orekuma64/DSTest05.zip
0977デフォルトの名無しさん
2011/08/05(金) 17:57:41.41使用する環境はWindowsXP、PIC or USB、入力ソースとして少なくともD2以上をサポート。
あと、きちんとDirectShowをサポートしていて、へんなソースフィルタとかじゃないやつがいいです。
(DirectShowのフィルタの仕様がわからなくてテキトーにつくったっぽいヤツではなく)
ViewCast製のオスプレイがよいとは思うのですが、IOデータあたりから安くていいのが出ていればそれに越したことは無いので。。
0978デフォルトの名無しさん
2011/08/05(金) 18:23:52.57プログラムに関しての質問は何?
0979977
2011/08/05(金) 18:38:45.71MPEG2のみ、とか、そもそも付属のキャプチャソフトでしか使用できないとかそういうものはなしでお願いします。
0980デフォルトの名無しさん
2011/08/05(金) 18:41:07.36PCのハード板で聞いたほうが良いんじゃないか
0981デフォルトの名無しさん
2011/08/08(月) 02:27:26.25レス数が950を超えています。1000を超えると書き込みができなくなります。