1 :
デフォルトの名無しさん :
2008/06/22(日) 18:38:21
新スレたったんだ
4 :
デフォルトの名無しさん :2008/06/28(土) 14:08:40
初カキコ失礼します
今、DirectShowを使用して
画面の一部を切り出して表示する
システムを制作していまして
それでシステムの参考に
http://ship.nime.ac.jp/~osawa/focusShare/ このサイトの「Focus Share」で使用されている
DirectShowフィルターをGraphEditで動かしてみたいのですが
うまく動かすことが出来ずに困ってます
ちなみに開発環境は
Visual C++ 2008 EE、Platform SDK 2003 SP1、DirectX 9.0b SDK です
ご教授の程、よろしくお願いします。
5 :
デフォルトの名無しさん :2008/06/29(日) 21:24:11
過疎ってるなw
1乙
ってか、自分でも立てようかと思ったけど、
すぐ落ちるとイヤなので様子見してた・・・
>>4 とりあえずどのフィルタを使ってどんな症状なのか
説明してくれないと困るぞ
ざっと試してみたけどVideo Extraction Filterを使おうとしてるのかな?
ソース見てないからよく分からないけど、確かにちょっとおかしい。
ffdshowで出力フォーマットをいろいろ変えてみたが、
入力可能な正しいフォーマットはなんじゃろな。
暇があったら後でソース見てみる
7 :
デフォルトの名無しさん :2008/07/02(水) 22:53:12
ageとくぜよ
8 :
デフォルトの名無しさん :2008/07/05(土) 13:56:15
hage
9 :
デフォルトの名無しさん :2008/07/17(木) 21:43:58
9
10 :
デフォルトの名無しさん :2008/07/26(土) 18:42:31
あへ
過疎と戦うスレ
DirectShowはもう終わりだというのか・・・!
M$が何考えてるかわからん
DirectShowを使って動画から映像だけ抜き出してwmvに変換するプログラムを作成しようと思ってます。 まずフィルタグラフをどう構築すればいいのかと思ってGraphEditで試しているのですが WM ASF WriterのAUDIOピンを繋がないとエラーになってしまいます。 無音声のwmvファイルを作成する場合AUDIOピンに何をつっこめばいいのでしょうか?
>>14 確かにエラーになるね。
適当なAudio Capture Sourceを突っ込めば無音のwmvを作ることはできるけど、
ビデオ終端で自動終了できない・・・。
>>15 SDLにDirectShowのラッパーはないんじゃない?
あ、.NETがCygwinから使えるならRCW経由でDirectShowを使えるような気がするな。 誰か試してみない?
18 :
15 :2008/08/01(金) 18:26:19
Windows SDK (Platform SDK)入れて、その中のVC++コンパイラ使えばいいだろって気もするが。
20 :
15 :2008/08/01(金) 22:42:59
>>19 正論です.
カメラを他の装置と同時に使う事情から,
cygwinで動かせたら嬉しいと考えてます.
21 :
15 :2008/08/01(金) 22:49:04
cygwin ↓ .NET Framework 2.0 SDK ↓ Directshow.NET 2.0(ラッパー) ↓ Directshow 17さんの言うとおり, 上記の道が考えられますが…,難しいですね. もう少し頑張ってみます.
簡単にやるならVS使えよ
>>16 レスどうもです。
プログラム組んでみようと思いますが、
GraphEditだからだめだってことはないんでしょうね。
もう少し悩んでみます。
すみません。 yahooチャットのビデオに自作のDirectshowフィルタを挟んで 効果を付けてみたいのですが可能ですか? 例えば文字スーパーを流すようにしてみるとかしてみたいのですが・・・ yahooチャットのビデオがどのようなフィルタ構成になっているかわからず 出力メディアタイプとかわからないです。 接続に関してはインテリジェント接続になっていてくれさえすればメリット値を変更で なんとかできないかなって思っています
25 :
デフォルトの名無しさん :2008/08/05(火) 08:54:08
Win標準のVideo Rendererって、 アスペクト比が4:3と16:9のものしかまともに再生されないけど、 CIFみたいな中途半端なサイズのせいなの? それとも適切なパラメータを出力ピンに設定していないから? 誰かわかりませんか。形式はyv12です。
yv12
27 :
デフォルトの名無しさん :2008/08/05(火) 23:10:13
yv12に限らず、フレームバッファの確保の仕方次第で レンダラ側で確保されるバッファのサイズが変わってくるんだね。 ffdshowはどうやってそこらへんを上手く処理してるんだろう…
1ピクセル単位で任意のサイズ使えるぜ?
29 :
デフォルトの名無しさん :2008/08/05(火) 23:50:25
出力ピンに設定している画像サイズがわかるツールつくったぜ?
>>24 答えてくれたら放出するよ
30 :
デフォルトの名無しさん :2008/08/06(水) 08:51:59
>>28 あれ。そうなんですか…
GetMediaTypeで伝えるだけじゃだめなのかな。
Transformが呼ばれる時点で既にpOutには変更されたサイズが入ってしまってるんだけど…
もしかして再接続を適切に処理してないからでしょうか。
31 :
デフォルトの名無しさん :2008/08/06(水) 23:34:37
相武沙希がかわいすぎてDirectShow
>>24 あれは動画と言うより静止画で、鯖から要求されたときに
jpc(Jpeg2k)形式の1フレームの画像ファイルを送ってるだけなので
やろうとしてることを実現したければ、webcam画像取り込み、加工、
エンコード、パケット送信まで丸ごと作っちゃうか
ビデオ入力デバイスとしてwebcamの画像を横取り、加工する何かを
作るしかないと思う。←たぶんやりたいのはこっち?
jpcは写真とかは得意だけど文字とかはボケボケになった気がする。
丸ごと作っちゃうパターンだと圧縮率変えれば文字も綺麗に見えるけど、
受信側のデコードで負荷がかかりすぎて
PCがフリーズする視聴者続出させた記憶があるw
>>33 そうですか。
単純にキャプチャフィルタと画像送信フィルタ構成で出来ているとばっかり
思っていました。
画像を横取りできたとしてもエンコード、パケット送信までは作れないから
諦めかな?
んで、フィルタの放出はした方がいいかい?
いらん
36 :
デフォルトの名無しさん :2008/08/08(金) 21:10:57
じゃあ、俺の妹(高校生)の寝顔は? (´・ω・`)? 俺の脳内妹かわいいよ
aviファイルの画像と音声を抜き出したいんだけど、どこかにサンプルがないかな? Video for windows の例はいくつか見つかるんだけどね。 詳しい方、よろしくお願いします。
38 :
37 :2008/08/11(月) 13:46:21
補足 業務で使うので、ツールではなくやり方が知りたい。 画像の抜き出しは見つけた。音声の抜き出し方がわからない。 以上、よろしくお願いします。
しばらくGraphEditで遊んでみれば分かる。
こんなゆとりを飼っている会社も大変だな
でも3ヶ月後はお前らぶち抜いてるかもよ そういうもんだ
それも癪なので教えないでおこう
>1参照
DirectShowを使った録画アプリケーションをサービスとして実装し、 ログインしていない時に録画できるようにする事は可能なのでしょうか? 例えばプレビューは無しでもデスクトップがないとグラフを構築できないといったような制限はあるのでようか?
なんでその程度の試す手間を惜しむの?
CheckTransformに渡ってくるレンダラからの要求サイズで絵を作って渡しているのに、 YV12形式だとQCIFだけ横幅がおかしく表示されます…
DirectShowの質問です。 ムービーの動画をテクスチャに移して加工した上で表示させたいと思い、 ネット上のサンプルを読み漁ってとりあえず組んでみたのですが 以下の疑問点が発生しました。 どなたかわかる方が居ましたら、答えていただければありがたいです。 1. ムービーファイルの画像を「1枚ずつ」「任意のタイミングで」取得する方法はありますか? 現在のコードでは、DirectDrawに再生させておいて 描画時にテクスチャを取得して再生する、という構造になっています。 おそらく別のスレッドで再生させているのだとは思いますが このシステムでは、負荷でメインスレッドのFPSが落ちた場合などに 当然ながら同期のズレが発生してしまいます。 (動画とメインループのフレームの比率が変化してしまうため) アプリ側から任意のタイミングでフレームを進めることはできますでしょうか? 2. 実際に再生させるルーチンまでは作れたのですが 動画ファイルの読み込みに250msほど時間がかかってしまいます。 特にIGraphBuilderのRenderFileメソッドが非常に重く、 ここだけで200ms持って行かれてしまいます。 これはムービーファイルを再生する上で回避できない時間なのでしょうか? ちなみに、ムービー形式はサンプルに沿ってwmvを使用しています。 DirectShowというと、マイナーでネット上のサンプルも少ないというイメージで 触っている人が少ないかもしれないかと思うのですが、わかる方が居ましたら よろしくお願いいたします。
レンダラの出力がテクスチャになるようなフィルタを作る。 手動でフィルタ接続が速いかも
デフォルトのフィルタを使った場合、 変換が二度手間になっているような認識でいいのでしょうか? ありがとうございました。ちょっと色々とやってみます。
DirectShowでマルチチューナに対応したTVクライアントを書こうとして最初で躓いてしまいました。 あるBDAチューナデバイスAがサポートするチューニング空間を列挙する方法が知りたいのですが、 何かいい方法はないでしょうか?
COMの質問なのか COMは分かってるけど適当なAPIが見つからないのか APIも分かってるけど挙動がおかしいのか、などなど
>>52 COMはだいたいは大丈夫だと思います。
適当なAPIが見つかりません。
PNDIR_INPUTのAM_MEDIA_TYPEをみると、
majortype = KSDATAFORMAT_TYPE_BDA_ANTENNA
subtype = MEDIASUBTYPE_None
formattype = FORMAT_None
であって、接続可能なピンかどうか判断できませんでした。
ネットワークプロバイダの出力ピンをみても、同様でAM_MEDIA_TYPEだけでは
判断できないようですが、ほかの方法が思いつきません。
CBaseVideoRendererを使って テクスチャにレンダリング、DirectXで表示という いわゆるムービーテクスチャー方式で再生しているのですが Vistaのフルスクリーン時のみフリーズする現象にぶち当たってます VistaウインドウモードやXPでは問題ないようなのですが・・・ DoRenderSample内のテクスチャのロックが 癌なような気がしないでもないですが対処法がわかりません なにか解決方法はありますか?
デバッグしろ
リモートデバッグ環境がないので フルスクリーン時のデバッグができないのです
マルチスレッドのフラグ立ててデバイス作っていないのに、複数のスレッドでアクセスしてデッドロックしている感じもする。 つーか、お前の環境なんて知ったこっちゃない。マルチモニタでやるなりログ出力するなり好きにしろ。 最低限の道具も揃えられないようだと話にならない。
VB.net2005でDirect Show を使用し動画から音声を抽出→音声波形を作成 ということをしたいのですが,どのようにしたらよいのでしょうか? Direct Showの使い方もわからず,教えていただけないでしょうか?
まずはC++を使ってください。C++以外の言語でDirectShowを扱うのは愚かな行為です。 次にサンプルやドキュメントを読んで基本的な仕組みを理解してください。
>>59 さん
ありがとうございます,VC++でやるのが普通なのですか・・・
vb.netでやるのが仕事の条件だったもので結構探してみたんですがなかったのはそういことだったんですね.
ありがとうございます.
その辺のいろいろな手間考えるとまあ
>>59 だろうなあ
>>61 さん
ありがとうございます.
皮がvb.net2005で作らざるを得ないのでできれば閉じた環境で作りたかったもので・・・
とりあえず,真剣に無理そうならvc++でdllを作成するという方向になるかと思われます.
.NET環境はCOMの扱いが面倒なんで、結局C++なDLLでやって値だけ得るのがいい。 VSなら言語やモジュールが分かれていてもシームレスにデバッグできるよ。 GUI(C#)+DLL(C++)も簡単。
最新のDirectX SDKをインストールしたのですが GraphEditが見当たらないのですがどこにあるのでしょうか?
今はWindows SDK for VISTAのほうにあるんじゃないかな。
なんですとー!
DirectShowつかって、Form上に動画を表示しています。 その画面上にlabelやtextboxを表示したいのですが、動画の下に隠れて(?)しまってみえません。 隠れない方法はあるのでしょうか? VS2005 C#です。
コントロールを最前面に移動させるとかフォームじゃなくてパネルにして最背面にするとか
71 :
69 :2008/10/07(火) 19:55:08
>>70 できました!!!!!!ありがとうございます。
72 :
デフォルトの名無しさん :2008/10/08(水) 04:24:48
おいおい このまま終了か?あげとくぞ
73 :
デフォルトの名無しさん :2008/10/08(水) 14:33:08
このスレは書き込み少ないんで、age推奨でもいいかもしれんね
74 :
デフォルトの名無しさん :2008/10/14(火) 13:29:15
すいません質問です DirectShowを使用してWMVファイルを再生する際にはWMAudio Decoder DMOとWMVideo Decoder DMO を使用するとよいというのはRender Media Fileを使って理解しました. その上で再生するのとは別個にWMAをファイルとして保存したいのですがWMAudio Decoder DMOの次のフィルターをどのようにすればよいのでしょうか?
質問で申し訳ないんですがDirect show file reader プラグインのファイルを何度も解凍してもいくつかのファイルがエラーしかでません ds_inputとds_input.auiと読んでね、が解凍できたのですがこれは正常なんでしょうか? それとも解凍できてないファイルがあるのかファイル自体がエラーおこしてるのか教えていただけるとありがたいです
DTV板に池
「読んでね」は読んだのか?
78 :
デフォルトの名無しさん :2008/10/24(金) 04:53:39
質問です. Windows SDK v6.1 + VS 2005 Academic Editionを使用しています. DirectShowのSample Filterをビルドしてみたところ以下のエラーが出てビルドが通りません. 解決策はないのでしょうか?
79 :
78 :2008/10/24(金) 04:58:55
1>wavdest.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall CTransformInputPin::CTransformInputPin(wchar_t const *,class CTransformFilter *,long *,wchar_t const *)" (??0CTransformInputPin@@QAE@PB_WPAVCTransformFilter@@PAJ0@Z) が 関数 "public: __thiscall CWavDestFilter::CWavDestFilter(struct IUnknown *,long *)" (??0CWavDestFilter@@QAE@PAUIUnknown@@PAJ@Z) で参照されました。 このようなerror LNK2019が合計4個で増した.
>>79 DirectShow 基底クラス(自分でビルドする必要あり) がリンクされてない
場所は SDK のフォルダから上記クラス名で検索をかけてみればすぐに見つかる
81 :
79 :2008/10/24(金) 17:53:57
インクルードディレクトリして C:\Program Files\Microsoft SDKs\Windows\v6.1\Samples\Multimedia\DirectShow\BaseClasses を追加で指定したのですが,これだけではないのでしょうか?
そこにソリューションのファイルあるだろう ビルドしてみそ。Vistaだと別の場所にする必要がある。 そこでできたlibをリンク
83 :
デフォルトの名無しさん :2008/10/26(日) 13:38:07
SampleGrabberでオーディオを取得して、加工しています。 ムービーの場合は、BufferCB()には、1フレーム分のデータがくるので、 加工などは、とてもし易いのですが、オーディオの場合、同じ44100Hz16Bitステレオのデータでも、 非圧縮のWAVEと、MP3、WMAなどの圧縮データでは1回ごとのBufferCB()に流れてくるPCMの データ量は違うようです。 例えば3秒のデータを取得したいのですが、 IMediaControl->Run(); IMediaEvent->WaitForCompletion(3000, &evCode); で、確かにデータは取得できるのですが、実時間待つので リアルタイム処理ができません。 どうすれば実時間より短い時間で正確に3秒分のPCMデータを取得できますか?
3秒分だけをリアルタイム処理したいの? ソースは何を想定してるの?
クロック無視してデータをなるべく早く流したいときはフィルタグラフのIMediaFilter::SetSyncSourceにNULLを渡す。
ヘルプのReference Clocksを参照。
しかし
>>83 のWaitForCompletionの使い方は何か勘違いしてる予感。
シューティングゲームなどで複数の効果音を連続で再生させるような場合、 DirectShowは不向きですか?
DirectSound or OpenALでおk。つーか調べろ。
88 :
デフォルトの名無しさん :2008/10/27(月) 03:21:32
>>84 3秒と書いたのは、任意の時間分のデータを取得したかったので、
とりあえず3秒としただけなんです。 エフェクト用のバッファが0.5秒なら0.5秒だったりします。
ソースはDirectShowで処理できる任意の音楽データです。
>>85 Reference Clocksを参照してみます。
IMediaEvent->WaitForCompletion(3000, &evCode); には特に意味はありません。
IMediaEvent->WaitForCompletion(INFINITE, &evCode);ですべてのデータを取得していたのですが、
例を3秒としたので、単純に書いてみました。
>>84 ,85 返信をありがとうございました。
89 :
79 :2008/10/27(月) 19:00:43
>>82 ありがとうございました。おかげでそのエラーはなくなりました。
ただ、今度は
エラー 1 error C2146: 構文エラー : ')' が、識別子 'pName' の前に必要です。
c:\program files\microsoft sdks\windows\v6.1\samples\multimedia\directshow\baseclasses\refclock.h 80
エラー 103 error C2327: 'CBaseReferenceClock::LPCTSTR' : 型名、スタティック、または列挙子ではありません。
c:\program files\microsoft sdks\windows\v6.1\samples\multimedia\directshow\baseclasses\sysclock.h 25
のようなエラーが大量に出てきてしょんぼりな事態に陥りましたorz
これは該当するコードの部分を修正するほかないんですよね?
>>89 LPCTSTR がどこのヘッダで定義されているか検索してみるよろし
どんどんすれ違いな方向へ・・・
92 :
メモ :2008/11/01(土) 16:20:51
79の書き込みを見てビルドしてみたんだが,なんかビルド通らねえな 文字セットもマルチバイト文字セットを使用するにしたし, Windows.hもインクルードしたんだが・・・ refclock.hの80/139/178/166とsyclock.hの25行目でエラー出る 何が問題なんだろう・・・ そして79の子は投げたのだろうか?
>>79 ってサンプル?
>>82 だけど、実際にビルドできるの確認して書いたんだけど。
>>93 マジですか
Ver6.0 しか使ってなかったので
帰宅したら 6.1 で試してみよう
96 :
94 :2008/11/05(水) 19:31:47
ググってみたけど、Dshow.hが複数あって別のやつがincludeされてた、というのがあったが
97 :
95 :2008/11/06(木) 02:30:35
WindowsSDK Ver6.1 + VisualStudio2005 Standard SP1 で
>>79 がビルドを試みたと思われるサンプルフィルタ(WavDest)をビルドしてみた。
・ソリューションに「追加のプロジェクト」で BaseClasses.vcproj を追加
・WavDest→BaseClasses の依存関係を設定
という操作は別途行ったが、Debug/Release ビルドしたところ特にエラーもなくビルドできた。
graphedit でも動作することを確認。
BaseClasses をマルチバイト版の構成(Debug_MBCS/Release_MBCS) でビルドしようとすると
WavDest 側がUNICODE版の構成しかないので
>>79 のようなリンクエラーが出るのは当たり前。
>>89 >>93 のコンパイルエラーはこちらでは再現できず。(謎)
>>96 の通り別バージョンのヘッダが混じってると確かに起きそうな気はするが…。
BaseClassesのStreams.hをインクルードしたつもりが
別のStreams.hがインクルードされてしまっていたことがあった(
>>93 みたいなコンパイルエラーが出てたはず)
BaseClassesが先頭になるように、インクルードの優先順も見直してみるといいかもね。
99 :
93 :2008/11/07(金) 14:21:42
文字セットがUNICODE版じゃなかったのが問題だったぽい.騒がしてすまん
後,BaseClassesを先頭に持ってくるようにしたら,すんなりとコンパイルできた
とりあえず,BaseClassesは先頭に持ってこないとコンパイルエラーでるっぽい.
>>79 へ
97氏がやってるようにして,すべての文字セットがUNICODEであることを確認して,
追加のインクルードディレクトリでBaseClassesを先頭にしたらコンパイルは通るともう.
100 :
sage :2008/11/21(金) 15:23:39
DirectShowでデコードした動画をOpenGLのテクスチャに流し込むプログラムを書いています。 CBaseVideoRendererを派生させてOpenGLのテクスチャを更新する自作フィルタを作成し、 それは動作しているのですがパフォーマンスに不満があります。 OpenGLでのテクスチャのアップデートにはPBOを使用しているのですが、この場合アップデー トを行うバッファはOpenGL側から指示されます。 一方、CBaseVideoRendererのDoRenderSample()メソッドでは、デコードされたデータへの ポインタは前段のデコーダーから与えられます。 そのため、DoRenderSample(IMediaSample * pSample)内でpSample->GetPointer()で得られた バッファからPBOのバッファへのmemcopy()を行う必要があり、結構なオーバーヘッドとなっ ています。 OpenGLから与えられたバッファアドレスを前段のデコーダの書き出しバッファとして指定で きれば、この無意味な転送はなくなると思うのですが、こういった指定をする方法はないで しょうか? IMediaSampleではPutPointer()は使えなくなっているようですが、なにかうまくデコーダの バッファをレンダラ側から扱う方法は無いものでしょうか?
>>100 ピッチの指定ができなかったから結局は自前コピーが必要かもしれない。
自前のアロケータ(ISampleAllocator)を返してやればそれを使ってくれることもあるけど使用するとは限らない。
個人的にはFBOのほうが好きだ。PBOよりパフォーマンスがいい気がする。
まあこのくらいのメモリコピーなんて気にするな。こういう状況はよくあること。
>>101 情報ありがとうございます。
無理っぽいですか・・。
とりあえず、教えていただいたアロケータ関連を調べてみます。
運よくつかってくれればラッキーってことで。
処理すべき、動画のサイズが4K用と馬鹿にならないサイズなので少しでも
オーバーヘッドが減るとうれしいんです。MediaPlayerClassicあたりだと
そこそこのフレームレートで再生されていますし。
あと、ここでする話しじゃないですけど、PBOを使用しているのは、
テクスチャとしてポリゴンに貼り付けて使いたいからです。
FBOでもテクスチャの転送用として使えるんでしょうか?
ふと思ったけどPBOじゃなくて普通に受け取ったサンプルのバッファでglTexSubImage2Dするのが簡単だな。コピー量同じじゃね? FBOは主にオフスクリーンレンダリング用途だけど↑の理由から使う意味があんまりない。どっちかというと逆の用途用。 以前ベンチマークしてみたことがあるんだが、FBO実装のほうが速い結果を得た。 ついでに将来的にPBOは消えるというかサポートされなくなる話も聞いたり。
IBasicVideo の GetCurrentImage を使って、 ビデオのワンフレームをビットマップとして保存しようと思っているのですが、 ソースが mpeg2 の場合だと何故か真っ黒なビットマップしか取得できません。 ソース、取得するフレームの位置、mpeg2 video decoder を色々変えて試してみたのですが、 結果は変わりませんでした。 ソースが avi, wmv, mpeg1 の場合は正常なビットマップを取得でることを確認済みです。 このことについて何かご存知の方おられましたらご教示お願いします。 試した mpeg2 video decoder は次のものです。 MpegVideoDecoder PIXELA, Cyberlink Video/SP Decoder
上に便乗なんですが、GetCurrentImageでバッファサイズを取得すると40バイトほど大きくなってしまいます。 まあ、使った動画がどちらも160×112の動画なので、他の場合はどうなるのか分からないんですが この大きくなってしまうのは何が原因と考えられるのでしょうか?
>>102 OpenGLは詳しくないんで
>>103 氏のコメントで正しいんでしょうが、
>>101 でも触れられている通りデコーダがテクスチャのピッチ通りに
データを吐けるとは限らない(というか多分無理)ので、
デコーダから直接書き出すのはかなり難しいでしょう。
(デコーダもデコーダでいろいろ高速化の制約を受けてたりするし)
>>104 IBasicVideo::GetCurrentImageはいろいろ制約が多いそうなので、
ちょっと面倒でもSampleGrabberを使ってみることをお勧めする。
なあに、慣れれば大したことないから。
(参考)
ttp://www.geekpage.jp/programming/directshow/samplegrabber.php あと、サンプルのDumpフィルタベースで自前キャプチャフィルタを作ったこともある。
SampleGrabberより敷居高いのでお勧めしないけどw
>>105 IBasicVideo::GetCurrentImageのドキュメント読むべし。
> メソッドが成功すると、バッファには BITMAPINFOHEADER 構造体、Win32 BITMAPINFO 構造体に定義されている
> パレット エントリおよびビット マスクを含む DIB イメージ全体が書き込まれる。
だぞ。
40バイトってBITMAPINFOHEADERのことじゃないか?
107 :
104 :2008/11/22(土) 00:22:43
>>106 情報ありがとうございます。
自前で作られたフィルタは IBasicVideo や ISampleGrabber を使うより効率よさそうですね。
うらやましい限りです。
実は ISampleGrabber を使ったことがあります。
そのときは、参考ページの geek さんの方法と同じく、
ISampleGrabber を RGB24 で SetMediaType しました。
すると、ソース が mpeg2 で video decoder が Cyberlink の場合だと、
ISampleGrabber が繋がらなかったのであきらめてしまいました。
Cyberlink の output pin が RGB 出力に対応していないのが原因というところまでは分かりました。
再び質問で申し訳ありませんが、
[Cyberlink S/P decoder] -> [ISampleGrabber]
↑を実現するためにはどうするのがいいでしょうか?
1. video decoder と ISampleGrabber の間に適当な color space converter をかます
2. ISampleGrabber の入力ピンの対応フォーマットを増やす(例えば YUY2)
3. それ以外の何か
108 :
106 :2008/11/22(土) 00:43:00
>>107 CyberlinkのデコーダとSampleGrabberはどうやって繋いだんでしょう?
ピン同士を繋いで勝手にColor Space Converterが挿入されなかったとしたら
Color Space Converterが受け入れられないYUVフォーマットで出力されている可能性がありますね。
Cyberlinkのデコーダがサポートしている出力フォーマットを知るのが先決ですかね。
とりあえずDumpフィルタをデバッグビルドして、grapheditで接続してみる、
そのときgrapheditのプロセスにアタッチしてDumpフィルタのCheckMediaTypeでbreakかけて
待ち伏せればサポートしている出力ピンのメディアタイプが分かるかも。
(もっと楽な方法もありそうですが、言葉にするほど面倒なことでもないです)
YUV→RGBを自前でできるならYUY2なりYV12なりで受けるのもアリですね。
ところでgrapheditでCyberlinkのデコーダ使って普通にMPEG-2を再生できてます?
110 :
104 :2008/11/22(土) 01:31:07
>>106 > ところでgrapheditでCyberlinkのデコーダ使って普通にMPEG-2を再生できてます?
改めて確認したところ正常に再生できています。
> CyberlinkのデコーダとSampleGrabberはどうやって繋いだんでしょう?
GraphBuilder に SmapleGrabber を追加し、RenderFile しました。
> Cyberlinkのデコーダがサポートしている出力フォーマットを知るのが先決ですかね。
Cyberlinkのデコーダがサポートしている出力フォーマットは下記の graphedit による方法で調べました。
(おっしゃる通りに CheckMediaType で調べるべきでした。)
graphedit 上で Cyberlink のデコーダが含まれる形でグラフを作成し、
Cyberlink のデコーダの output pin に繋がっている接続を解除させます。
Cyberlink のデコーダの output pin を右クリックし、pin propertis を選択、
現れる Preferred Media Types と書かれたタブの内容から
Cyberlinkのデコーダがサポートしている出力フォーマットを判断してしまいました。
> YUV→RGBを自前でできるならYUY2なりYV12なりで受けるのもアリですね。
誰かが効率的で高品質なもの作っているはずですので、できれば避けたいですね。
Geekなページを参考にDirectShowを勉強してみようと思ったのですが、 『GraphEdit』が見つかりません もしかして、今はGraphEditは無いのでしょうが?
あ・・・れ・・・? もしかしてインストールするのを間違えたという事なんでしょうか? アンインストールはSDKのフォルダを削除すればいいんですよね?
SDKのbinの中にあるよ
若干スレ違いかもしれませんが、お邪魔します。 他人の作ったVMRを利用した動画再生ソフトの再生画面に、自前の絵・文字を合成したい場合、 CoCreateInstanceをAPIフックして、IBaseFilterが作成される時にIVMRMixerBitmapを勝手に作成 という流れで問題はないでしょうか? 試してみたところ、一応思い通りには動いてくれているようなのですが、 APIフックやDirectShowに対する知識があまりないため、もっと簡単にやる方法があるんじゃないかとか、 この方法だと(予期せぬ)問題が生じるんじゃないかとか思っているのですが、 そのあたりのご意見いただければ幸いです。
116 :
105 :2008/11/22(土) 22:45:15
>>106 どうもありがとうございました。コピペしたのでそこに気づいてませんでした・・・ww
DirectShowにもっと簡単にやるという概念などない ひたすら泥臭い
118 :
106 :2008/11/23(日) 00:42:04
>>110 乗りかかった船ついでに、ちょっと調べみた。
手元にあったDVDソフトがPowerDVD 6(for OEM)で確かに[Cyberlink S/P decoder]が
インストールされました。
ざっくり確認したところ、SubType = {1B81BE0C-A0C7-11D3-B984-00C04F2E73C5}
すなわち DXVA_ModeMPEG2_C というフォーマットで出力されるようです。
私もまだ勉強不足ですが、DXVAに依存した形式なのか、自分の過去の経験でも
普通のYUVフォーマットとしては扱えなかった気がします。
おそらく、DXVAでYUV→RGB変換をするコードを書けば解決するような気がしますが、
まあ、ちょっと面倒かもしれませんねえ。
(個人的にはDXVAでYUV→RGB変換するモジュールを自作したいところなんですが)
デコーダのハードウェアアクセラレータの設定を切ると大丈夫、 とかないかな。
120 :
106 :2008/11/23(日) 07:28:16
ソレダ!! 後でやってみよう
121 :
106 :2008/11/24(月) 00:28:42
いやはや、普通に "Use Hardware Accelerator" というオプションがありましたな。 それを切ればYUY2で接続することができました。 [Cyberlink S/P decoder]のプロパティ設定方法については調べていません。 おそらくIPropertyBagインターフェイスが実装されていると思うんですがどうなんでしょう? では、おやすみなさいませ
122 :
104 :2008/11/26(水) 01:13:25
106 さん、色々と調べてくださりありがとうございます。
私なりに解決方法を模索した結果、
CBaseVideoRenderer から派生したとある video renderer を
カスタマイズすることで問題を解決させました。
その video renderer は私が望んでいた大抵の条件を満たすものとなりました。
出処と詳細については申し訳ありませんが記せません。
SampleGrabber を使わなかった理由は、
これにもいくつかの制限があったからです。
ttp://msdn.microsoft.com/en-us/library/ms786693 (VS.85).aspx
フィルタを登録する時はどうすればいいんですか? CComPtr<IBaseFilter> WAVE_Filter; WAVE_Filter.CoCreateInstance(CLSID_MPEG1Splitter); // ここでエラー DS_graph->AddFilter(WAVE_Filter, _T("aaaa"); フィルタ CLSIDの項目をいれたんですが、)が無いとか言われるんです。
すいません)がありませんでした
125 :
デフォルトの名無しさん :2008/12/03(水) 04:22:24
オーディオデータをファイルに書き込むにはどうすればいいですか? RenderFileでグラフを作成した後Default DirectSound Deviceを FileWriterフィルタに置き換えてRunする AddSourceFilter追加、FileWriterフィルタ追加、この2つをConnectで自動補間接続後Run 繋がるフィルタが無いと言われてしまいます。流れを教えてください。 今のところこれが一番きれいですが、無いと言われてつながりません。 お願いします。教えてください。 CComPtr<IGraphBuilder> DS_Graph; CComPtr<IMediaControl> DS_Control; CComPtr<IMediaEvent> DS_Event; CComPtr<IBaseFilter> DS_Source; CComPtr<IBaseFilter> DS_FileWriter; CComPtr<IFileSinkFilter> DS_FileSink; hr = CoInitialize(NULL); hr = DS_Graph.CoCreateInstance(CLSID_FilterGraph); hr = DS_Graph.QueryInterface<IMediaControl>(&DS_Control); hr = DS_Graph.QueryInterface<IMediaEvent>(&DS_Event); hr = DS_Graph->AddSourceFilter(fullPath, L"Source", &DS_Source);// ソースフィルタの追加 CComPtr<IPin> p; hr = DS_Source->FindPin(L"Output", &p);// ソースの出力ピン hr =DS_FileWriter.CoCreateInstance(CLSID_FileWriter); hr = DS_FileWriter.QueryInterface<IFileSinkFilter>(&DS_FileSink); hr = DS_FileSink->SetFileName(L"E:\\WavFile.wav", NULL); hr = DS_Graph->AddFilter( DS_FileWriter, L"FileWriter" );// ライタフィルタの追加 CComPtr<IPin> pin; hr = DS_FileWriter->FindPin(L"in", &pin);// ライタの入力ピン hr = DS_Graph->Connect(p, pin);// ピン接続 hr = DS_Control->Run();
FileWriterは AVI ファイル用だったきがす。mux挟まないと駄目。 Waveファイル出力フィルタは標準で存在しない。SDKに WavDest というサンプルがある。 まずはドキュメントを一通り読むことだ。
ためしにAVIMuxを間に入れたらAVIのファイルコピーができあがりました。 ずっと行き止まりで助かりました。 ありがとうございました。
128 :
デフォルトの名無しさん :2008/12/10(水) 21:39:36
再生中の動画から静止画をキャプチャしてDirect3Dのテクスチャに書き込みたいんですが、 どうやって画像を取得すればいいですか?なるべく高速に動作する方法を使いたいです。 ビデオウィンドウも表示されないようにしたいです。
GraphEditで色々遊んでみな
MSのDirectShowのドキュメントは何処にあるんですか? MSDNで検索してもいいんですが、インターネットに接続できないことが多いので・・・
132 :
デフォルトの名無しさん :2008/12/14(日) 16:41:58
すいません。質問です mpeg2デコーダの出力ピンがDirectX Video Acceleration (DXVA)でビデオレンダラに接続されている状態で、 自作した変換フィルタをその出力ピンとビデオレンダラの間に接続したいのですが、何か方法ありますか? 変換フィルタの入力ピンのMediaのSubTypeがRGBやYV12では接続できませんでした DXVAのビデオアクセラレーションが効いている状態では変換フィルタを接続することはできないということでしょうか?
GraphEditで色々遊んでみな
134 :
130 :2008/12/14(日) 21:26:54
>>131 ありがとうございます。Windows SDKのWeb Installで
Documantation→Win32 and COM
を選択すればOKですね?
すいません、また質問です。
Windows Headers and Libraries→HeaderFilesとx86 Libraries
を選択しておけば問題ないと思ったんですが、IA64やx64のLibrariesや
.NET Development Toolsも入れろといってきましたが無視して大丈夫ですか?
これを入れる前に、前のバージョンはプログラムの追加と削除から削除したはずなのに
C:\Program Files\Microsoft SDKs\Windows\V6.0
C:\Program Files\Microsoft SDKs\Windows\V6.0A
が残っていたので手動削除しましたが、これも間違ったことをしたのではないかと不安です。
>>133 GraphEditでいろいろ遊んでみました
DXVAを使うmpeg2デコーダの場合は「接続に必要な中間フィルタの組み合わせが見つかりませんでした」で変換フィルタが接続できませんでした
DXVAを使わないmpeg2デコーダにすれば変換フィルタを入れられるのですが、ハードウェアの再生支援がなくなるのでCPU負荷が高くなります・・・
DXVAを使うデコーダのメリット値が一番高い場合、自動的な組み合わせではなく、変換フィルタと接続できるデコーダを自力で探さないといけないのが少々面倒ですね
H264のデコーダでもDXVAが使われることがあるので、DXVAに対応させるように変換フィルタを組み合わせるのは結構大変ですねオワタ\(^O^)/
136 :
130 :2008/12/14(日) 22:02:30
Streams.hも探しているんですが無いです・・ いったい何処にあるんだ亜!
>>136 Streams.h は Microsoft Platform SDK のサンプルの下にあるよ
例)C:\Program files\Microsoft SDKs\Windows\v6.0\Samples\Multimedia\DirectShow\BaseClasses
サンプルを要らないと思って消すと見つからなくなるわな
>>130 こんなとこで、クダまいてないで、ググったほうが早いぞ。
手当たり次第に見ていけば環境構築について書いたHPくらいすぐ見つかるじゃろ。
というか、テンプレの関連サイトくらいは全部のぞいとくべし。
139 :
130 :2008/12/15(月) 23:49:30
すいません、どうすればいいか分かりません・・ ------ ビルド開始: プロジェクト: d3dsetup9, 構成: Release Win32 ------ コンパイルしています... cl : コマンド ライン warning D9035 : オプション 'Wp64' の使用は現在推奨されていません。今後のバージョンからは削除されます。 movietex.cpp .\movietex.cpp(30) : warning C4995: '_vsntprintf': 名前が避けられた #pragma として記述されています。 .\movietex.cpp(30) : warning C4995: '_vsnprintf': 名前が避けられた #pragma として記述されています。 .\movietex.cpp(30) : warning C4996: '_vsnprintf': This function or variable may be unsafe. Consider using _vsnprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. C:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h(358) : '_vsnprintf' の宣言を確認してください。 main.cpp d3dsetup9.cpp .\d3dsetup9.cpp(260) : warning C4995: 'sprintf': 名前が避けられた #pragma として記述されています。 .\d3dsetup9.cpp(260) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. C:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h(366) : 'sprintf' の宣言を確認してください。 2ddraw9.cpp コードを生成中... リンクしています... movietex.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall CBaseVideoRenderer::CBaseVideoRenderer(struct _GUID const &,char const *,struct IUnknown *,long *)" (??0CBaseVideoRenderer@@QAE @ABU_GUID@@PBDPAUIUnknown@@PAJ@Z) が関数 "public: __thiscall CMovieTexture::CMovieTexture(struct IUnknown *,long *)" (??0CMovieTexture@@QAE@PAUIUnknown@@PAJ@Z) で参照されました。 Release/MovieTexture.exe : fatal error LNK1120: 外部参照 1 が未解決です。 ビルドログは "file://d:\MovieTexture\Release\BuildLog.htm" に保存されました。 d3dsetup9 - エラー 2、警告 6
C/C++でプログラム書いたことあるのか???
>>135 mpeg2デコーダとDXVAの間に自作フィルタ入れたいんだよね?
サンプルでさ、NullNullフィルタだかNullInPlaceだか名前忘れたけど
何にもしないフィルタがあるんだわさ。
そいつを改造してmpeg2デコーダとDXVAに入れてみるといいよ。
改造内容はどのメディアタイプで繋がるのかログでも吐かせりゃいいべさ。
言い忘れた。 >mpeg2デコーダの出力ピンがDirectX Video Acceleration (DXVA)でビデオレンダラに接続されている状態で 一回接続させた後に接続解除して、Nullフィルタ繋ぐんだわさ
>>139 Expressだとatlmfcがないから無理
146 :
130 :2008/12/16(火) 15:07:14
>>144 そうすることにします・・
皆さん回答ありがとうございました。
フレーム単位でシークするのってどうやるの? SetTimeFormatでTIME_FORMAT_FRAMEを指定したら E_NOTIMPLが帰ってきて使えないんだが
自分でフレーム数をMediaTimeに変換してシークする。 かな。
149 :
147 :2008/12/22(月) 22:57:00
・再生処理に使う時間が充分あれば等速で再生し、 間に合わない場合は再生速度を遅くする (つまり、一切フレームスキップをしないようにしたい) ・音声をリアルタイムに加工、出力する この2つを実現するにはどうする?
151 :
デフォルトの名無しさん :2008/12/22(月) 23:06:15
かなり下がったし、age
C++で作ったフィルタをC#から使うのってどうやるの? 検索しても出ない
>>152 フィルタを使うじゃ抽象的過ぎてわからんよ。
手とり足とりということです
DShow.NETがあるやん。
もちろん、DirectShow自体COM Interopでもなんとかなるはず。
157 :
152 :2008/12/23(火) 22:01:42
1.CBaseVideoRendererを派生させてOpenGLのテクスチャに ムービーを書き込むクラスをC++で作る 2.C#でWindows FormsでGUIを作る 3.C#でDirectShow、OpenGLを初期化 DirectShowでグラフ構築時に1.で作ったフィルタを入れる というようなことがしたい。のだがCOMに対応したDLLの作り方が 分からない。 C#でDirectShowを使うのにはDirectShow.NETを使うつもり。
COMに対応したDLLってのは1のことか? SDKのサンプルの改造じゃだめなの?
159 :
152 :2008/12/23(火) 22:46:59
・・・どのサンプル?
SampVidとかだけど。
"C# DirectShow"でgoogle検索すると山ほど見つかるわけだが。 何を迷ってる?
DirectShowに関係ないところで迷ってるぽい
質問なのですが、HDVをDirectShowでキャプチャすることはできますでしょうか?
164 :
152 :2008/12/27(土) 22:12:10
>>160 やってみた
strmbase.lib(dllsetup.obj) : error LNK2001: 外部シンボル ""class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A)" は未解決です。
strmbase.lib(dllentry.obj) : error LNK2001: 外部シンボル ""class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A)" は未解決です。
strmbase.lib(dllsetup.obj) : error LNK2001: 外部シンボル ""int g_cTemplates" (?g_cTemplates@@3HA)" は未解決です。
strmbase.lib(dllentry.obj) : error LNK2001: 外部シンボル ""int g_cTemplates" (?g_cTemplates@@3HA)" は未解決です。
C:\Documents and Settings\ \My Documents\Visual Studio 2008\Projects\FilterDLL\Release\FilterDLL.dll : fatal error LNK1120: 外部参照 2 が未解決です。
必要そうなコードのをSampVid.cppからコピーしたけどビルドできん・・
165 :
デフォルトの名無しさん :2009/01/02(金) 21:25:16
1フレーム目を表示させてすぐ一時停止状態にするのって どうやるの?
目と指と反射神経を鍛える
普通にImediaControl::Runするとビデオが進んでしまうので そうさせない方法を
Pauseでええやん。
ライブストリーミングを保存するために 動画を再生しながらファイルにも出力しようと思っているのですが SampleGrabberで可能なのでしょうか? Web上のサンプルは静止画を切り抜くものばかりで使い方がよくわかりません・・・
170 :
デフォルトの名無しさん :2009/01/06(火) 14:40:49
指定フレームの画像を抽出しようと以下のようにすると MediaSeeking->SetPositions( ¤t, AM_SEEKING_AbsolutePositioning, &stop, AM_SEEKING_AbsolutePositioning ); ::Sleep( 50 ); // ←これないとフレーム移動する前の画像になる SampleGrabber->GetCurrentBuffer( &DIBBufferSize, (long *)DIBBuffer ); 間にSleepを入れないと指定フレームの画像にならなのですが もっと早く取る方法あったら教えてください。
>>169 可能です。
ただ、ファイル出力処理で滞ると当然コマが飛びます。
再生優先かファイル出力優先かによってコールバック内の実装をよく考えるべし。
>>170 IMediaControl::GetState()で必要最低限のウェイトを入れられると思います。
デバッグ中ならとりあえずINFINITEを入れてもいいでしょう。
172 :
169 :2009/01/06(火) 16:03:26
>>171 ありがとうございます。
IMediaControl::GetState()で最低限のウェイトにできました。
所でこれはやっぱりウェイトを入れないとダメなものなんですか?
>>174 フィルタグラフ自体は別のスレッドで動いているものなので、
スレッド間で同期をとることを考えると仕方のないことですね。
>>175 そうなんですか。
ちなみに、最初のフレームから最後のフレームまで
順番に画像を抽出したい場合は
>>170 以外の方法でもっと効率がいいやり方はありますか?
なんか知らんが、普通にエンコードする時の様にフィルタ繋げるだけでいいんでね?
やりたい事は、最初のフレームから最後のフレームまで順番に 画像を取り出すだけなんですけどね。特に動画を再生する必要はないんですが
>>176 毎フレームSetPositionsをするのは確かに効率が悪いです。
可能であればSampleGrabberのコールバックを使った方がいいでしょう。
自分は以下の記事を参考にしてコールバック処理を実装しました。
ttp://codezine.jp/article/detail/322 GetCurrentBufferに比べると結構面倒ですけどねw
しかし結局自分はSampleGrabberの実装を捨てることになってしまいましたorz
(まあどうでもいいことですが)
>>179 ありがとうございます。
参考にさせて頂きます〜
181 :
169 :2009/01/06(火) 19:14:29
>>181 そこにはキャプチャデバイスからAVIファイルに直接保存する方法が書いてありますが、
169さんの場合対象が(ネットワーク上の)ファイルからの再生だとすると
あまり参考にならないと思います。
とりあえず
>>173 で挙げたページと同じようにGraphEditでフィルタを繋いでみて、
自分の意図している動作をさせられるか、を確認してはいかがでしょうか。
ほな。
こちらはDirectShowについては全く無知な素人です。 板違いな質問かもしれませんが、ことはDirectShowに関わる問題なようなので、お詳しい皆さんお助けください。 「Virtual PC」上で、NHKオンデマンドからDLしたWMVファイルをWMPで再生を試みたところ、「DirectShow フィルタ グラフに存在しないピンに操作を実行しようとしました」と表示され、再生できませんでした。 OSはXP、WMPのバージョンは10です。 解決法について、ご教示のほど願います。
184 :
167 :2009/01/06(火) 22:10:41
185 :
169 :2009/01/06(火) 22:23:50
>>182 ライブストリーミングの場合はアドレスが「
http://IP :ポート番号」になるので
GraphEditではどうやってソースとして指定できるのかがわかりません
再生することはできたので
要は再生している動画を別ファイルに保存するというようなことをしたいのですが
簡単な方法などないでしょうか?
何度も質問ばかりで申し訳ありません
ちょいと質問なんですが。 DirectShowがまだ何かに統合する前に作ったソフトがあるのですが これ今でもDirectX9にしても普通にコンパイルできて動画がみれるのですが コンパイルできてるなら特にSDKとかなくてもいいんですよね?
VFWでコーディングされているのではないかとエスパー 試しにコードの一部でもうpしてみれ
>>188 あ、エスパー的な質問でしたか。
とりあえずファイルをオープンするところをうpります
bool Open( const char *chrFileName )
{
if( FAILED(CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&GraphBuilder )) ) return false;
if( FAILED(GraphBuilder->QueryInterface( IID_IMediaControl, (void **)&MediaControl )) ) return false;
if( FAILED(GraphBuilder->QueryInterface( IID_IMediaEventEx, (void **)&MediaEventEx )) ) return false;
if( FAILED(GraphBuilder->QueryInterface( IID_IMediaSeeking, (void **)&MediaSeeking )) ) return false;
if( FAILED(GraphBuilder->QueryInterface( IID_IVideoWindow, (void **)&VideoWindow )) ) return false;
if( FAILED(GraphBuilder->QueryInterface( IID_IBasicAudio, (void **)&BasicAudio )) ) return false;
if( FAILED(CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **)&BaseFilter )) ) return false;
if( FAILED(BaseFilter->QueryInterface( IID_ISampleGrabber, (void **)&SampleGrabber )) ) return false;
GraphBuilder->AddFilter( BaseFilter, L"Grabber" );
AM_MEDIA_TYPE mt;
ZeroMemory( &mt, sizeof( AM_MEDIA_TYPE ) );
mt.majortype = MEDIATYPE_Video;
mt.subtype = MEDIASUBTYPE_RGB24;
mt.formattype = FORMAT_VideoInfo;
if( SampleGrabber->SetMediaType( &mt ) != S_OK ) return false;
WCHAR buff[512];
::ZeroMemory( buff, sizeof( buff ) );
::MultiByteToWideChar( CP_ACP, 0, chrFileName, strlen(chrFileName), buff, sizeof(buff) );
if( FAILED(GraphBuilder->RenderFile( buff, NULL )) ) return false;
if( PlayWnd != NULL ){
VideoWindow->put_Owner( (OAHWND)PlayWnd );
VideoWindow->put_WindowStyle( WS_CHILD|WS_CLIPSIBLINGS );
if( FormWnd && MediaEventEx->SetNotifyWindow( (OAHWND)FormWnd, WM_GRAPHNOTIFY, 0 ) != S_OK ) return false;
}
if( SampleGrabber->GetConnectedMediaType( &mt ) == S_OK ){ pVideoHeader = (VIDEOINFOHEADER *)mt.pbFormat; BITMAPINFO BitmapInfo; ZeroMemory( &BitmapInfo, sizeof( BitmapInfo ) ); CopyMemory( &BitmapInfo.bmiHeader, &(pVideoHeader->bmiHeader), sizeof( BITMAPINFOHEADER ) ); hBitmap = CreateDIBSection( 0, &BitmapInfo, DIB_RGB_COLORS, &DIBBuffer, NULL, 0 ); DIBBufferSize = mt.lSampleSize; SampleGrabber->SetBufferSamples( TRUE ); } if( MediaSeeking->SetTimeFormat( &(TIME_FORMAT_FRAME) ) != S_OK ) return false; return true; } こんな感じなのですが・・・
おおう、エスパー失敗w 普通にDirectShowね。 「まだ何かに統合する前」てActiveMovie時代のことを言ってるのかな? 当時はActiveMovie SDKのインストールが必要でしたね。 Visual Studio .NET 2003辺りならPlatform SDKのサブセットみたいなのが 同梱されていたと思うので、特にSDKを追加する必要はないはず。 2005以降だとEEであればPlatform SDKかWindows SDKのインストールは 必要になると思いますです、ハイ。
>>191 これDirectShow使うのに必要なのって
ヘッダファイル
DShow.h
QEdit.h
と
strmiids.lib
とDirectXがインスコされていればいいだけですよね?
>>192 プログラムとしてインクルード/リンクすべきファイルはそんなもんですが、
各ヘッダからやはり別のWindows(Platform) SDKに含まれるヘッダを
インクルードしている形跡もあるので、注意は必要かと思います。
まあ、コンパイルしてみれば分かることですけどね。
>>193 あ、そっか、そうですよね。
とりあえず今は普通にコンパイルが通るって事は
以前にインスコしたのがあるからなんですね。
Visual Studio 2008 Standard EditionってSDK入れないとダメですか? 何かExpressは同封されてるって書いてるんですが・・・
されてるって書いてあるのに何故インストしない? BaseClassesの方ならStandardのSDKにすら入ってないよ。 いつもどうり別途Windows SDKが必要。
ExpressじゃなくてStandardだから。 Standardはどうなのか知りたかった
198 :
184 :2009/01/09(金) 21:51:03
>>184 そのままの意味だ。RunしないでPause。
201 :
184 :2009/01/09(金) 23:53:34
しかし なにもおこらない Runして初めて表示される・・
oops!レンダラ自作してるのか。悪かった。 Pauseでポスターフレーム出す処理はレンダラが実装する必要があるんだわ。 void OnReceiveFirstSample(IMediaSample *pMediaSample) { DoRenderSample(pMediaSample); } これ追加するとよかばってん
おー、OnReceiveFirstSampleってそうやって使うんか。 184じゃないけどthx
204 :
169 :2009/01/12(月) 19:29:05
205 :
デフォルトの名無しさん :2009/01/12(月) 22:51:43
これ使って作ったツールはWindows2000でも動くかな?
>>204 RenderFilleやっちゃいかん。
ソースフィルタ(URL)をフィルタグラフに登録したあと、
出力ピンを列挙してAVI Muxに1つずつ接続すればおk
たぶん。
あ、あとファイル出力も手動で指定してフィルタ繋いでね。
207 :
169 :2009/01/13(火) 06:56:07
なんでエラー値をチェックしないの?
>>206 さんのアドバイスが理解されていない・・・・
211 :
169 :2009/01/13(火) 18:38:16
あー見返すとなんか滅茶苦茶ですね 一から書き直してきます
サンプルをビルドして動いたからと言って 安易に一歩踏み込むとすぐに樹海に迷い込むのがDirectShow。
214 :
169 :2009/01/13(火) 22:44:13
確かに、GraphEditの様子をそのままコードにしてくれるツールがあったら欲しいな。
>>214 MSDNの通りにプログラムが書けてない。
IGraphBuilderはCoCreateInstanceしない。
ICaptureGraphBuilder2からGetFiltergraphで取得する。
>>216 なるほど
hr=CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,
CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2, (void **)&pBuilder);
hr=pBuilder->GetFiltergraph(&pGraph);
こういうことですね
しかしこうやってもGetPinがコンパイルを通らないのは変わらず
そこをコメントアウトして実行すると
hr=pGraph->AddFilter(pAVIMux,L"AVI Mux");の部分で
例外が出て終了する様になりました
これもコメントアウトしたばあいは前回と変わらず解像度と再生時間のみ正しい
再生されない動画ファイルが作成されるだけでした・・・
なんだそのGetPinってのはどこからでてきた?自作メソッドなのか?
>>218 これ使ってピン同士を接続するのかなと思ってコピペしてきたら
ただの自作メソッドでした
早とちりしてすみません
削っても動かないことに変わりはないのですが・・・
>>219 もう少し頑張って勉強してからまたおいで。
エスパーじゃないから、そんなんでコンパイル通らないとか言われても困るわ。
VideoWindow->put_OwnerでVFW_E_NOT_CONNECTEDが返ってくるのですが・・・ if( FAILED(CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&GraphBuilder )) ) return false; if( FAILED(GraphBuilder->QueryInterface( IID_IMediaControl, (void **)&MediaControl )) ) return false; if( FAILED(GraphBuilder->RenderFile( buff, NULL )) ) return false; if( FAILED(GraphBuilder->QueryInterface( IID_IVideoWindow, (void **)&VideoWindow )) ) return false; if( VideoWindow->put_Owner( (OAHWND)PlayWnd ) == S_OK ){ ←ここでS_OKにならない VideoWindow->put_WindowStyle( WS_CHILD|WS_CLIPSIBLINGS ); if( FormWnd && MediaEventEx->SetNotifyWindow( (OAHWND)FormWnd, WM_GRAPHNOTIFY, 0 ) != S_OK ) return false; } PlayWnd をNULLにしてもS_OKにはなりませんでした。 何が原因でしょうか?
222 :
221 :2009/01/15(木) 19:18:33
対象コンピュータをx64にしてたらエラーがでてx86にすると正常に通りました>< ちなみに上記のコードの後に読み込みと同時に1フレーム目を表示されようと MediaSeeking->SetPosition ←上のコードには書いてないですが今はQueryInterfaceしてます MediaControl->StopWhenReady(); VideoWindow->Visible( OATRUE ); を入れたのですが、何故か1回目の読み込み時には表示されず 2回目以降に表示されるのですが、何が原因ですか?
C++で作ったフィルタをC#で使いたいんですが 作ったフィルタをregsvr32で登録しないで使う方法ってありますか? 登録するのは(ユーザーにとって)面倒だし クラスの型がIBaseFilterにしか出来ないので アプリケーション側からデータを渡したり出来ません。
その程度の事もわからないお前には無理だ。 C#のCOMのラッピングのメカニズムも理解できていないんだろ?
Wevdestサンプルで、RenderFileで作成したグラフを最後のDefault DirectSound Deviceだけ切り離して付け替える時 RemoveFilterに失敗します。処理は正常なのですが、RemoveFilterはなぜ失敗なんでしょうか? この行をいれないとRunで失敗するので入れてるんですが、失敗してるのに意味があるんでしょうか? CComPtr<IBaseFilter> DS_DefaultDirectSoundDevice; hr = DS_graph->FindFilterByName(L"Default DirectSound Device", &DS_DefaultDirectSoundDevice); hr = DS_DefaultDirectSoundDevice->FindPin(L"Audio Input pin (rendered)", &pin_DefaultDirectSoundDevice); hr = pin_DefaultDirectSoundDevice->ConnectedTo(&pin_DefaultDSDeviceTo); hr = pin_DefaultDSDeviceTo->Disconnect(); hr = DS_graph->RemoveFilter(DS_DefaultDirectSoundDevice); hr = DS_graph->ConnectDirect(pin_DefaultDSDeviceTo, pin_WaveDest_In, NULL);
226 :
デフォルトの名無しさん :2009/01/15(木) 23:39:31
もはや時代はMediaFoundation
>>225 エラーコードは何ぞ?
試してないから外してるかもしれないけど、
pin_DefaultDSDeviceToをReleaseしてないから、ってなオチはない?
hr = pin_DefaultDSDeviceTo->Disconnect(); hr = pin_DefaultDirectSoundDevice->Disconnect();
エラーなくなりました。 フィルターを削除する時繋いであったピンを解除。 繋ぎ換えるのにも解除後接続ですね。覚えました 意外と融通きかないんですね・・・ ありがとうございました。
wmvが登場したとき wmvのコンテナに対応したソースフィルタを 書けと言われたときはくらくらと眩暈がした。
231 :
デフォルトの名無しさん :2009/01/16(金) 12:36:29
ふうん
1フレーム毎にイベントを取りたいのですが イベント通知コードは何になるんですか?
233 :
221 :2009/01/16(金) 15:57:23
>>222 で最初のフレームが表示sれないって話なんですが
どうやら一瞬表示してるみたいで
VideoWindow->Visible( OATRUE );の下にSleep( 1000 );と入れると
1秒間最は初のフレームを表示して、1秒後に消えてしまいます。
そして2回目に
>>221 を走らせた時はずっと最初のフレームを表示した状態になります
何が原因でしょうか・・・
234 :
221 :2009/01/16(金) 16:11:44
わかりました。 どうやらStatic Textに描画されてるのがまずかったみたいです。 Picture Controlにしたら消えなくなりますた。。。 なにこれ・・・
Windowsの描画の基本的な所を理解していないのが問題
>>235 が基本を教えてくれるそうです。
では、どうぞw
他人が理解できる説明の仕方を意識しよう。あと、日本語を学べ。
238 :
デフォルトの名無しさん :2009/01/19(月) 09:02:44
ではまず国語辞典を勉強したらよろしいでしょうか?わかりません><
単語を覚えるだけでは言語を会得できないな。 日本語でも英語でもプログラミング言語でも。
GetConnectedMediaTypeでVFW_E_NOT_CONNECTEDが返って来るのですが原因は何でしょうか? その前にやってるSetMediaTypeはちゃんとS_OKが返ってきてます。
VFW_E_NOT_CONNECTED だから 繋げろ!
>>241 言い忘れてましたが、VFW_E_NOT_CONNECTEDが出るのはGetConnectedMediaTypeだけで
他は普通にOKなので動画の再生はできています。
再生にサンプルグラバは関与してますか? そうでなければ別にサンプルグラバが繋がってなくても再生に支障はありませんよ。 少々面倒でもROTを登録して外部からフィルタグラフを覗けるようにしておくと デバッグが便利ですよ。
244 :
243 :2009/01/19(月) 18:52:57
× ROTを登録 ○ ROTに登録
>>243-244 やりたい事はと言うと、再生して指定フレームの画像をbmpとして保存したかったのです。
その為にサンプルグラバでAddFilter後にビデオヘッダを取得したりと・・・
とりあえずGraphEditでみてみようとおもいます・・・
ちなみに、同じソースを別PCで動かすとGetConnectedMediaTypeでエラーはでませんし
正常にbmpファイルに落とすことができています。
>指定フレーム フレームで指定ってできるんだっけ? ○番目のフレームとか。
つSetPositions とはいえ、TIME_MEDIA_TIMEしか使えないストリームだと ちょっと難しいけど。
SetPositionsって時間指定じゃん
TIME_FORMAT_FRAMEを指定してから使うよろし。
>>247 でも書いてるけど、すべてのストリームでTIME_FORMAT_FRAMEが使えるとは限らない。
本格的にやるならDESを使うんですかね。
自分はやったことないので分からないですが。
コーデックの関係でSampleGrabberでの画像抽出ができずBasicVideoを使っているのですが BasicVideoのGetCurrentImageで画像を取ると3秒もかかってしまうのですが これをもっと早く取る方法ってありますか?
ムリポ 「コーデックの関係でSampleGrabberでの画像抽出ができず」辺りを もう少し詳しく話した方が、いい話が聞けるかもよ?
>>251 そうですね。失礼しました。
カノープス社のコードックであれしてるaviファイルから静止画を取りたいのですが
これが何故かSampleGrabber->GetConnectedMediaTypeでエラーになるんです。
ちなみにほかのaviファイルでは正常に静止画が取得できています。
それで試しにBasicVideoで静止画と取ってみたら取れたのですがこれが遅くて・・・
小出しはやめてね
カノープスのコーデックといってもHQとかMJPGとかいろいろある
HQです。 今色々試してたんですが、SetMediaTypeするときの サブタイプをMEDIASUBTYPE_RGB32にすると GetConnectedMediaTypeでエラーが出ずに通ったのですが・・・ これすると、映像がさかさまになってる・・・
---------------------------------------------------------------------------
可能な限り速くコマ送りするのってどうするんですか?
IVideoFrameStepを使うと1倍速以上にはならないし、逆方向には進めません。
独自レンダラでレンダリングした画像を
加工して1コマずつ連番BMP出力したいだけなんですが。
(将来的にはDirectShowを使った出力も実装したいが、取りあえずBMPで)
>>255 memcpyを使って画像を自力で反転するしかないのでは。
(画像の横幅*4byteのサイズでコピーを繰り返す)
4byteなのはMEDIASUBTYPE_RGB32で32bitの画像と指定したからです。
もしRGB24なら3byteです。
>>255 BITMAPINFOHEADERか何かで上下反転してるかどうかの判定は
可能じゃなかったかな?
>>257 SampleGrabberを使ってた時の経験だけど、SetSyncSource(NULL)では
うまくいかなくて、SetRateで適当に100倍くらいを設定して全力取得したり
したことはあります。ただ、コーデックによってはうまくいかないかも。
MIDIをWAVEに変換する方法はあるんでしょうか? 再生される以上どこかで電圧値に置き換わってると思うんですが、サウンドボードで変換されてるんですか? MIDIデフォルトOUTを置き換えても不可能でしょうか?WAVE関連のものに置き換えできませんでした
>>256 いえRGB32にすると映像の方がさかさまになるんですよ。
RGB24にすると映像は正常なのですがGetConnectedMediaTypeでエラーになりまふ
>>258 あ、そうなんですか?
ちょっとヘルプみてみます。
>>261 ありがとうございます。
しかしbiHeightが負で判別できた場合はどうやって映像を正常に表示できるんでしょうかこれ。
ん? レンダリング結果も上下反転してるの? BMPに保存したときだけじゃなくて?
BMPファイルのヘッダの高さもそのままマイナスにすれば普通は問題ない まれに対応していないソフトもある
>>263-264 静止画は正常で動画の方が逆になるんですよね・・・
でもRGB24にすると動画は正常になるけど
GetConnectedMediaTypeでエラーになって・・・
それがDirectShowの仕様です
全フレームの画像を取得したいのですが SetPositionsでフレームを移動して取ると時間がかかるので もっと効率的な方法はどうしたらいいですか?
>>259 WavDestとFileWriterでよかばってん
>>267 ストリーム流しながらのサンプルグラバでよかばってん
ばってん何?
270 :
257 :2009/01/23(金) 22:24:25
>>258 SetRateは(貴方が書いているように)コーデックによっては使えないので・・
SetSyncSource(NULL)しても再生は別スレッドで行われているのに
どうやって
レンダリング→BMP出力→レンダリング→BMP出力→...
のように同期させられるんでしょうか。
基本的な事だけどpushとpullモデル理解しているか?
>>257 サンプルグラバとNullRenderer使えよ
273 :
257 :2009/01/23(金) 23:17:54
MSのドキュメントも読んでいないなんて死んだほうがいい
>>268 ダメです、MIDIParsaとWevDestがつながりません。
pMediaType->SetType(&MEDIATYPE_Midi);
の変更もしてみたんですがダメです。グラフエディタでつながらないと出ます
お願いします
>>275 情報少なすぎてわかるわけがないよ。エスパーじゃないし。
わかるように書いてよ。
MIDIのトランスフォームフィルタを自作するか見つけてくる必要がある。
まったく作れそうな気がしません 音源はどこから引っ張ってくればいいんですか?
279 :
267 :2009/01/26(月) 11:45:44
>>268 再生しながらはどのようにゲットすればいいですか?
イベントですか?
でもイベントでは1フレームずつ入ってこなかったしなあ
コールバックですよコールバック このスレでも何度か話題に出てるんで探してみれ
281 :
デフォルトの名無しさん :2009/01/29(木) 21:59:01
COutputQueueを使ってコマ送りって可能?
282 :
デフォルトの名無しさん :2009/01/30(金) 13:26:27
サンプルグラバのGetCurrentBufferで静止画を取得する時に 動画サイズのまんまではなくて縮小して取得したい時はどうしたらいいですか?
自分で縮小でも拡大でも好きにすればいいんじゃない?
284 :
デフォルトの名無しさん :2009/02/02(月) 03:20:48
複数の音楽ファイル(mp3とWMA)の一部ずつ(サビの部分)を繋いで、一つのWAVにしたいのですが、 どう作ればいいのか判りません。 最初の曲は、サビまでシークしてしてから、WAVEファイルにはできているようです。 ですが、2曲目を処理しようとすると、グラフを停止しないと、接続できないという現状です。 例えば、2つの曲をフェードインアウトで繋げる処理はどう書けばいいのでしょうか? なにかヒントやサンプルなど教えてもらえるとありがたいです。
高校の物理をちゃんと勉強していれば簡単な事なんだけどね
DESじゃないのん?
287 :
デフォルトの名無しさん :2009/02/03(火) 01:16:38
>>286 DESってDirectshow編集サービスのことですよね。
ちょっと調べてみます。 ありがとうございました。
288 :
デフォルトの名無しさん :2009/02/05(木) 14:32:39
質問です。 MP4ファイルの頭に5Kほどのデータを付加したファイルを再生する フィルターをASyncサンプルに手を加えて作りました。 GraphEditではファイルを選択して、VideoRendererとPIN接続すると、 MP4Splitterとffdshow codecが間に入り再生できます。 このファイルをGraphEditにD&Dするとはじかれます。 これをIGraphBuiderでグラフを作って再生したいのですが、 どうしても自作フィルターとMP4SplitterとのConnectで CANNOT_CONNECTが帰ってきてしまいます。 自作フィルタにファイルパスを与えてグラフに追加するという、 GraphEditでの動作をどのようにプログラムしていいのかわかりません。 方法をご存知の方、ご教授ください。 ベースとするフィルタを間違えているのでしょうか?
デバッグすりゃ原因がわかるだろ
290 :
デフォルトの名無しさん :2009/02/05(木) 15:17:29
>>289 知らないならレスしないで下さい。ウザいだけです。。
俺もデバッグすりゃ原因が分かると思う。
IGraphBuilder::RenderFile() を使っちゃってる、に1票 ・・・じゃないよね。 自作フィルタはちゃんと自前でCoCreateInstanceしてる?
あ、メリット値を適切に設定してるなら別ね。
GraphBuilderに自作SourceFilterとVideoRendarerだけ追加したら 後はRendaerFileでいいんじゃないの? そうすりゃMP4Splitterとffdshow codecが勝手に間に入るだろ
LONGLONG tmp = (LONGLONG)(frame * Renderer->getATPF()); pMediaSeeking->SetPositions(&tmp,AM_SEEKING_AbsolutePositioning, NULL,AM_SEEKING_NoPositioning); AverageTimePerFrameを使ってシークするのって駄目なんですか? たまに思った位置にシークできないファイルがあります。
296 :
デフォルトの名無しさん :2009/02/07(土) 01:54:57
ISampleGrabberについての質問です。 DirectShowでmp3を再生中にISampleGrabberのGetCurrentBufferを行うと、 再生中の場所の波形データが取得できると思うのですが、 毎回GetCurrentBufferを行っても、1秒間に約3回ほどしか取得するデータに変化がありません。 リアルタイムに現在再生中の場所の波形データを取得するにはどうしたらよいのでしょうか。
298 :
デフォルトの名無しさん :2009/02/08(日) 10:12:29
>>297 ありがとうございます。
解決しました。
質問したなら、どう解決したのか書いて欲しい。 それにしてもマルチポストなんて今時珍しいね。 回答が付いているところにも驚いた。
300 :
デフォルトの名無しさん :2009/02/08(日) 13:21:49
初歩的な質問ですが キャプチャーボードにチューナ・S端子・コンポジットがあるのですが その切り替えはDirectShowでできるのでしょうか? カメラで入力した映像を解析ソフトを作ってみたのですがWebカメラでは物足りなくて 手元にあったボードを使ってみたのですが初期でチューナーになってしまうので お願いします
映像解析ソフトを作るとはハイレベルだ
303 :
300 :2009/02/08(日) 17:55:56
できるんですね。ありがとうございます
304 :
デフォルトの名無しさん :2009/02/09(月) 09:54:17
2つの動画を同時再生したいんですが、2回同じ表示手続きをしないとダメですか?
グラフ2つ作れば良いだけの話では?
>>305 あ、すみません。
そこの所をもうちょっと教えてください。
どこか参考になるサイトとかもあったらお願いしまふ
>>306 1つのソースでレンダラ2つ出したいならスプリッタを使う。
別々のソースを表示したいならグラフビルダ2つ用意する。
>>307 別の動画を再生したいからグラフを2つ作るんですね。
それで再生とかする場合はMediaControlも2つですよね?
質問です。 IMediaDet::get_StreamLength() および get_FrameRate() で得られた値を使って 非圧縮AVIファイルの総フレーム数を取得するコードを書いていますが、 あるVista環境にて総フレーム数を間違うことがあります。 (822フレームと算出してもらいたいところ、830となったりします。) 何か特殊なフィルタがインストールされているのではないかと思うのですが、 客先環境のため、簡単にチェックできません。 とりあえず不具合回避策は準備したので緊急度は低いのですが、 このようなことが起こるケースについて何かご存知の方がいらっしゃいましたら、 ご教示ください。
>>310 ですよね。
と、言う事はやはり再生等に必要なアレは2つずつ用意しないといけないんですね。
ちなみに、同じコールバック関数を呼ぶようにした場合ってどっちの動画か見分ける術ってありますか?
>>311 アレじゃわかんない。
コールバックって何よ。ISampleGrabberCB::SampleCBだったら
パラメータのIMediaSample で区別ができるかもしれない。
が、流す動画による。
>>312 BufferCBを使ってるんです><
ちなみにアレとは
MediaControl、MediaEventEx、SampleGrabber、VideoWindowです。。。
314 :
デフォルトの名無しさん :2009/02/19(木) 17:11:04
クズ共ちょっと教えてください。 XP64ビットOSでVC2009で32ビット用でコンパイルすると正常に動画再生ができるが 64ビット用でコンパイルすると音だけでて映像が表示されないんです。 お前達のようなゴミにはわからないかもしれませんが宜しくお願いします。
VC2009
コーデック
317 :
デフォルトの名無しさん :2009/02/19(木) 17:33:45
思ったとおり役に立たないクズしかいないですね
ここはエスパー板じゃないんで、314の期待するような能力者は居ません。 もうちょっとヒントが多ければ優秀な推理マニアが現れるかもね。
だからさ、64bitプロセスには64bit版コーデックが要るんだよ。
知ってるがおまえの程度がAA略
64ビットアプリにゃ64ビットDLL(この場合コーデック)が必要という常識も知らず クズ呼ばわりってどんだけおめでたいんだ・・・。 コピペ厨房の俺でさえ知ってるわ。
323 :
デフォルトの名無しさん :2009/02/20(金) 09:56:16
>>322 その程度の知識しかないから役立たずのクズって言ってるの
だから知らないならレスするなって
64bit Windowsが普及しない原因を知ってれば、 容易に気が付くだろ。知識なんかほとんどいらね。 バカじゃねーの?
325 :
デフォルトの名無しさん :2009/02/20(金) 10:36:15
知らないからって必死になるなって
327 :
デフォルトの名無しさん :2009/02/24(火) 11:30:20
VideoWindow->put_OwnerにHBitmapを与えて再生した時に ウィンドウフレーム無しの動画が画面上に表示されるのですが これHBitmapだからそのまま変換して画像としてファイルに保存できますか?
328 :
デフォルトの名無しさん :2009/02/24(火) 12:05:30
ISampleGrabbberCBコールバックのBufferCBで受け取るDIBデータを 指定したサイズで受け取るにはどうしたらいいですか?
329 :
328 :2009/02/24(火) 15:01:36
現状では動画のオリジナルサイズになっているのですが これをVideoWindowで再生させてるウィンドウサイズと同じ大きさにしたいです
リサイズ機能なんてねーよw 普通はレンダーが勝手に表示サイズ合わせるだろ
331 :
328 :2009/02/24(火) 16:08:50
そうですか。やっぱり無いですか・・・
332 :
デフォルトの名無しさん :2009/02/24(火) 22:55:54
すみません。最近ARIBの仕様書がWebで閲覧できることをしったので、 地デジチューナーからSI情報を取得して、中身をさわってみたいと 思いました。 DirectShowでそんなかんじのことができるのでしょうか? (SIのパースまで、という意味ではなく、データセクションが 抜ければ十分うれしいです) 参考になるURLなどございましたらご教授の程お願いできますでしょうか? よろしくお願いいたします。
>328 質問の内容を十分理解せず、脊髄反射的回答しちゃうけど、 動画のリサイズはDESでできた気がするデス。
334 :
328 :2009/02/25(水) 10:01:30
>>333 あ、すみません。
DESってどんなのでしょうか?
何か参考になるサイトとかあったら教えてください><
質問失礼します。 4chの音声を同期を取りながら再生する方法を一週間ほど考えているのですが、やり方が全くわかりません。 2つのオーディオチャンネルを結合して、ステレオにするフィルタはCodeZineで見つけたので作ってみました。 ただ、これだと(当然ですが)LとRから再生されてしまうので・・・。 単純にLとL、RとRを加算して一つのステレオとして出したいのですが、どうすれば良いのでしょうか? お知恵を貸して下さい、よろしくお願いします。
意味がわからん
Codezineのサンプルソースをベースに、そういうフィルタをつくればいいじゃん。
ミキシングしたいとか?
最終的に何がしたいのだろうね? 自分でMTRつくりたいのか?w
342 :
デフォルトの名無しさん :2009/03/18(水) 03:08:51
あげ ミキシングしたいのかな?質問が意味不明
343 :
デフォルトの名無しさん :2009/03/18(水) 14:10:56
有識者の皆様に質問です。
デバッグビルド時にフィルタグラフをROTに登録しています。
ttp://msdn.microsoft.com/ja-jp/library/cc370087.aspx 以前は普通に GraphEdit から "Connect to Remote Graph" で接続できていたのですが、
今日久しぶりに当該コードをメンテナンスしようとしたら接続できなくなっていました。
[症状]
- "Connect to Remote Graph" でリストには表示される。
- 選択してOKをクリックしても、何もグラフ上に表示されず。
- 再度 "Connect to Remote Graph" でリストを表示すると、見えなくなっている。
- デバッグ実行でも、コマンドラインからの実行でも症状変わらず。
この問題について、何か心当たりのある方はいらっしゃいますか?
345 :
343 :2009/03/18(水) 16:45:18
>>344 ありがとうございます。
環境書いてませんでした。OSはXP(32bit)です。
念のためこの環境でも proppage.dll を登録してみましたが、やはり変わりませんでした。
なお、ひとつ間違いがありました。
pROT->Register() の第1引数になぜか 0 を指定してました。
ROTFLAGS_REGISTRATIONKEEPSALIVE に変更することで、何度 "Connect to Remote Graph" を
選択してもリストに "pid 0xXXX(ddd) IFilterGraph = XXXXXXXX" が出てくるようにはなりました。
ただ、やはり選択→OKしてもフィルタ構成は表示されません。うーむ・・・。
ちなみに、Windows SDK 6.0A/6.1 に含まれる GraphEdt ではリストにすら
表示されませんでした。
指定すべきモニカの文字列フォーマットが変わってたりするのでしょうか・・・。
346 :
343 :2009/03/18(水) 17:07:55
解決しました。
きっかけはこちら。
ttp://questionbox.jp.msn.com/qa1612988.html quartz.dll を登録したら治りました。
ええー、quartz.dll ってデフォルトで登録されてませんでしたっけ?って感じですが・・・。
なお、この状態なら Windows SDK 6.0A/6.1 に含まれる GraphEdt でも接続できました。
でもタイミングによってなぜか Runtime Error が出ます。
どうもお騒がせしました。
>>345 regsvr32 "C:\WINDOWS\system32\quartz.dll"
orz
349 :
デフォルトの名無しさん :2009/03/19(木) 02:31:25
347 明日はいいことあるさ
350 :
デフォルトの名無しさん :2009/03/23(月) 11:02:01
RenderFileの戻りが遅いのですがこれを早くする方法を教えてください
351 :
デフォルトの名無しさん :2009/03/23(月) 11:53:31
なぜ遅いか考えたことある?
俺のRenderFileは早いよ
353 :
デフォルトの名無しさん :2009/03/23(月) 13:13:05
早くする方法があったら教えてください
354 :
デフォルトの名無しさん :2009/03/23(月) 13:17:47
お前、馬鹿だろ
「RenderFileの戻りが遅い」と判断する根拠がよく分からないよ。 サンプルプログラムやWMPに比べて異常に遅いと体感できる、 もしくは実測してこうだった、などの比較はできてますか? とりあえずエスパーで二つほど。 ・インストールされているコーデック(パック)を片っ端からアンインストールする ・予め使うことが予定されているフィルタをフィルタグラフに登録しておく あとはもう少し詳しい状況を教えてもらえれば、他にも何か言えることがあるかも。
356 :
デフォルトの名無しさん :2009/03/23(月) 15:23:29
RenderFile関数から抜けてくるまで2秒くらいかかります。 早くする方法があったら教えてください
速くするためには、まず何の理由で遅いのかを調べようぜ
358 :
デフォルトの名無しさん :2009/03/23(月) 17:56:43
RenderFileの戻りが遅い理由って舞い糞ソフトに聞けばいいんですかね? 関数の内部事情なんて僕には検討もつきませんが。 っていうか、知らない人はレスしないで下さい。ウザイだけですよっと。
うちじゃ2秒もかからないからな。 お前のとこだけで遅いのに理由がわかるわけないだろう。
360 :
デフォルトの名無しさん :2009/03/23(月) 18:16:06
ごめん2秒じゃなかった1秒ちょいだった ちなみにファイルサイズは4GBくらい まあ、どうせお前らの持ってるエロ動画なんて100MB前後だろ?
お前の持ってるちんこ同士がけこーんしてるような動画は1ビットも要りません
362 :
デフォルトの名無しさん :2009/03/23(月) 18:51:50
どうせDVDでも引っこ抜いて4GBなんだろ、
しかたないなあ。 たまたまシンプルな再生プログラム書いてたのでテストしてみたよ。 6GB超のAVIファイルを RenderFile() に突っ込んで要した時間は 169[ms] でした。 はい、次の情報どうぞ。
364 :
デフォルトの名無しさん :2009/03/23(月) 19:05:04
すんませんでしたとしか言いようがありませんよ んー、とりあえずお前らのソースみてやるからスレに貼ってください。
HRESULT SimplePlay(LPCWSTR lpwstrFile) { CComPtr<IGraphBuilder> m_pGraph; CComQIPtr<IMediaControl, &IID_IMediaControl> m_pControl; CComQIPtr<IMediaEvent, &IID_IMediaEvent> m_pEvent; HRESULT hr = CoInitialize(NULL); if (FAILED(hr)) return hr; hr = m_pGraph.CoCreateInstance(CLSID_FilterGraph); if (FAILED(hr)) return hr; hr = m_pGraph.QueryInterface(&m_pControl); if (FAILED(hr)) return hr; hr = m_pGraph.QueryInterface(&m_pEvent); if (FAILED(hr)) return hr;
DWORD tTmp = timeGetTime(); hr = m_pGraph->RenderFile(lpwstrFile, NULL); tTmp = timeGetTime() - tTmp; if (FAILED(hr)) return hr; hr = m_pControl->Run(); if (FAILED(hr)) return hr; for (;;) { long code = 0; hr = m_pEvent->WaitForCompletion(0, &code); if ((FAILED(hr) && hr != E_ABORT) || code == EC_COMPLETE) { break; } }
CoUninitialize();
return S_OK;
}
>>365-367 まとめてみてください。
RenderFile()を抜けた後の tTmp の値を教えてね。
エラー処理に関するコメントは No thank you です。
368 :
デフォルトの名無しさん :2009/03/23(月) 19:24:45
>>365-367 ありがとうございます。
やってることはお前いや貴様と一緒ですね
やっぱその他の環境の問題なんですかねこれ。
あ、ちなみにOSはXP64ですよですよ。
もうちょい調べてみます。わざわざありがとうございました、
EnumPins グラフ 構築 で検索
つーか情報の小出しに付き合ってられんわ
371 :
デフォルトの名無しさん :2009/03/24(火) 11:38:52
>>370 みたいな奴って知らないのにレスするタイプだよね
372 :
デフォルトの名無しさん :2009/03/24(火) 11:47:37
>>371 みたいな奴って煽りのしかレスできないタイプだよね
最初の情報は遅いってだけ
次に2秒かかると出て
次に4GBと出て
自分のソースは出さずに人に要求して
それからOSがXP64と出た
で、
>>355 のレスには何も反応していない。
これで原因分かるのに間抜けだよな。
374 :
デフォルトの名無しさん :2009/03/24(火) 12:26:25
単細胞って幸せだと思った
最初の書き込みでゴミって判るのに、反応する奴がいるのが不思議
過疎るくらいなら枯れ木も山の賑わいくらいに思ってた方がいいかな、と思って。 不快だったらゴメンね。
ごめんねほんと
378 :
デフォルトの名無しさん :2009/03/26(木) 15:17:44
動画を1フレームずつSetPositionsで動かして コールバックで画像を取るのを作っているんですが 最初の1,2フレームでコールバックが来ないときがあるのですが 何が原因ですか?
ヒント:CODEC
380 :
デフォルトの名無しさん :2009/03/28(土) 13:59:38
SonicStageについてくるフィルタを使って、Atrac3(oma)の再生がやりたいんですが デバッガで実行するとRenderFileの所で、「現在の場所のソースコードを表示できません」と出て止まってしまいます。 デバッガ無しで普通に実行すると問題なく再生できるんですが、原因分かる方いますか? mp3やaviなどその他のファイルはデバッガでも問題ないです。 環境はVCEE2008、XP32SP3、DXSDK(April 2007)です。 もしかしたらソニーがリバエン対策でアンチデバッグしかけてるのかな?とか妄想したりしてます…
よくわからんけど、そのフィルタがデバッグビルドされてて、ブレークするけどソースがないからそうなるとか?
>>381 デバッグビルドですか、それは考えて無かったです
しかし、ブレークした後続行をするとAVが発生してしまうのです
単純にソースの置いてあるパスの問題じゃねーの? デバッカで動かす時、ソースファイル(再生したいファイル)どこに置いてる? そんな基本的ミスする奴がDirectShowいじるわけねーか。
>>383 >mp3やaviなどその他のファイルはデバッガでも問題ないです。
なのでパスの問題ではないです
寧ろ存在しないパス渡してもエラー吐かないみたいですが
できればSS入れている方で試された方いましたら情報頂けるとありがたいです
ヒント;プロジェクトのプロパティ
「現在の場所のソースコードを表示できません」は問題そのものじゃないでしょ。 デバッグビルド時に有効になるASSERTか何かで引っかかってるんでは? 根本的な問題が何かはよく分からんですが・・・。
387 :
デフォルトの名無しさん :2009/04/01(水) 14:50:10
DirectShowで動画のオープン、クローズを繰り返すと オープンとクローズ(GraphBuilderの破棄)にだんだん時間がかかるようになってしまいます。 2回目はだいたい200ms(前のをreleaseしてopenするまでの時間)なのですが、 これを20回もすると1秒はかかるようになってしまいます。 更に繰り返すとどんどん増えていくのですが、どうしたら増えずに一定で保てますか?
>>387 >>365-367 で示したコードで m_pGraph.CoCreateInstance() から CoUninitialize() の手前までを
forループでグルグル回してみたけど、特にGraphBuilderの破棄に時間がかかるような現象は
起きませんでした。(m_pGraph, m_pControl, m_pEventはループ終端で自力Releaseすること)
・
>>365-367 のコードで使用されているファイルを再生するとどうなりますか?
・
>>365-367 のコードとそちらのコードの違いがあれば簡単に教えてください。
・もし手持ちに複数のPC環境がある場合、どこで実行しても同じ結果ですか?
389 :
デフォルトの名無しさん :2009/04/01(水) 18:07:43
こちらにDxVA1.0をバリバリ利用してるぜ、という猛者はいらっしゃいますか? DxVA2.0だと大体メドは立ってるんですが、DxVA1.0で自由に表示位置や タイミングをコントロールする(自前のテクスチャにデコード結果を書き出す) 方法がいま一つ分かりません。 VMR9のメソッドをこうすれ、等アドバイスをいただけないでしょうか。
>>388 試験ありがとうございます。。。
C++Builder2007を使っていたのですが、
どうやらデバッグモードでコンパイルしてるexeだと
>>387 の現象になるみたいでした。
リリースモードでコンパイルしたexeでは現象は出ませんでした。
ほんとすんませんでした。
391 :
388 :2009/04/01(水) 18:33:43
>>390 えー、自分とこもDebugビルドでテストしてますがね。
C++Builder2007でどうなるかまでは試せませんが・・・。
コールバック(BufferCB)で画像を取得してるのですが 2フレーム目のSampleTimeが0になる時があります。 どういう場合に0になりますか?
環境もフィルタグラフの状態も書かずに答えられる人は神だけ
環境とフィルタグラフを書いただけで答えられる人は神だけ
全部書かかれてて答えられる人はただの人。 というわけでただの人向けに書いてください。
わからない奴に限ってうだうだうるせー事言うよね。
>>392 サンプルタイムはパーサがつけることが多いから、グラフ構成は
記しておいた方が良いね。
1フレーム目は0じゃないの?
398 :
デフォルトの名無しさん :2009/04/05(日) 12:50:56
遺憾の意はイカン
IGraphBuilder::RenderFile()にファイル名を指定すればファイルを読み込ませることは できるんですが、バッファ上に置かれたファイルを読み込ませるにはどうしたらいいですか?
IGraphBuilder::Render()で
IGraphBuilder::Render()についてMSDNで調べて見ましたがバッファのデータを渡す方法が分かりませんでした 以下MSDNから引用 RenderFile メソッドは、ファイル名からデフォルトの再生グラフを作成する。 内部的には、このメソッドは AddSourceFilter を使って適切なソース フィルタを探し、 Render を使ってグラフの残りを作成する。 引用ここまで 要するにAddSourceFilterでソースフィルタ構築してソースフィルタの出力ピンを Renderに渡して中間フィルタや出力フィルタを構築って事だと思うんですが、 AddSourceFilterに指定できるのもファイル名のみでバッファのポインタを渡せる場所がありませんでした
402 :
デフォルトの名無しさん :2009/04/07(火) 14:11:59
ソースフィルタ作ればいいじゃん
知らないならレスしないで下さい。ウザいだけです。
404 :
デフォルトの名無しさん :2009/04/07(火) 17:00:09
まだ春休みか?それとも頭の中はずっと春休みなのか?
>>403
406 :
デフォルトの名無しさん :2009/04/07(火) 17:55:26
またお前らか
またおれか
408 :
デフォルトの名無しさん :2009/04/07(火) 18:11:00
またお前らだ
409 :
デフォルトの名無しさん :2009/04/08(水) 00:18:18
は?
株式会社 ゆとり
は?
413 :
デフォルトの名無しさん :2009/04/09(木) 16:22:04
なあブタ共ちょっと教えてくれや RenderFileで動画読み込んでからGraphBuilderとかを破棄せずにまた RenderFileで読み込んでもいいのか?ああん?
ブヒヒ
415 :
デフォルトの名無しさん :2009/04/09(木) 17:29:35
ブタがっ!このブタがああゅ!
>>413 大丈夫、OK、全然、ほんとだってwww
>>413 いいよ、CPU負荷とか気にしないなら
あ、動画支援機能は1本限定、これ豆知識な
飛べない豚より
418 :
デフォルトの名無しさん :2009/04/10(金) 10:25:30
>>416-417 おお、きちんとできたぜ!
これいちいちcreateやreleaseしなくていいから早くて最高だぜ!
お前達ブタって知識はないけどたまには役に立つんだんだなwww
419 :
デフォルトの名無しさん :2009/04/10(金) 13:45:09
動画のオープン、クローズを繰り返すと毎回391回目でRenderFileがエラーになるのですが何が原因なのでしょうか? タスクマネージャのメモリ使用量を見てるとちゃんと開放されてないみたいで、どんどん使用量が増えているので そこら辺が問題だとおもうのですが、以下のソースでどこがダメですか? Open( ) { // ↑省略 CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&GraphBuilder ); GraphBuilder->QueryInterface( IID_IMediaControl, (void **)&MediaControl ); GraphBuilder->QueryInterface( IID_IVideoWindow, (void **)&VideoWindow ); CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **)&BaseFilter ); BaseFilter->QueryInterface( IID_ISampleGrabber, (void **)&SampleGrabber ); GraphBuilder->QueryInterface( IID_IMediaSeeking, (void **)&MediaSeeking ); GraphBuilder->AddFilter( BaseFilter, L"Grabber" ); GraphBuilder->RenderFile( filename, NULL ); SampleGrabber->SetCallback( (ISampleGrabberCB *)mySGcall, 1 ); // ↓省略 } Close( ) { MediaSeeking->Release( ); SampleGrabber->Release( ); BaseFilter->Release( ); VideoWindow->Release( ); MediaControl->Release( ); GraphBuilder->Release( ); }
インタフェースの解放はよさそう。 RenderFileコール時のエラーコード値はいくつ?
映像と音声の両方をサンプルグラバで取得したいんですがうまくいきません。 どうしてでしょうか?どちらか片方だけならうまくいきます。 ソースフィルタ→サンプルグラバ(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);
遅レスですが。 どこでエラーが起きてるんでしょうか? エラーコードは?
教えて下さい。 ほとんど全くのDirectShow初心者です。 ビデオ編集ソフトを作りたいと思っています。 そこで、複数のビデオを合成するトランジションフィルターみたいなものを 作りたいのですが、Sample Grabberみたいなものを使って、それぞれ1フレームずつ 持ってきて、例えばα合成してやるみたいな方法が一般的なのでしょうか? それとも、2つを入力を持つトランジションフィルタを作って、グラフでつないで レンダリングして終わり? 速度的に前者は厳しいように思いますが、フィルターの形で実装しないで済む分、 作りやすいのかなと思ったり。 どういう実現方法が一般的でしょうか?
>>424 すばやいご回答、有難うございます!!
勉強します!!
たびたびすみません。 DESのサンプルを見ようと思い、色々探したんですが、 DirectShowって、今はDirectX→Platform SDK(Windows SDK)に移動してますよね? DESのサンプルは、DirectX 9.0 Extrasのものでいいのでしょうか?
どもども。 VS2008ではコンパイル通らなかったです。 Windows SDKの中を探したのですが、見つからず...orz もうちょっと探してみます。 有難うございます!!
429 :
デフォルトの名無しさん :2009/04/23(木) 23:55:43
DirectShow.Netに丁度良いサンプル込みであるよ
431 :
デフォルトの名無しさん :2009/04/24(金) 01:33:37
>>430 サンプルのDxTextが使えそうです。
どうもありがとうございました!
わけもわからずサンプルをつぎはぎしながらC#で動画プレーヤーを作ってます。 現在、ActiveMovie Windowという子ウインドウで動画が再生できるとこまで来ました。 そのウインドウがアクティブの状態でキーボードから再生や停止やらの操作をしたいと 思うのですが、キーダウンのイベントをどう設定すればいいのかわかりません。 IVideoWindowのput_MessageDrainでForm1.Handleを指定してはみたのですが キーボード入力を転送してくれるものの、子ウインドウを移動させようとしても 親ウインドウが代わりに動いたりするので困ってしまいます。 ActiveMovie Windowに対するキーダウンイベントのやり方、 もしくはMessageDrainでキー入力だけ転送するようなやり方を どなたかご教授ください。
引き続き質問なのですが、一部のWMVファイルが自作プレーヤーで再生できません。 再生できないファイルの音声コーデックは Windows Media Audio 9.1 Professional 192 kbps, 48 kHz, 2 channel 24 bit 1-pass CBR となっています。自作プレイヤー以外では問題なく再生できています。 ちなみに、下記の記述をすっとばすと音声なしの状態でファイルの再生が可能です。 IBaseFilter audioFilter = (IBaseFilter)new DSoundRender(); hr = m_FilterGraph.AddFilter(audioFilter, "DirectSound Renderer"); IPin pinOut = DsFindPin.ByDirection(sourceFilter, PinDirection.Output, 0); hr = m_FilterGraph.RenderEx(pinOut, AMRenderExFlags.RenderToExistingRenderers, IntPtr.Zero); Marshal.ThrowExceptionForHR(hr); 自作プレーヤーは、DirectShow.NetのサンプルのDxPlayを元に作ってます。 DxPlayというサンプルは画面キャプチャができるけど音声がならなかったのでその辺のソースを 上記の記述のように貼り付て偶然、音がなるようになりましたが理屈は微塵もわかりません。
434 :
432 :2009/04/26(日) 07:02:42
>>433 の質問変えたほうがいいかもと思い直しました。
DirectShow.Net の Samples\Players\DxPlay で音声を
ちゃんと再生するにはどう記述すればよいのでしょうか?
自分はjavascriptくらいしかまともに触ったことがなく
C++のソースを参考にC#に直すことができません。
IntPtrって何?hrって変数は何してるの?という調子で
C#初心者の自分にはDirectShow.Netはさっぱりです。
それと、
>>432 の件ですがSetWindowForegroundで常に
最前面に表示させることで中途半端に自己解決しました。
PlayWndを元に作った方がいいんじゃないか。
>>434 DirectShowのドキュメントと相互運用マーシャリングのドキュメントを一通り読んだほうがいいよ。
436 :
432 :2009/04/27(月) 08:15:49
PlayWndのほうが実用的なカタチにととのっており ずっと構造も簡単でそうしたかったのですが PlayWndで静止画保存ができませんでした。 DirectShow.Net以外に静止画保存の手段があれば というか、せめてNETでまともにDirectXが扱えてれば ド素人が苦労しなくて済むのに…
とりあえずC#ちゃんと書けるようになってから愚痴れよ・・・
438 :
デフォルトの名無しさん :2009/05/15(金) 11:02:29
再生してるAVIの特定の1フレームから 短形を切り出してアルファ付きのtgaファイルとして保存したいのですが どうやったら良いのでしょうか?
ggrks
441 :
デフォルトの名無しさん :2009/05/15(金) 14:08:47
>>439 ありがとうございます
参考にしながら頑張ってみる
442 :
デフォルトの名無しさん :2009/05/28(木) 11:58:51
動画再生時に音声だけを遅らせて再生することはできますか?
nullnullフィルタを元にカスタムフィルタを作りたいと思っています。 IGraphBuilder::AddFilter で キャプチャデバイスと nullnull フィルタを 追加しておいてから、ICaptureGraphBuilder2::RenderStream すると 問題なく終了するのですが、nullnullフィルタを RenderStream の後に 追加して、IGraphBuilder の Disconnect と Connect で挿入すると デバッグモード終了時に、nullnull.axに3オブジェクトがアクティブで 残っていると出ます。参照カウント管理が不正なためだと思うのですが Disconnect と Connect でフィルタを挿入しているサンプルがどこかに ありましたら教えてもらえませんでしょうか?
>短形 矩形じゃねーの? だとしてもどうして短形になったのか…
>>444 質問と関係ないレスならしないでほしい。ウザ杉
446 :
443 :2009/05/29(金) 18:26:57
自己レスです IPin::QueryPinInfo で取得した PIN_INFO の pFilter を Release していませんでした お騒がせしました
2週間も前のレスに今さらレスするとかもうね。しかもどうでもいい内容だし
>>443 サンプル中をDisconnectやConnectで検索はしてみたの?
・・・と思ったら解決していた
現在、SDKは最新の(多分)Microsoft Windows SDK v6.1、Microsoft DirectX SDK(March 2009)、VisualStudio2005 pro という環境で、DirectShowを試しています、
ISampleGrabber インターフェイスっていうのがありますが、MSDNを読みますと
(
http://msdn.microsoft.com/ja-jp/library/cc369550.aspx )
ヘッダー : Qedit.h をインクルードすること。このヘッダー ファイルは、バージョン 7 以降の Microsoft® Direct3D® ヘッダーとは互換性がない。
ライブラリ : strmiids.lib を使うこと。
との記述があります。
最新のSDKでは、ISampleGrabberインターフェースは無くなってしまったのでしょうか、または互換性のある、関数が定義されていうのでしょうか?詳しい人教えてください。
あんま詳しくない俺が答えてもいいかい? qedit.hでググるとわかるが、そのまま#includeしてもエラーがでて使えないってだけ。 詳しくは自分で調べてくれ
どのレスを参考にしたかわからないけど、どの方法でも大丈夫そうだからOKだと思う というか、なぜわざわざ英語を。英語得意じゃないんだから困った MSDNか。公式フォーラムだからか。
>>451 Thx
そうそう、公式フォーラムだったんで、俺も英語あまり良く分からないけど、参考にしました。
そして、やってみました
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のライブラリィを作っています、こんな調子で今日中にできるかな(^^;
GraphEditを使って、USBカメラのデータを、ASF形式で出力しWMPで見たいのですが、手順を教えてくださいませ。
454 :
デフォルトの名無しさん :2009/06/12(金) 17:08:38
VB.NETでDirectShowで動画を再生しながら 他の処理も行っていると動画が遅くなります。 しかし他の処理の中でDebug.Writelineで イミディトウィンドウに文字を出し続けていると 動画が遅くならない謎の現象になっています。 これだとリリース出来ません。なにか知っている人が いたら教えてもらえないでしょうか?
再生を別スレッドに別けるとか
456 :
454 :2009/06/15(月) 12:33:45
455さんお返事ありがとうございます 別スレッドの中でWhileでDoEventsを呼び続けると なんとかなりそうでした。まだわかりませんが。 全体の処理時間は少し遅くなりました。
DirectShow編集サービス(DES)で、ファイルへレンダリング出来なくて困ってます。 流れ的には以下の様な感じで、Runの後にWaitForCompletion()内で例外発生。。 ・IRenderEngineをCoCreateInstance()で作る。 ・pRenderEngine->SetTimelineObject()でTimelineをセットする。 ・pRenderEngine->ConnectFrontEnd()呼び出し ・ICaptureGraphBuilder2をCoCreateInstance()で作る。 ・pRenderEngine->GetFilterGraph( &pGraph ); ・pBuilder2->SetFiltergraph(pGraph); ・pBuilder2->SetOutputFileName(&MEDIASUBTYPE_Avi..)で出力先指定 ・TimelineのGroupのOuputPinを、Builder2でRenderStream() ・IMediaEvent、IMediaControl取得 ・Run() ・IMediaEventのWaitForCompletionで、例外発生...orz ウィンドウへのレンダリングは成功しています。 最終的にはスマートレンダリングしたいのですが、ISmartRenderEngineの 使い方がほとんど資料が無くて困っています。
458 :
デフォルトの名無しさん :2009/06/25(木) 16:05:52
1フレーム毎の音声データを取得する方法をおしえてください
>457 うろ覚えで役に立つか分からんけど… ・直接RenderStreamへ接続したら駄目だったはず。(MUXが必要。) ・Timelineを生成するまでの各段階でのエラー判定で色々悩まされた記憶がある。
>>459 ありがとうございます。
DESは資料が少なくて困りますよねー。
またよろしくです。
ファイルの変換をしたい。 ICaptureGraphBuilder2::SetOutputFileName()って、MUXを返すけど、 任意のMUXを指定したい場合は、どうするのかな? AddFilterでMUXとSinkを設定するの?
462 :
デフォルトの名無しさん :2009/07/09(木) 00:58:42
DirectShowでフィルタを作っているんですが、 フィルタを生成時にモーダレスダイアログを表示するサンプルありませんか? アプリではないため親ウィンドウが存在せず、 hWndも取れないしインスタンスハンドラも取れないもんでやり方ちょっと難しいっす。
>>462 コンストラクタかCreateInstanceかQueryInterfaceかでモードレスダイアログを
作るなりポップアップするなりすればいいんでないの?
もしかしてプロパティページの実装の仕方を聞いてる?
普通にそのスレッドでメッセージループ作って回せば? 窓の作り方知っていれば特に難しい事でないけど。
465 :
デフォルトの名無しさん :2009/07/09(木) 01:31:07
プロパティページではないです。ちなみにプロパティページは楽に作れます。 こんすとらくたでモーダレスダイアログ作りたい。 ですが、いまいちわからず… デスクトップからハンドラ引っ張ってメッセージループ処理に飛ばそうとして失敗しました。 そこで参考サイトをみて見比べようと思った次第です
メッセージループ処理はどう書いてますか? ウインドウは作れてるけどウインドウを うまく動かせないとかなら、 メッセージループ処理に問題があるかもしれない。 もう少し問題点を詳しく書いてみたら?
DirectShow編集サービスでTimelineをMPEG2でレンダリング出力したいのですが、うまく出来ません。 ICaptureGraphBuilder2::RenderStream()に、MPEG2のエンコーダーを指定してます。 Muxは、最初はSetOutputFileName()で返ってきたのを使っていましたが、エラーとなったため、 MPEG2のMuxerとMPEGのFileWriterを作り、2つのピンを繋いで、そのMuxを渡していますが、 やっぱりRenderStream()でE_FAILが返ってきます。 Encoder、Muxer、FileWriterは、GraphEditで繋いで動くのは確認しています。
IRenderEngine* pRenderEngine; 事前に作ってあります ICaptureGraphBuilder2* pBuilder2; 事前に作ってあります pRenderEngine->SetTimelineObject( pTimeline ); pRenderEngine->ConnectFrontEnd(); IGraphBuilder* pGraph; pRenderEngine->GetFilterGraph( &pGraph ); m_pBuilder2->SetFiltergraph(pGraph); // File Writer作成 CComPtr<IBaseFilter> DS_FileWriter; CComPtr<IFileSinkFilter> DS_FileSink; DS_FileWriter.CoCreateInstance(CLSID_MpegFileWriter); DS_FileWriter.QueryInterface<IFileSinkFilter>(&DS_FileSink); DS_FileSink->SetFileName(L"c:VideoTest.mpg", NULL); pGraph->AddFilter( DS_FileWriter, L"MPEG File Writer"); // Mux作成 CComPtr<IBaseFilter> DS_Mux; DS_Mux.CoCreateInstance(CLSID_MPEG2_Muxer); pGraph->AddFilter( DS_Mux, L"MPEG2 Muxer"); // ピン接続 CComPtr<IPin> p, pin; DS_Mux->FindPin(L"Output", &p); // Muxerの出力ピン DS_FileWriter->FindPin(L"Input", &pin);// Writerの入力ピン pGraph->Connect(p, pin); // ピン接続 (続く)
// グループ内をループし、出力ピンを取得する。 long NumGroups; pTimeline->GetGroupCount(&NumGroups); for (int i = 0; i < NumGroups; i++) { IAMTimelineGroup* pGroup = NULL; pTimeline->GetGroup((IAMTimelineObj**)&pGroup, i); IPin *pPin; if (pRenderEngine->GetGroupOutputPin(i, &pPin) == S_OK) { CComPtr<IBaseFilter> DS_Compressor; if(i == 0){ // Videoグループ用のコンプレッサフィルタを作成する。 DS_Compressor.CoCreateInstance(CLSID_MPEG2_Compressor); } // ピンを接続する。 hr = m_pBuilder2->RenderStream(NULL, NULL, pPin, DS_Compressor, DS_Mux); ←これがE_FAIL SAFE_RELEASE(pPin); } }
DESは使ったことないので見当違いかもしれませんが、 DS_Compressorをフィルタグラフに登録(AddFilter)してないのは問題ないんですか?
>>470 それです、それでした!!
とりあえずエラーなしでMPEG2ファイル書き出せました!!
自分でAddFilterしなくちゃダメなんですねー。
有難うございますーm(__)m
質問です
DirectShowでGeekなページを参考に動画再生をするプログラムを作りました
http://www.geekpage.jp/programming/directshow/change-rate.php 参考URLでは『put_Rateの引数を2.0などに変更すると倍速再生になります。
put_Rateの引数に負の値(マイナスの値)を渡すと巻き戻し再生になります』
とありますが、
put_Rateの引数を負の値にしても大部分のフィルタは逆再生をサポートしていないため実行されません。
そこでIMediaSeekingかIMediaPositionを用いて巻き戻しをするプログラムを作りたいのですが、
どうすればよいのやら困っています。
何か良い考えはないでしょうか?
是非知恵をおかしください!
DirectShowのスレでも質問したのですが、スレの勢いを考えてこちらにも質問させていただきます。
DirectShowでGeekなページを参考に動画再生をするプログラムを作りました
http://www.geekpage.jp/programming/directshow/change-rate.php 参考URLでは『put_Rateの引数を2.0などに変更すると倍速再生になります。
put_Rateの引数に負の値(マイナスの値)を渡すと巻き戻し再生になります』
とありますが、
pMediaPosition->put_Rate(0.5);
のput_Rateの引数を負の値にしても大部分のフィルタは逆再生をサポートしていないため実行されません。
そこでIMediaSeekingかIMediaPositionを用いて、または用いなくてもいいのでdirectshowで
動画の巻き戻しをするプログラムを作りたいのですが、どうすればよいのやら困っています。
何か良い考えはないでしょうか?
是非知恵をおかしください!
誤爆しました。すみません
どんな動画をどんな風に逆再生するのかわからんけど 自前で逆再生をサポートしたフィルタを作成するか、 適当に逆方向にシークさせていくかぐらいしかないんじゃない? てかマルチポスト・・・
Pause状態にしておいて、10秒、9秒、8秒…てな感じにシークしていけばいいんじゃない? 逆方向再生をサポートしてない限りスムーズには出来ない。
なぜ「大部分のフィルタは逆再生をサポートしていない」のかよく考えてください。 キーワードは「MPEG」「フレーム間予測」・・・ これらを理解した上で、あなたならどのように逆方向再生を実現しますか? たぶんMPEG系ではTIME_FORMAT_FRAMEが使えないので、 1枚ずつシークとか難しいと思います。
MPEGならSBE以外でもビデオアナライザフィルタは使えるのかな。 使えてもかなりガックリな結果しか得られないけど。
479 :
デフォルトの名無しさん :2009/07/10(金) 19:57:34
>>466 未だフィルタでモーダレスダイアログを表示するプログラムが出来ない
ので教えてください。
詰まっている箇所はインスタンスハンドルの取得だと思います。
コンソールアプリにて以下のソースでダイアログが表示することを確認。
main()
{
printf("ddd");
g_hDlg = CreateDialog( NULL, (LPCTSTR)IDD_DIALOG1, NULL,(DLGPROC)DlgProc);
ShowWindow( g_hDlg, SW_SHOW );
}
これをそのままDirectShowサンプルのNULLフィルタに移植
CNullNull::CNullNull(TCHAR *tszName, LPUNKNOWN punk, HRESULT *phr)
: CTransformFilter(tszName, punk, CLSID_Algorithm)
{
g_hDlg = CreateDialog( NULL, (LPCTSTR)IDD_DIALOG1, NULL,(DLGPROC)DlgProc);
ShowWindow( g_hDlg, SW_SHOW );
}
すると「g_hDlg」は0になりメッセージループ処理には飛びません
そんだけわかってなんで、リファレンスを読まないの? NULLって何?アフォ? そしてスレ違い
481 :
デフォルトの名無しさん :2009/07/11(土) 01:19:00
>>480 反応ありがとうございます。
コーディングする前からDirectShowフィルタでの
インスタンスハンドルの取得方法を悩んでいました。
CreateDialogの3つめの引数NULLの
hWndはデスクトップを親にするために0でいいと思う。
1つめの引数はインスタンスハンドルを書けばいいのですが
何を書いたらよいかわかりません。
普通WinAPIではWinMainの引数として与えられていたり
GetWindowLong、GetModuleHandleなどで取得できます。
しかしFilterでは出来ないのです。
よかったら取得方法を教えてください。
IDD_DIALOG1 のあるモジュールのハンドルに決まってるだろ。
483 :
デフォルトの名無しさん :2009/07/11(土) 09:27:25
>>482 IDD_DIALOG1 のあるモジュールのハンドル
これがわかりません。
IDD_DIALOG1はフィルタ自身が持っています。
メッセージボックスやオープンCVの窓は表示出来る。なんでダイアログが上手くいかないんだろう
たしかdllmainの引数に入ってるからそれをどっかに保存すればいい 正直フィルタにダイアログを生成させる仕様から考え直したほうがいいと思うけど
485 :
デフォルトの名無しさん :2009/07/11(土) 14:30:36
>>484 ありがとう。確認してみます。
仕様についてはデバッグ用であり、グラフエディット上でパケットモニタしたいと考えてました。
フィルタで枠実装しておけばアプリケーションで問題あっても容易にデバッグできるから…
質問です。 ハードディスク上ではなく、メモリ上に(ごく小さい)AVIファイルを読み込んでから 再生させたいと思っているのですが、ソースフィルタには何を使えば良いでしょうか? もしくは、IGraphBuilder::RenderFile()で直接メモリを指定する方法などは ありますでしょうか?
488 :
486 :2009/07/13(月) 13:18:35
>>487 それを見てMemFileってサンプルがあったのを思い出しました。
多分それを使えばOKです。
どうもありがとうございました!
自分のウィンドウ内に再生表示したいのだが、 IGraphBuilder::put_Owner()が、E_NOINTERFACEを返して来て、 別のウィンドウが開いてしまう、何故だろう? hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, reinterpret_cast<void **>(&pGraphBuilder)); hr = pGraphBuilder->QueryInterface(IID_IVideoWindow, (LPVOID *)&pVideoWindow); hr = pVideoWindow->put_Owner((OAHWND)hWnd); <- E_NOINTERFACE hWndは、自分(Dialog)のハンドル。
BDAチューナからの生(MPEG2-TS)データを取得するアプリを作成したく、graphedtで 試行錯誤してます。(DirectShow初挑戦) まず、グラバを作成する代わりに"Infinit Pin Tee"+"Dump"(SDKのサンプル)を用いて DVB-S Network Provider ↓ DVB-S Tuner ↓ DVB-S Capture ↓ Infinit Pin Tee → Dump → ファイル ↓ MPEG2 Demultiplexer ↓ BDAMPEG2 Transport Information Filter の構成で、生TSデータを(ファイルに)取得するところまではできました。 が、ここで問題発生。記録したデータを見ると、所々でデータが欠落しています。 一度Runした後に"MPEG2 Demultiplexer"/"BDAMPEG2 Transport Information Filter" を削除してRunすれば、欠落の無いデータが録れることから、これらの処理が重く Captureからの出力がブロックされデータが失われているのではないかと予想して います。 アドバイスいただきたいのは、 (1) 欠落原因の確認のため、CaptureとTeeの間にバッファリング(FIFO)してくれる ようなフィルタを入れたいが、既存の物で何か良い物は無いか? (2) 以上全体を通して、間違いやもっと良い方法は無いか? の2点です。 よろしくお願いいたします。
>>489 普通はレンダラから、IVMRWindowlessControl や IVMRWindowlessControl9 で設定する。
>>490 そもそもTeeを通さず直接Dumpして欠落無いか確認した?
493 :
490 :2009/07/18(土) 00:18:46
>>492 Demultiplexer/Transport Information Filterが無いとチューニングが行えない(「Microsoft統合
チューニングモデル」参照)ため、Dumpを接続するには必ずTeeが必要になります。
いったんチューニングが行われた後、Demultiplexer/Transport Information Filterを削除する
とデータ欠落が無くなるのは前記のとおり確認しています。(これが「Teeを通さず直接Dump」
と実質的に同じ状態と思われます。)
あとはGraphEditじゃ無理だろうがDemux通したあとのPID指定したのをDumpするとか。
495 :
デフォルトの名無しさん :2009/07/19(日) 01:11:24
スレ違いかもしれないのですが デコードされた、PCM(5.1ch)を、PCM(2ch)*3に分割すうような 動作をするフィルターを探しています。 用途は、ステレオ*10の出力はあるけど、5.1ch出力は出来ない オーディオカードから5.1chを吐かせたいのです 何かよいフィルタ(スプリッタ?)はごぞんじないでしょうか?
スレ違で、しかもやろうとしている事の意味がわからない。そんなへんてこストリームを再生してもまともな音響にならないと思うが・・・。 仮にpinを3つに分岐させたとして、どうやってレンダラに繋ぐんだ? ステレオ*10ってのがまず謎だ。
ffdshowフィルタを使ったプログラムをくみたいのですが、 フィルタの作り方わかる方、教えてください。 まずこれ↓をやりたいのですが・・・ input.avi -> スプリッタ -> ffdshowデコーダ -> ffdshowエンコダ ->mux ->out.avi
>>497 フィルタの作り方、っていうのが何か勘違いされているような・・・
とりあえずGraphEdtで自分のやりたいことができてますか?
499 :
497 :2009/07/19(日) 02:09:44
>>498 GraphEditではできています。
それをプログラム上で再現したいのですが、CLSIDなど
どう設定してよいかがわかりません。
500 :
デフォルトの名無しさん :2009/07/19(日) 02:15:38
>>497 既存のフィルタを組み合わせるだけならフィルタを作る必要は無い
なんにせよ大体のことは
>>2 あたりを見るだけで事足りる
それでもわからないことがあったらまた聞きにきな
502 :
497 :2009/07/19(日) 14:08:05
>>502 そのページには
>この辺は、海外のffdshowのソース?みたいなところを漁ったら出てきます。(ライセンス的にどうなのかはわかりません)
って書いてあるからどうやらヘッダはffdshowのソースからとってきてるみたい
使うならちゃんとライセンス確認してから使うこと
ただffdshowっていろんなバージョンがあったと思うけど互換性は大丈夫なのかな
504 :
497 :2009/07/19(日) 15:36:47
>>503 なるほど、ありがとうございます。
もう少し調べてみます。
普通、ffdshowのフィルタはプログラム上からはあまり使わない感じなんですかね?
506 :
497 :2009/07/19(日) 22:19:55
>>505 ありがとうございます。
考えていたのはaviファイルをリサイズ、音量操作などをしてから再圧縮保存したいと考えていたので
多機能のffdshowをプログラム上で使えれば楽かなっと思っていました。
編集フィルタ標準であるやん
508 :
497 :2009/07/19(日) 23:37:59
>>507 本当ですか? 調べなおしてみます・・・
キャプチャデバイスからの映像を再生するアプリを作っているのですが、 開発が進むにつれて、ブルースクリーンになって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() )
再生側でOS落ちるのはレアだから、ソースフィルタ側のドライバの問題でない? テンプレート使っていないなら、参照カウンタあたりが怪しいけど。 破棄されているのに、更にReleaseしてアドレスがたまたま有効なために不正にコードが実行されてしまったケースを想定。 チェックが甘い実装だとこのケースで落ちそうな気がする。
512 :
510 :2009/07/27(月) 02:14:56
>>511 ありがとうございます。
>ソースフィルタ側のドライバの問題でない?
その可能性もあると思います。
使っているキャプチャボードがIntensityProとSAA7103-TVPCIなのですが、
IntensityProのほうはドライバがあまり安定していないという報告をよく聞きますし。
>破棄されているのに、更にReleaseして
一応、以下のようなSAFE_RELEASEマクロでそういったことが起こらないよう心がけています
SAFE_RELEASE( x ) { if( x ) { ( x )->Release(); ( x ) = NULL; } }
しかし、Releaseし忘れの恐れは残りますが・・・(慎重にチェックはしているものの(汗))
もう一つ、少し心配なのが、
>>510 の3番のスマートティーフィルタのフィルタグラフからの削除です。
このスマートティーはインテリジェント接続により生成されるもので、
基本的にはDirectShow側で生成、解放等の管理をしてくれていると思うのですが、
それに対してアプリ側でRemoveFilterするのは問題ないのだろうか?と・・・
しかし、
>>511 さんのご意見通り、ドライバの問題が有力な気がします。
もう一枚キャプボがあるので、怪しいIntensityProを外して他の2枚で切替を行うテストをして、
問題がないかを試してみようと思います。
ドライバのせいにできれば、アプリ作成者側としては気が楽になりますので期待してます(笑)
どうもありがとうございました。
CComPtrとかで参照を自動化してやると間違いが起きないぜって話
514 :
510 :2009/07/28(火) 00:37:34
よく調べてみると、参照カウントが予想外の挙動をしていました。
例えば、
pCaptureGraphBuilder->FindInterface( &PIN_CATEGORY_CAPTURE, 0, pCapDev, IID_IAMStreamConfig, ( void** )&pConfig )
として、pConfigの参照カウントを調べてみると、1ではなく、いきなり2や6になったりするんです。
キャプチャデバイスフィルタ(上のpCapDev)も、
pMoniker->BindToObject()では1上がるだけですが、その直後のpGraphBuilder->AddFilterで
3とかになったりしました。
ここらへんが悪さをしていたようで、どうしたものかと思いましたが、
>>513 さんが教えてくださったCComPtrに変えたところ、うまくいきました!
CComPtrを使うと、
ttp://www.hamusuta.net/openbbs/pc/prg/wtl.html#msg9 に書いてあるように、使いまわし利用ができず、プログラムが止まります。
これで問題箇所が分かる上、xxx.Release()とすればちゃんと
解放(おそらく参照カウントを必要なだけ複数下げてくれている)してくれます。
この対処をした後はブルースクリーンクラシュは起こらなくなり、安定して動いています。
とてもよい解決策を教えてくださって、ありがとうございました!
ReleaseよりNULL入れるほうが安全。 CComPtr以外にBoostでもテンプレートがあったきがす。 最初から入っているCComPtr使うほうが楽だけどね。
直接関係ないけど、CComPtrで使いまわす場合はDetachするとよか
>>514 いやCComPtr::Releaseは参照カウント一つしか減らさないぞ…。ヘッダファイルにソース書いてあるから読んでみるといい。
まぁ元のプログラムで参照カウントの増減おかしかったのが正しくなったんだろう。
なんにせよCComPtrを使っておくのは正しい対処だ。
>>515 CComPtrにNULL代入するのとCComPtr::Releaseは全く同じことしかやらないような。
>>517 NULLの代入とReleaseが同じなのはその通りだけど、
hoge.Release();は、間違えてhoge->Release();としてもコンパイルが通ってしまうから
避けるべきだと
>>515 は考えているのだと思う。
いつからかわからないけど、 CComPtrで ->AddRef と ->Release はコンパイル通らないようになってるよ。 確かVC6の頃は通ってたな。
520 :
510 :2009/07/29(水) 01:35:32
ダメです!再びブルースクリーン炸裂です・・・
CComPtrを使う前よりは耐性(?)は増したか・・・と思うと、
再起動直後、数回のデバッグ起動でガチャン・・・
CComPtrを以ってしても敵わないとは・・・恐るべしDirectShow・・・!
>>516 具体的にはどうするのでしょうか??
Detachだと、CComPtrが対象生ポインタの所有権を棄却するだけで、
解放は施されないようですが・・・
>>517 たしかにそうでした(汗)
となると、例の参照カウント異常上昇分を抑え切れてない可能性もありますね・・・
>>519 その通りで、->Releaseのほうはコンパイラに怒られました。
一度、怪しいCOMポインタについては、CComPtrを使わず、ソフト終了寸前に、
参照カウントが0になるまでRelease()を繰り返すといった方法を試してみようと思います。
>>参照カウントが0になるまでRelease()を繰り返すといった方法を試してみようと思います。 これはやってはいけない。そもそもAddRedやReleaseの返す値は使用してはいけないルールです。 参照値なんて自分で作ったもの以外は基本的にわからんよ。 再利用すると挙動不審になるデバイスなんでね。破棄して再生成してしまえ。 実行時間が同じくらいなら安定した方法で手抜き実装。
BMDSDKだとキャプチャフィルタは削除せずにグラフ変更やっているみたいだから それに沿ったら?
avi(音声あり)とwavファイルを多重化してaviに保存したいのですが、 directshowの既存のフィルタでプログラムできますか? aviの音声そのままでwavの音声も重ねたいのですが・・・
GraphEditで作れるか試せばいいだろ
525 :
510 :2009/08/03(月) 07:37:49
>>521 ありがとうございます!
確かに怖いですねw
>実行時間が同じくらいなら安定した方法で手抜き実装。
DirectShowって、フィルタ開発とかを除けば、基本的に時間を気にしないといけないところは
少ないですし、おっしゃる通り、遠回りでも、じじぐさくても、安定するように組むのがセオリーのようですね。
>>522 ありがとうございます!
その方法でやってみました。
はじめは、それでもOS毎落ちる事態は発生していましたが、どうもセットで生成されるスマートティー
を削除するのがよくないようで、これも残すようにし、再接続の際はスマートティー(在れば)から
接続してグラフを構築するようにしたところ・・・ついにブルースクリーンが出ないようになりました!!
何度も再接続を繰り返し、それまでであればほとんど落ちていたような回数でもぜんぜん落ちる
気配がありません。
みなさん、良いご助言を下さり、ありがとうござました!!
自分はCanonのHV10っていうDVカメラしか持ってないんですが IVideoWindow::SetWindowPosition で、ソース画像の1/2以下の Windowエリアに割り当てると描画しなくなります(SetWindowPosition はS_OKを返します) その後 SetWindowPosition で再設定しても描画されず、グラフを再作成するしかないようです。 他のDVカメラでも画像の1/2以下に割り当てると同じようなことが起きますか? Windowリサイズ時に(ソース画像の1/2+1)ピクセル以上に割り当てるようにしていますが この1/2で他のDVカメラに通用するのかが知りたいです。
サンプルグラバについて、 SetOneShot( true ) でワンショットモードにしてから再生しているのですが、 いつまでたってもグラフが停止しません。 (キャプチャデバイスからのライブソースです) ワンショットモードでは、サンプルを1枚受け取ると、グラフを停止するとmsdnにも書いています。 WaitForCompletion( INFINITE, &evCode ); を挿入し、この関数から返ってくるのを待っても、一向に返ってこず、再生が続いたままになります。 とりあえず、Sleep( 100 )として対応していますが、 このようなことをせず、ちゃんとサンプルの受信が完了したのを確認してから サンプルを取得できるようにするにはどうすればよいでしょうか??
Intensityをお持ちの方にお聞きしたいのですが、 入力設定を「HD 1080 PsF 24」にして、グラフ構築ができるでしょうか? GraphEditを使ったのですが、自分の場合、どのフィルタも繋がらりません・・・ 「接続に必要な中間フィルタの組み合わせが見つかりませんでした。」 のエラーメッセージが出てしまいます。 構築ができる方や、実際にPS3などからの24p出力を取り込められている方が おられましたら、フィルタグラフの構成を教えてください。 よろしくお願いします。
プログラムを終了する際は、すべてのフィルタをグラフから削除(RemoveFilter)すべきでしょうか? また、そのときは、インテリジェント接続で自動的に生成されたフィルタについても、 アプリ側で検索して削除すべきでしょうか? 削除しなくても問題は(一見)起こっていませんが、行儀よく終わる方法を知りたいと思いました。
>>528 メディアサブタイプがHDYCのはずだから、Blackmagic Designe DecoderDMO挟んでみるとか
>>529 自分で追加したフィルタと、グラフを解放するだけで問題ない、はず。
>>529 後片付けのためにRemoveFilterを使う必要はない
532 :
529 :2009/08/10(月) 12:26:12
533 :
528 :2009/08/11(火) 07:26:53
>>530 ありがとうございます。
しかし、24fps設定ではBlackmagic Design Decoder (DMO)すら繋がりませんでした(汗)
534 :
デフォルトの名無しさん :2009/08/14(金) 23:40:51
有識者の皆様にご教授願いたいことがあります。 カメラとマイクそれぞれのキャプチャピンから別々にデータを拾って保管しておき、 あとでそれらをプッシュソースフィルタからAVIMUXフィルターで合体させ、AVIファイルを作ろうと思っています。 キャプチャピンから拾うデータはIMediaSampleのデータ(GetPointer)と開始時間と終了時間(GetTime(Start,Stop))です。 問題は、20秒くらいのAVIデータを作成すると、2秒くらい画像が縮んでいることです。 取得時に実時間を画像に描画していますので、それを見ていると、18秒くらいで20秒目の画像まで来てしまいます。 音声は割りと正確に入っていまして、画像が停止した状態から+2秒できっちり20秒ぶん出来ています。 かなりの時間を割いて調べましたが、良い資料にめぐり合いません。 ちなみに、カメラから取ったデータを仮に(AvgTimePerFrame=)10fpsとすると、GetTimeで取得したStartとStopの間は0.1秒ぶん(1000000)ですが、 データとデータの間が必ずしも連続ではありません。1つ目のデータのstopが100000として、次のデータのstartが102000とかだったりします。(本当は100000が理想ですよね) ですので、10フレーム分のデータの最初のstartから最後のstopまでが1秒以上になっているようです。(カメラがコマ落ちしているようです。) (長くなりましたので分割いたしました。次のレスに続きます。)
535 :
デフォルトの名無しさん :2009/08/14(金) 23:43:08
データなどを10個おきに確認したところ、1秒間に10個データを必要とするならば、ちょうど、コマ落ちの遅延分が画像の短縮と同じ割合のような感じでした。 音声のデータは、0.5秒おきに正しく取得できているので、問題がないようです。Stopから次のStartとの間が連続しています。 同じカメラとマイクを直接AVIMUXフィルタに繋げてAVIファイルを作成すると、きちんとしたAVIが出来上がりますので、コマ落ちなどはIMediaSample.SetTimeでちゃんとフレーム補間されるものと思っていましたが、 違うのでしょうか? 直接つなげた場合と、いったんデータを横取りした場合と、何が違うのでしょうか? ただし、かといって、MediaSample.SetTimeをでたらめな数値にするとだめなことから、一応SampleTimeは参考にされているようですね。 一応、今回はコマ落ち分のフレームを直前のフレームで代用して、サンプルタイムを調整して姑息的に対応しようと思っています。しかし、これが正しい方法でしょうか?きちんとした使い方を知っておきたいのです。 AVIMUXの正しい使い方、同期の取り方等を教えていただける方を待望しております。 八方ふさがりで、このスレに期待しております。 よろしくお願いします。
試しに自分でサンプルに時間設定してみれば?または取得時間とサンプルの時間差を計測するとか。 オーディオのタイマーとビデオで使われるタイマーが別なのはよくあること。 本来ずれないものだが、ずれる環境もある。
537 :
デフォルトの名無しさん :2009/08/15(土) 10:26:39
>>536 早速のアドバイスありがとうございます。
サンプルの取得時の時間は、カメラやマイクが起動してからの時間なので、
AVIMUXにかけるときには、各々の頭のタイミングが0になるように各サンプルの時間を差し引いています。
具体的には、画像の取得開始が50000なら、取得したデータの各サンプルの時間を50000減じてからAVIMUXに送っています。
音声データも同じです。ただ、起動時間にずれがあるので、開始が60000とかになります。
しかし今回の問題は、開始時間がずれているのではなく、徐々にずれていくのです。
ビデオでたとえますと、音はそのまま、画像は早送り(0.05倍速くらいの微妙)です。
タイマーは同じPCにマイクとカメラを接続してますので、同じだと思います。
>>534-535 で疑っているのは、
カメラでリアルタイムに取得した画像は、10fpsとしても、1秒に10枚取れるときもあれば、8枚や9枚しか取れないときもあります。
10秒で100枚ほしいところ、結局90枚しか取れなかったということが普通にあります。
それをAVIMUXに入れたときにはきっちり10fpsでレンダリングされて9秒しか動画が得られない。
取得時間はきちんとしていますが、AVIMUXであいまいに処理されているんじゃないかと、
疑っています。
538 :
デフォルトの名無しさん :2009/08/15(土) 11:13:17
ちなみにAVIMUXのインターリーブのモードはINTERLEAVE_NONEでした。 これをINTERLEAVE_CAPTUREやINTERLEAVE_FULLにしましたら、固まりました。 このモードはソースがプッシュだとだめでしょうか? カメラやマイクなどのキャプチャフィルタはプッシュだと思うんですが。 私のAVIMUXに対する期待は、AVIMUXに1秒間に何枚送ろうが、サンプルに付けたタイムを元に、 適当に表示時間を調整してくれることです。 これが過大な期待なのかどうか、機能の正確なところが知りたいです。 よろしくおねがいします。
GraphEdit のフィルタ挿入選択ダイアログボックスの様に、フィルタの登録情報を取得する方法を探しています。 具体的には、その中でもPIN情報を取得する方法です。条件としてフィルタの生成は行いません。 何か情報がありましたらお知らせください。
directshowって動画をフレーム単位で表示したり総フレーム数や現在の表示フレームナンバーとかで再生制御できる?
トランスフォームフィルタのCheckTransformについて質問です。 CheckTransform( const CMediaType *mtIn, const CMediaType *mtOut ) この mtIn と mtOut ですが、 [ UpstreamFilter ][ Out ] -> [ A:In ][ TransformFilter ][ B:Out ] -> [ C:In ][ DownstreamFilter ][ Out ] 上図でいえば、それぞれはA〜Cのどれに対応するのでしょうか? mtOutはBに違いないと思います。 mtInに関しては、MSDNの例を見ている限りはAを指していそうに思うのですが、 他の個人Webサイトの例などを見ていると、C(ダウンストリーム側が提示)と取れるような記述もありました。 よろしくお願いします。 m(_ _)m
ソース読めよ
543 :
541 :2009/08/24(月) 22:04:59
>>542 ありがとうございました。 m(_ _)m
544 :
デフォルトの名無しさん :2009/08/24(月) 23:26:02
SampleGrabberを使ってAviUtlのDirect Show File Readerっぽいもの(Aviutl用ではありませんが) を作りたいんですが、うまくいきません。 なるべく速度が低下しないように、 ・動画の1フレーム目を読み出した後、2フレーム目の読み出しが要求されたときは IMediaControlのRunを呼び出して再生を再開→すぐ一時停止 ・1フレーム→10フレームのように読み出すときだけシークする ようにしたいんですが、一回Runを呼び出すと、SetOneShotをtrueにしても、サンプルグラバのコールバックで IMediaControl→Pauseを呼び出してもちゃんと止まっていないようなのです。 ポーズした後もBufferCBが呼び出されてるし、 映像だけをデフォルトレンダラに変更してウィンドウを動かすと勝手に映像が進みます。 どうすればいいでしょうか? *.flv→FLV Splitter→MP3のデコーダー→SampleGrabber(Audio)→NullRenderer FLV Splitter→ffdshow Video Decoder→SampleGrabber(Video)→NullRenderer
545 :
デフォルトの名無しさん :2009/08/27(木) 01:13:50
>>543 Aだろ
説明ではアップストリームを基準にトランスフォームフィルタの説明してるんじゃないかな
546 :
541 :2009/08/27(木) 07:50:01
>>545 やはりそうですよね。
ありがとうございました。 m(_ _)m
Directshowでプログラムを組んだのですが、開発したPC(Microsoft SDKが入っている)以外のPCだと、 .netFrameworkをインストールしないと「構成が正しくない」というようなエラーが出て立ち上がりませんでした。 Directshowプログラムを動かすには.netFrameworkのインストールが必須なのでしょうか? それとも、Directshowとは関係ないAPIによるものでしょうか? Ole系関数やatlcomcli.hの関数が怪しいかと思うのですが・・・
要るわけない。
550 :
547 :2009/08/30(日) 09:39:39
>>548 やはりそうでしたか(汗)
>>549 >まさかCLRプロジェクトにしていないよな?
いえ、Win32プロジェクトで作成していますし、プロジェクトのプロパティでも
「共通言語ランタイムサポートを使用しない」にしています。
.netテクノロジーは噛んでいないはずですよね。
>そうでなければ、本当に必要なのは.NET FrameworkではなくVisual C++ランタイムだと思う。
URLを教えてくださってありがとうございます。
今はソフトを作り直していて、余計なAPIなどが関わっていないか注意しているので、
これが完成したら、配布テストとしてVisual C++ランタイムでちゃんと動作するか試したいと思います。
どうもありがとうございました。
551 :
名無しさん@そうだ選挙に行こう :2009/08/30(日) 11:53:25
フレームワークはいらないよ。インストール必要なライブラリーを仕事で洗い出したから間違いないよ
>550 Dependency Walkerかdumpbinで、依存してるdllを洗い出してみるのが手っ取り早いと思うよ。 というか>549の言ってるように、Visual C++ランタイムが無いだけだと思うんだが… Win32プロジェクトでも純粋にWinAPIだけで組むか、ライブラリをスタティックリンクにしない限り ランタイムが必要になる。(Cの標準関数(printf等)ですらアウト)
今気づいたんだがDirectShowのビデオレンダリングってクロマキー合成なのな 1.メディアプレイヤーで動画を再生 2.ペイントでキャンバスをRGB(16,0,16)で塗りつぶす 3.ペイントをメディアプレイヤーの上に重ねると下の動画が透けて見える XPクラシックモード&WMP11で確認
>>553 ビデオオーバーレイを使ってるときはそうなるかもね。
555 :
547 :2009/09/01(火) 19:36:24
>>551 そうでしたか。
.netFrameworkはインストールを要求するには大掛かりで憚られるので、
避けたいと思っていましたし、よかったです。
ありがとうございます。
>>552 便利なツールを教えてくださってありがとうございます。
これで調査して適切なライブラリを洗い出します。
VisualStudioのインストーラープロジェクトで依存洗い出してインストーラー作ってくれるけど、 そういうのは使えないのか?
変換フィルタを作っているのですが、720x480を入力し、そのままのメディアタイプでVMR7
に
出力すると、
ttp://kissho.xii.jp/1/src/1jyou90085.png こんなふうにおかしな映像が出力されてしまいます。
しかし、自作変換フィルタ後にAVIデコンプレッサを介してVMR7に接続すると、
正しく映像が出力されました。
AVIデコンプレッサは幅768にアラインしているのでしょうか?
その場合、それと同様のことを変換フィルタに組み込むには、
具体的にどこにどう実装すればよいのでしょうか?
よろしくお願いします。
>>558 VMRのメディアタイプのbiWidth見れば分かるが、768とかになってるはず。
>その場合、それと同様のことを変換フィルタに組み込むには、
変換時にアライン分飛ばせばいい。
560 :
558 :2009/09/05(土) 16:13:23
561 :
デフォルトの名無しさん :2009/09/06(日) 14:49:43
訳あってdirectshowを学ばなければならなくなった者です なかなか良い書籍やサイトが見つからないのですが、みなさんはどうやって勉強しているのでしょうか?
563 :
デフォルトの名無しさん :2009/09/09(水) 12:44:39
例えばデスクトップをキャプチャしてaviで保存するアプリを作ったとする このとき無圧縮だったり、そのほかのコーデックで圧縮したりするようにするにはどうすればいいんだ? どのフィルタの部分でそのコードを書く?のだね 初心者だから教えてみてみ
>564 VFWはファイルサイズ2G以下の壁が… 正直grapheditのが簡単な希ガス。
vfwはビデオコーデックの機能だけだカス
DirextShow初心者なのですが、 H264のaviファイルの各コマ画像を連続で取り出すことって 簡単に出来るのでしょうか・・・ 対応コーデック(フィルタ?)を入れれば再生は簡単に出来そうですが、、
568 :
デフォルトの名無しさん :2009/09/10(木) 18:36:40
directshowでビデオからの映像をグレイスケールにして二値化するにはどうしたらよいのでしょう
>>568 EZRGB24っていうサンプルが参考になるよ
571 :
デフォルトの名無しさん :2009/09/16(水) 03:11:58
二値化フィルターくらい簡単なら作ったげよか? 輝度でばっさり二値化するのでいいのか? 色で判断して二値化するほうがいいの? 閾値はどうする?プロパティページで変更出来るようにしたい? スライス方式って上下限の閾値ってのもあるぞ お好みを指定してくれ。 後、ソースはやらん
>>571 適応的二値化でお願いします
cvAdaptiveThreshold()を呼び出すだけより格段に速いやつを
573 :
デフォルトの名無しさん :2009/09/17(木) 09:11:36
周囲の環境から最適に二値化するやつか。 それはまんどくさ
574 :
デフォルトの名無しさん :2009/09/18(金) 22:24:21
cvAdaptiveThreshold()より改善するのは仕事でないと嫌だが、 まんま使うとかはダメなのか? 仕事として受けるなら設計書とソース提出するよ
自力で高速化してみます ありがとうございました
Visual C++ 2008 を使用しています。 Microsoft SDKs\Windows\v6.1\Samples\multimedia\directshow\baseclasses にある Streams.h をインクルードしたら IReferenceClockTimerControl が定義されてないと出ました。 これはどういった対処をすれば良いのでしょうか?
まずはビルドしろよ糞が
基本的な事を知らずにDirectShowに手を出すと泣くよ。 俺が昔そうだったから保障するw
>>576 ヘッダー全部もってこい。
もしくはちゃんとパスを通せばおk
>>576 MicrosoftSDKや、DirectX SDKと、VC++のヘッダファイルで同名のがあるから
インクルードの順番も注意しろ。
581 :
デフォルトの名無しさん :2009/10/09(金) 14:15:28
TChartShapeでchasVertLineにしてマークを表示させてるのですが マークが上と下(Y1とY0)に2つ表示されてしまいます これを上1つ(Y1)だけ表示されるのにはどうしたらいいですか?
あ、すんません。 誤爆してしまいました
583 :
デフォルトの名無しさん :2009/10/11(日) 07:36:37
同機種のwebカメラを2つ繋げてもグラフエディットでは1つしか表示されない。 調べてみるとPCによってはちゃんと表示されるものもある(カメラのドライバーは同じ物を使用) USBコントローラの数が関係してるのかと思うんだけどわからない。 ここには解説出来るような人いる?
いません
やっぱり難しいよね。ごめんなさい
態度が気に食わないので教えない
>>586 >>587 態度を改めます。私程度の力ではわからないため
お願いします教えてください。
【質問】
同機種のカメラ複数台接続してGrapheditで1個しか表示されない
カメラドライバの問題でなく「PC側によって」使えるものと
使えないものがあるが、何が違うのかわかりません。
【現在わかっている事】
ノートPCの一部ではUSBコントローラが複数あり
別々のUSBポートにつないでいれば同機種のWebカメラでも
利用可能。
また、ググると下記の記述があり私が試してみた感じ同じ考えです。
・同じ型番でもドライバが対応していれば大丈夫
・同じメーカーでも型番が違えば大丈夫
・片方のカメラにUSBハブを挟めば大丈夫
・メーカーが違えば大丈夫
http://blogs.yahoo.co.jp/honebuto_honebuto/28960469.html よろしくお願いします。
>>578 よくあるパターンだがDirectShowに限らず初心者はその「基本的なこと」が何なのかすら判らないことが多い
で、ググってもそういう事が書いてあるページがなかなか見つからない罠。結果挫折する・・・
590 :
デフォルトの名無しさん :2009/10/17(土) 01:48:31
キャプチャーカードやカメラの画像サイズの設定で 入力1080と720などの切り替えをしたいのですが、 DirectShow では IAMStreamConfig を使ってできましたが、 WindowMediaEncoderSDK いわゆるWMEncoderLib.dll系を使って できないでしょうか?
591 :
誰か助けて。 :2009/10/18(日) 21:37:48
ISampleGrabberを利用して画面キャプチャを行っています。 mpeg2をビットマップにすることは出来ましたが、 Webカメラで撮影して保存したファイルでは失敗します。 Webカメラの設定ではYUV2で保存されるようで、そのファイルのプロパティーで見ると MS-YUV(16ビット)と書かれていました。この場合、グラバのSetMediaType()には 一体何を与えればいいのでしょうか? なお、現状で、 media_type.majortype = MEDIATYPE_Video; media_type.subtype = MEDIASUBTYPE_RGB24; media_type.formattype = FORMAT_VideoInfo; を与えています。 これだと、GetCurrentBuffer()で失敗します。 そこまでは全部成功します。戻り値はVFW_E_WRONG_STATEでした。
592 :
誰か助けて。 :2009/10/18(日) 21:40:53
なお、フレーム読み込み箇所は次の通りにしています。 this->seeking->SetPositions(&ulc,AM_SEEKING_AbsolutePositioning,&ulc, AM_SEEKING_AbsolutePositioning ); // 1フレームレンダリング、完了を待つ while(this->control->StopWhenReady() != S_OK){} // レンダリング完了を待つ(不要か?) OAFilterState fs; this->control->GetState( INFINITE, &fs); // バッファを取得 this->grabber->GetCurrentBuffer( (long*)&this->media_type.lSampleSize, (long*)**this->load_buffer);
>>591 〜
>>592 です。
解決してないけど解決しました。
どうもよくわかりませんが、そのムービーファイルの数フレームだけ、
GetCurrentBuffer()でVFW_E_WRONG_STATEが返ってくるようです。
しょうもないので、GetCurrentBuffer()でエラーが返ってきても無視すると
うまく行くようになりました。こんなんでええんだろうか・・・
594 :
デフォルトの名無しさん :2009/10/18(日) 23:13:12
ピクセルフォーマットやメディアタイプを理解せずに、ISampleGrabberを使える事にびっくりした。 >Webカメラで撮影して保存したファイルでは失敗します。 このファイルがどんなファイルなのか、作っているGraphがどうなっているのか、等が分からないと、答える事は難しい。 よく分からないんだったら、IVMRWindowlessControl::GetCurrentImageあたりを使ったほうが無難だと思う。
基本的な質問で申し訳ないのですが、DirectShowはRenderFile()でファイル名やURLを指定して再生すれば、 自動的にストリーミング再生される、ということでいいのでしょうか? DirectSound等での再生は自分でストリーミング再生用のプログラムを書く必要があったので、そうならかなり有り難いのですが
試してみれば分かるんじゃね?
逆に自力でストリーミング処理するためには ソースフィルタを自作しなければならない ローレベルなことをやろうとすると途端に厄介なことになるのが DirectShowの世界
なるほど、ではやはりストリーミングは自動で行われるのですね どうもありがとうございました
フィルタを組み立てるだけだろ。自動でやるか手動でやるかの違い。 明示的にやりたいなら、自分でピンを繋げるコードを書く必要がある。
>>599 それは質問者の意図している部分とはちょっと違う気がする。
まあ、RenderFile()では思うようにできないことが分かったときに、
>>599 の意味が分かるのかもしれないけどね。
.NETからDirectshowで動画再生して、VMR9でミキシングしています。 OSDをしたくて一時停止の画像をミキシングしたあとポーズをすると、 osd.pause() mctrl.pause() 一時停止の画像が表示されたりされなかったりします。 それは非同期で動いているからとわかるのですが、 やっぱりこれは1フレーム待つしかないのでしょうか。
602 :
デフォルトの名無しさん :2009/12/08(火) 00:52:26
WEBカメラから取得した映像をWindowMediaEncoderではなく、DirectShowを使用して WMVでライブ配信したいのですが、いい資料とかサンプルソースとかありませんか??
H264のJMデコーダーで使えるHDサイズのテストストリームか JMエンコーダーで使えるHDサイズのyuv画像って ネットにないでしょうか?・・・ 自作するしかない?・・・
>>603 H.264のエレメンタリストリームでよければ適当な.mp4ファイルを
デマルチプレクスすればいいんでないかな?
「JMデコーダーで使える」って要件が今ひとつ分からんけど。
少なくとも「HDサイズのyuv画像」は転がってないんじゃないかな。
ファイルサイズ考えたら・・・
今のマルチコア3GHzのPCって H264の1920*1080サイズの動画を コマ落ちなしで再生できるんですか?
606 :
sage :2009/12/18(金) 13:59:14
qedit.hの話題が出てたけど、フォーラムにあるように #include <qedit.h> を、 #pragma include_alias( "dxtrans.h", "qedit.h" ) #define __IDxtCompositor_INTERFACE_DEFINED__ #define __IDxtAlphaSetter_INTERFACE_DEFINED__ #define __IDxtJpeg_INTERFACE_DEFINED__ #define __IDxtKey_INTERFACE_DEFINED__ #include <qedit.h> と書き換えたら、qedit.hで構文エラー。 qedit.hを書き換えなくていいように上記の方法をとったのに、構文エラー。 どういうことなの…
unko
608 :
606 :2009/12/18(金) 19:40:28
自己解決した。構文エラー該当行の定数"FPS"を新しく定義してしまっていた。不覚だった。
609 :
デフォルトの名無しさん :2009/12/19(土) 20:53:09
フィルタのを設定のやり方を教えてください。 ISpecifyPropertyPages でとってきて、 OleCreatePropertyFrame で、プロパティページを表示して、 変更すれば、できるんですが、毎回やるのは面倒。 プログラムでできませでしょうか? 具体的やりたいのは、Sony MPEG Decoderをノンインタレースにしたいのです。 #最初からノンインタレースをデフォルトにしとけばいいのに。ソニーさん。
JMはH264のリファレンスじゃない?
612 :
デフォルトの名無しさん :2010/01/31(日) 21:30:27
DirectShowを使ってwmaやwmv形式で電話orテレビ電話のようなことを行うアプリケーションを作成しています。 なお、通信部分に関してはフィルタグラフの外で実装しています。 フィルタの流れとしては、 送信部分は キャプチャ → エンコーダ → 自作レンダラ 受信部分は 自作ソース → デコーダ → レンダラ という流れにしようと考えています。 送信部分の自作レンダラはエンコーダから受け取ったデータを ソケットに渡すように実装できたのですが、 受信部分の自作ソースフィルタをデコーダに接続する部分がうまくいきません。 具体的にはwma通信の、 自作フィルタ → WMAudio Decoder DMO → レンダラ の自作ソースからデコーダへの接続で「共通するメディアの種類が無い」と言われてしまいます。 出力ピンのメディアタイプもメジャータイプをMEDIATYPE_Audio マイナータイプをWMMEDIASUBTYPE_WMAudioV8 としています。 push、pullの両方を実装して試してみたのですが、どこが悪いのかわからなくなってしまいました。 ご教授お願いします。
Pin接続シーケンス中のReceiveConnectionとかで Decoderが要求するMediaTypeとか取得できたような気がする。 しばらくDirectShowから遠ざかっているので違ったらスマン。
CBaseOutputPin的なら、GetMediaTypeとCheckMediaTypeの実装がおかしんじゃね?
615 :
612 :2010/02/01(月) 16:26:04
早速レスがついていて驚きました。
ありがとうございます。
>>613 GraphEditで見る限り、WMAudio Decoder DMOの入力ピンが求めているMediaTypeは
Major Type: Audio - Sub Type: {00000160-0000-0010-8000-00AA00389B71} - Format: GUID_NULL
Major Type: Audio - Sub Type: WMAudio V8 - Format: GUID_NULL
Major Type: Audio - Sub Type: WMAudio V9 - Format: GUID_NULL
Major Type: Audio - Sub Type: WMAudio Lossless - Format: GUID_NULL
であり、2番目のWMAudio V8に合わせて実装しています。
>>614 出力ピンのMediaTypeはメンバ変数として持ち、ピンのコンストラクタにて設定しています。
GetMediaTypeではメンバ変数として持っているMediaTypeを引数に代入し、S_OKを返しています。
CheckMediaTypeでは引数とメンバ変数のMediaTypeのメジャータイプとマイナータイプを比較し、
両方が一致した場合にS_OKを返しています。
メッセージボックスを出させて確認したところ、CheckMediaTypeではS_OKを返すパスまで進んでいるようです。
しかし、共通のメディアの種類が無いと言われて接続に失敗します。
そもそも、WMAudio Decoder V8に接続するピンはpushなのかpullなのかすらわからずにいます。
push型でいいのでしょうか?
フォーマットの部分も有効なデータがないと駄目な気がする。 メジャーサブの値は、モジュールをロードせずにフィルタ構築のヒントに使われるもの。 列挙で返すメディアタイプはきっちり値を設定していないと、「メディアがないぞゴルァ」エラーが出たような。 ビデオでそんな経験をしたことがある。
617 :
612 :2010/02/01(月) 18:14:22
レスありがとうございます。
>>616 書き忘れていましたが、フォーマットに関してもWAVEFORMATEXの型で周波数等すべての
データを設定しています。
GraphEdit上で自作フィルタの出力ピンのプロパティを見ると、
ASF Readerでwmaファイルを指定した場合の出力ピンとと同様になっています。
WMAudio Decoder V8との接続ではメディアタイプ以外のネゴシエイト等も行っているのでしょうか?
どんなインターフェイスが問い合わせされているかも調べてみるといいよ。 必要なインターフェイスがないと繋がらないケースもある。
619 :
612 :2010/02/01(月) 23:47:39
レスありがとうございます。
>>618 なるほど、インターフェイスに関しては考えていませんでした。調査してみます。
調べ方としてはCUnknown::NonDelegatingQueryInterfaceをオーバーライドして、
引数や返り値を見る方法を考えているのですが、それでいいのでしょうか?
また、もっと簡単な方法等ありましたらご教授お願いします。
620 :
612 :2010/02/02(火) 22:54:42
618さんのアドバイスに基づき、WMAudio Decoder V8との接続の際に問い合せられるインターフェイスを調査してみました。 問い合せられて失敗していたのは IAMOpenProgress IAMDeviceRemoval IAMFilterMiscFlags の3つでした。 特に問題になっているのは3つ目のIAMFilterMiscFlagsのような気がするので インターフェイスを実装して接続を試してみます。
621 :
612 :2010/02/03(水) 18:36:40
何度も書き込んですみません。 上の書き込みの通り、問い合わされたインターフェイスを実装し、接続を試してみましたが、 「共通のメディアの種類が無い」と言われて失敗。 CheckMediaTypeでは、formattypeの中身まで完全に一致してS_OKを返しています。(なぜか何回も) ソースフィルタはCSourceを、出力ピンはCSourceStreamをそれぞれ継承した形で作成していますが、 この構成ではWMAudio Decoder DMOに接続することはできないのでしょうか・・・ 本来ならば、上記のデコーダはWM ASF Readerと繋がるもので、 WM ASF Readerはファイルからの読み込みとデマルチプレクサの機能を備えた上でプッシュモデルでデータを流しています。 実装したいもの自体は 「ネットワーク越しに飛んできたWMAデータをバッファから読み出して下流のデコーダへと流す」という単純な仕組みのものなのに、 作るのはこんなにも難しいのかと愕然としています。 解決方法等ご存知の方が居りましたら、ぜひご教授ください。
自作フィルタ挟まない場合、グラフの構築は成功してるよね? 理論上、透過的な自作フィルタを作れば上手くいくと思うが、やはり何かが足りないのだろう。 フィルタとピンそれぞれインターフェイスが必要だし、ドキュメントが間違っていることも時々あるので地道に調べよう。
誰か知ってる人いたら教えてください。 AM_MEDIA_TYPE として取得した{73646976-0000-0010-8000-00AA00389B71}のようなGUIDから、 "MEDIATYPE_AnalogVideo"のような文字列を引く方法ってありますか? VC++2008です。
そういった機能は提供されていない
ちょっと調べてみた。 Baseclasses\wxdebug.cppが参考になるよ。DisplayTypeメソッドの中で GuidNames[pmtIn->majortype] のような形で文字列を得ている。 GuidNames 自体は同ファイル内に実装されているマクロ。 そいつをパクって自分のソースに持ってくればいいんじゃねーの? ただしuuids.hに記載されているタイプに限る。 実際に動かしてないから保証できないけど参考になれば。
どうもありがとうございます。 Microsoft DirectX SDK (February 2010)をインストールしていますが、 wxdebug.cppファイルがありません。 しかもBaseclassesフォルダもありません。 なぜでしょうか?OSはwin7です
DirectShowはかなり昔にDirectXに含まれなくなった。常識だろ。
常識かどうかはともかくDirectShowがどうなったかは Microsoft DirectX SDK (February 2010)のドキュメントのトップ頁に書いてある
Windows SDKをインストールしたところwxdebug.cppなどが入ってました。 どうもありがとうございます^^)
630 :
デフォルトの名無しさん :2010/02/23(火) 11:43:17
DirectShowのFilterを自作しているのだが、MFCを使うとregsvr32登録時にエラー。 #include "afxwin.h"をやらないで、DllEntryPointもDllMainも自作関数ならOKっぽい。 いくつかテストで作ってみたが、登録もGraphEdtへの追加がうまく行っても、 GraphをRunさせると、staticなメンバが異常で落ちるなどなど。 DirectShowのFilter作るのにMFCは使えないのかな?
お前の使い方が悪い
すいませんでした
Microsoft.DirectX.AudioVideoPlayback.Video 動画プレイヤーみたいなのを作ってて イコライザみたいなことをしたいんだけど 音声データってこれで取り出せるの?
昔DShowで動画編集ソフト作ってた頃 映像用の高速なサンプルグラバ書いたけど DX8.1時代のものだが欲しい人いるかな?
高速なサンプルグラバって、具体的にどの処理が高速なの?
連続フレーム、または数フレーム飛ばし デフォルトのと違って処理時間に関係なく 再生しながらコマ送りせずに全コマ取得可能
機能はわかった。 サンプルグラバって、コールバック受けて処理するんじゃなかったっけ?
デフォルトのはそうだけど こっちは正確にはサンプルグラバの子クラスじゃなくて ビデオレンダラの子クラスと補助的な関数で構成してある 要るなら個人情報削除してからソースをアップするよ
>>638 DirectShowでmp3とかmidiとかoggの波形データを取得する
プログラムを作ろうと思ってるんだけど、それの参考になりそうだから欲しい
640 :
デフォルトの名無しさん :2010/03/06(土) 14:48:30
>>640 あんがと、頂きました。
休日だからと12時間も寝てしまった・・・時間損した気分
>>641 CCaptureRenderer::DoRenderSampleとCVideoFile::TryGetFrameがかなり汚いコードですみません
ここがDShowの厄介な部分で試行錯誤の結果なので
mp3のデコード結果ならCCaptureRendererのようにCRenderer系のオーバーロードすれば作れるはず
俺ならNULLレンダラ繋いでグラバのコールバックでゴニョゴニョするかな
>>643 グラバはコールバックでロックできない
グラバはコマ送りにしないと勝手に再生位置が進むから連続で取れない
グラバはコマ送りにすると連続でいけるがものすごく遅い
もしこれらが解決されてるなら
>>634 は神
>>645 だが出来なかったんだ
具体的には残り再生時間が1分だとすると
コールバック開始から1分以内に処理しないとコールバックのスレッドが終了する
だから最後のほうのフレームが取れない
しかもフレーム単位のシークが糞
そうなんだ。不思議な話だね。
グラフにサンプルグラバーフィルターだけ追加して メディアタイプをメインMEDIATYPE_Audio、サブMEDIATYPE_PCM、にして mp3ファイルを指定してレンダリングすると ソースフィルタ → MPEG1スプリッタ → ffdshowデコーダ → サンプルグラバ → レンダラ になるのに NULLレンダラも追加して同じことすると ソースフィルタ → MPEG1スプリッタ → サンプルグラバ → NULLレンダラ ってなるのはなんでなんだぜ? ソースフィルタ → MPEG1スプリッタ → ffdshowデコーダ → サンプルグラバ → NULLレンダラ ってなると思ったんだが
レンダラが繋がらないからフィルタが中間に入るんだろ。 NULLレンダラはなんでも繋がる。
MPEG1スプリッタがサンプルグラバにPCMで接続してるってことか? なんかおかしくね?
>>648 試してみた。俺は ソースフィルタ → MPEG1スプリッタ → NULLレンダラ だったぞ。
>>640 WaitForFreeとSelectPixelQualityって何に使うん?
上の削除して適当に書いたらコンパイル通った
多分元のコード?から削除し忘れたんだろうけど
レスありがとう
>>649 んー、そうするとNULLレンダラ使う場合はインテリジェント接続は使用できんってこと?
レンダーしたあとに追加して接続しなおすしかないんかね
もちょっとスマートに行かないもんかね
>>650 そそ、俺もそこがよくわかんなかった
メジャータイプは当然同じなんだが、サブタイプ指定してるから
スプリッタはくっつかないと思ったんだよね
グラフエディットでOUTピンのサブタイプ確認したら
MPEG-Iスプリッタ: MEDIATYPE_MPEG1AudioPayload、MEDIATYPE_MPEG1Packet
ffdshowAudioデコータ: MEDIATYPE_PCM
ソースフィルタ → MPEG1スプリッタ → NULLレンダラ(サンプルグラバは接続されず)
ならあり得ても
ソースフィルタ → MPEG1スプリッタ → サンプルグラバ → NULLレンダラ
は無いんじゃないかと
>>651 サンプルグラバとNULLレンダラをグラフに追加してからで?
グラフエディットで特にメディアタイプ指定しないでやっても
サンプルグラバとNULLレンダラを追加してからインテリジェント接続すると
ソースフィルタ → MPEG1スプリッタ → サンプルグラバ → NULLレンダラ
ってなるんだよなー、個々のPCの環境によるんだろうけど・・・
もそっとインテリジェント接続の仕組み調べないとだな・・・
grapheditで調べたら?
>>654 もちろん使ってるよ、グラフエディット
でもメディアタイプ変更できないから、完全な再現ができないんよ
俺が知らないだけで、実はできたりする?
開発しているアプリケーションのグラフへリモートグラフで繋いで見てるの?
657 :
634 :2010/03/08(月) 23:48:48
>>656 それ知らなかった・・・できたんだそんなこと・・・
という訳でやってみたら
ソースフィルタ → MPEG1スプリッタ → NULLレンダラ (サンプルグラバは接続されず)
となってました。
疑問は全て解けました。ありがとう。
インテリジェント接続を使う場合にNULLレンダラ使いたいなら
NULLレンダラをグラフに追加してない状態でRenderしてから追加→再接続しかないのかな
手動で繋げよ。自動構築するから期待した動作にならないんだろ。
>>657 こんな時間にわざわざありがとう
これ使ってちょっとサンプルグラバとの比較ベンチマーク作ってみるよ
>>658 CRendererの派生クラス作ってNULLレンダラもどき作ればいいかも
そうすれば接続を限定してインテリジェント出来ると思う
661 :
660 :2010/03/09(火) 23:31:35
>>661 コードざっと斜め読みしただけだけど、サンプルグラバの方は、
データがディスクキャッシュ上にのってたりしない?
データのサイズが書かれていないので、はっきりしたことは言えないけど、
>無圧縮AVIは同じくらい速い
とか
>wmvやflv、mpg、mp4は数倍速い
とか
>tsはかえって遅い
とか、へんじゃないかな?
後、出力先が32ビット固定になってるけどデータは他のフォーマットで、
フォーマット変換が発生しているとかもありうる。
そういう意味では、BitBltしなくてもいいんじゃない?>計測
>>662 その「へん」なのがDirect Showなのだよワトソン君
ビルドして確かめればいいのでは?
キャッシュ?二回実行すれば?
コードもらったからもう寝るよ
664 :
デフォルトの名無しさん :2010/03/10(水) 12:22:01
>>661 >wmvやflv、mpg、mp4は数倍速い
ニコニコから落としたmp4読ませたら31fpsに対して213fpsとか吹いたw
酷い場合は6対173とかになるし
いくらなんでもサンプルグラバが遅すぎるから使い方間違えてるんだと思う
FFdshowのせいかもしれんがErrorが1とか2ぐらい出るファイルが多い
あとコード汚すぎ
cppインクルードしすぎ
665 :
デフォルトの名無しさん :2010/03/10(水) 19:49:36
>>664 じゃあ正しいサンプルグラバの使い方って何?
単に再生するデータの画像形式と出力するサーフェースの形式が異なっていて コンバートが挟まってるだけなんじゃないの?>バラバラな結果
667 :
デフォルトの名無しさん :2010/03/14(日) 00:07:37
速いらしいのでゲームでサーフェスにHD動画張るのに
>>634 の使いたいのですが、
どうすればDirectXのサーフェスに直接出力できますか?
テクスチャのアドレスを与えると何故か部分的に透明化したり色が化けるようです。
CVideoFile::GetFrameはDLLに実装して、
ゲーム本体にはDirectShowのヘッダーは入らないようにしました。
ステート設定してアルファ無効化して描画しろよw
669 :
デフォルトの名無しさん :2010/03/14(日) 01:09:15
>>668 ありがとうございます。
その点は自己解決しました。
しかし、いろが入れ替わっているような現象と、
画像が前のフレームと重なって切れたようになってテクスチャの描画がうまくいきません。
670 :
デフォルトの名無しさん :2010/03/14(日) 01:23:40
お騒がせしました ARGBじゃなくてABGRでした。 あと、スレッドは1つにしないといけないようです。
671 :
デフォルトの名無しさん :2010/03/24(水) 17:02:19
CLSID_WMASFWriterのProFile関係の使い方に詳しい方教えてください。 CLSID_WMASFWriterを使用してAVI→WMVに変換しようとしています。 元動画のビデオサイズ/ビットレート/オーディオ情報等を維持して変換 したいのですがデフォルト設定だとW320×H240/225Kbpsになってしまいます。 ProFile設定を行う事でビデオサイズの変更等が出来る事はわかったのですが 元動画からカスタムProFileに必要な情報を取得する方法がわからないので 参考になる日本語サイト、無ければ英語サイト等ありましたら教えて下さい。 考え方が間違えていたらご指摘ください。よろしくお願いします。 開発環境は VisualC++2008、Platform SDK 2003 SP1、DirectX SDK August 2009 です 。
672 :
デフォルトの名無しさん :2010/03/24(水) 17:11:19
>>671 補足
ProFileの設定はIID_IConfigAsfWriterとIWMStreamConfigを使用して
ビデオサイズ等を登録してConfigureFilterUsingProfileで変更しています。
674 :
デフォルトの名無しさん :2010/03/29(月) 08:54:15
ありがとうございます。参考にして試してみます。 他にもありましたらご指摘をお願いします。
WMV/WMAを作りたいのならDMOのEncoder使うのがいいと思います
676 :
デフォルトの名無しさん :2010/04/21(水) 22:41:34
DirectShowを使用して、任意のメモリ上の画像データ配列(640×480 24bit)を任意のタイミングで AVIファイルに出力する処理を考えています。 過去ログを見て、CSourceStream::FillBufferを独自フィルタで書き換えるというのがあり、 試してみたのですが上手くいきません。 サンプルを見ながら以下のことはできました。 BouncingBallサンプル(CSourceStream)→圧縮フィルタ→AVI Mux→FileWriter→AVIファイル ただ、このBouncingBallサンプルは、FillBufferメソッド内部において描画処理を 行っており、ここに外部から画像データをコピーすることができません。 やりたいことは以下の通りです。 メモリ上の画像データ配列→ソースフィルタ→圧縮フィルタ→AVI Mux→FileWriter→AVIファイル (これを任意のタイミングで行う) VFWを使えば簡単なのですが、このAVIにWAVを合成する必要があるのでVFWではできません。 (できないよね?) ちなみに画像データ配列のもとは専用キャプチャボードからの入力なので、 入力自体はDirectShowでは取得できません。 一体どうすれば良いのでしょう?
排他制御して現在のデータをキューなり、リストなり好きなもので受け渡すか 普通にプッシュ型のソースフィルタを作るだけだろ。 あとvfwでも音も入れられる。 >一体どうすれば良いのでしょう? きちんとドキュメントとソースコード読め。
678 :
676 :2010/04/22(木) 07:28:39
>>677 ご回答ありがとうございます。
>普通にプッシュ型のソースフィルタを作るだけ
外部からのデータをどのようにソースフィルタへ渡すかが分からない
のです。画像データのポインタを渡すだけとか、何か簡易な方法
でできないか考えていましたが、分かりませんでした。
>現在のデータをキューなり、リストなり好きなもので受け渡す
プロセス間通信を使うわけですね。これならデータを渡せそうですね。
>vfwでも音も入れられる
そうなんですね。勉強不足でした。ありがとうございます。
「普通にプッシュ型のソースフィルタを作る」ことに関して、
どのようにデータを渡すかを、もう少し詳しく教えていただけると
助かります。
>>678 ballサンプルよりもpushsourceの方がわかりやすいんじゃないかな
(ビットマップを展開して送り出している)
フィルタからデータをポインタなどで渡したいなら、Interfaceを自作してみてはどうか。
クリティカルセクションとイベント組み合わせれば、簡単な受け渡し機構作れるだろう。 DirectShow以前の、初歩的な話なんだよな〜
681 :
676 :2010/04/22(木) 22:20:05
>>679 お返事ありがとうございます。
ballサンプルを使っているのは、検索した時にBouncingBallのFillBuffer()を
改造すべし、とのちょっとした記述があったため、試しに使ってみました。
後、開発環境が古いっていうのもありますが。
Pushsourceのサンプルを見るためにWindowsSDKをインストール中です。
>>680 お返事ありがとうございます。
何というか、結局DirectShowはデフォルトでメモリ上の画像データを
AVIに吐き出す機能は備えていないということなんですね?
VFWだと逆にストリームなどの概念がないため、メモリ上の画像データを
1コマずつAVIとして出力するので簡単なのですけど。
なぜDirectShowにはそのような機能がないのか不思議に思います。
682 :
676 :2010/04/22(木) 22:31:21
>>681 だからソース読めって言ってるだろw
機能がないとかじゃなくて、お前が全くDirectShowの使い方を知らないだけ。
>>677 で既に実装方法書いてるだろ。
ドキュメントとソースコード読んだのになぜか実装されません 読むとソースコードできるんじゃないんですか?
685 :
676 :2010/04/27(火) 22:09:35
>>681 初心者で申し訳ないです。
ソースフィルタにプロセス間通信でデータを渡すことのできる機能
を実装する、ということですよね?
今はその方向で検討中です。
686 :
デフォルトの名無しさん :2010/04/30(金) 08:31:33
IID_ISpecifyPropertyPagesを使用して USBカメラのフィルタのプロパティページを表示し 設定しています。この設定値、毎回初期化されて困っています。 IID_IAMCameraControl、IID_IAMVideoProcAmpインターフェースで カメラ設定タブ、ビデオ設定タブはプロパティページを介さず設定できたのですが USBカメラ固有のプロパティを設定するインタフェースはどうればよいのか教えてください。 目的は、フィルタのプロパティページでカメラ固有のプロパティが 保存したいというものでそのような方法あればどのような形でも 結構ですのでお願いします。
ヘルプにも書いてあるが、プロパティページはあくまでデバッグ用途のものだからね。 OLE/COM Object Viewerでどんなインタフェースを持っているのか調べてみたら?
688 :
デフォルトの名無しさん :2010/05/09(日) 12:49:05
「ビデオ入力デバイスからの映像をAVIに保存する」
ttp://www.geekpage.jp/programming/directshow/video-capture-save-avi.php のところで、同時に2ファイルに出力したいです。
#define OUTPUTFILENAME2 L"save2.avi"
IFileSinkFilter *pSink2;
IBaseFilter *pFileOut2;
pCaptureGraphBuilder2->SetOutputFileName(&MEDIASUBTYPE_Avi,
OUTPUTFILENAME2, &pFileOut2, &pSink2);
を追加すると、
// Graphを生成する
pCaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_CAPTURE,NULL, pDeviceFilter, NULL, pFileOut);
ができません。
上手な手はないでしょうか?よろしくお願いします。
689 :
デフォルトの名無しさん :2010/05/09(日) 12:56:14
すみません。ちょっと修正・・・
「ビデオ入力デバイスからの映像をAVIに保存する」
ttp://www.geekpage.jp/programming/directshow/video-capture-save-avi.php のところで、同時に2ファイルに出力したいです。
#define OUTPUTFILENAME2 L"save2.avi"
IFileSinkFilter *pSink2;
IBaseFilter *pFileOut2;
pCaptureGraphBuilder2->SetOutputFileName(&MEDIASUBTYPE_Avi,
OUTPUTFILENAME2, &pFileOut2, &pSink2);
pCaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_CAPTURE,NULL, pDeviceFilter, NULL, pFileOut2);
を追加すると、
// Graphを生成する
pCaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_CAPTURE,NULL, pDeviceFilter, NULL, pFileOut2);
ができません。
上手な手はないでしょうか?よろしくお願いします。
1デバイスに対してなら使用が排他的なら、2つに出力を分配するとか工夫がいるんじゃないかな。
691 :
デフォルトの名無しさん :2010/05/09(日) 21:43:44
分配フィルターをAddFilterして、順番にPINを接続するしかないですかね? 2つに出力を分配するフィルタって、標準でありましたっけ?
692 :
686 :2010/05/11(火) 13:53:34
>>687 OLE/COM Object Viewerをつかって
いろいろためしてみたのですが、USBカメラのインタフェースまでたどりつけませんでした
毎回、毎回シャッタースピードを設定するのがめんどうで
どうにかして保存したいのですが、いまだ方法みつからず
693 :
デフォルトの名無しさん :2010/05/12(水) 23:44:53
>>691 SmartTee
InfneetTee
好きなほう使え
>>692 FPSなら設定できる
694 :
デフォルトの名無しさん :2010/06/14(月) 17:24:50
質問させてください。 C#のスレッドで質問してスレ違いと指摘もらいましたので、こちらに転載します。 USBカメラからの静止画だけをキャプチャしたいのですが、どのようにしたらよいのでしょうか。 動画をキャプチャすることを前提に静止画をキャプチャするサンプルはいくつかあったのですが、 これだと動画をキャプチャしている間はなぜかKeyDownイベントがフォームで受け取れず、KeyDown で一度ブレークポイントをはって止めると、そのあとはKeyDownが効くようになってしまいました。 どのみち動画は不要なので、静止画だけをキャプチャする方法が知りたいです。 よろしくお願いします。
696 :
デフォルトの名無しさん :2010/06/14(月) 18:11:21
>>695 ありがとうございます。
ただ、そのサンプルだと動画も表示していないと静止画がキャプチャーできないようです。
動画無しにはできないでしょうか。
SampleGrabber使うのなら、直前に色空間変換噛ましてRGB32にしといたほうがいいよ 理由は多くのWebカメラ対応しようとしてこの辺を自前で実装しようとするとめんどくさいからなんだけどね。 AVI DecompressorとColor Space Convetorが基本で、あとはMJPEGやMPGやOverlayMixerとか使うな 時間かけても良くて、速度にこだわるのならFOURCCから色空間判読して自前実装も止めやしないけどね 誰か色空間の相互変換Transform Filter作ってくれないかなー 探したけどffdshow raw video filterぐらいしか見つからなかったわ
>>697 便乗質問させて下さい。
MessageDrain に WM_WHEEL を流す方法はないものでしょうか…。
ビデオレンダラを再実装でもしない限りやっぱり無理でしょうか。
>>700 自分の場合はMessageDrainするWndではなくて、ParentWndがWM_WHEELを受け取る設計にしてる
どうしてもそれが無理ならGlobalHook使えばいいと思うよ
補足。上記方法はウィンドウモード(非ウィンドウレス)で、旧レンダラとVMR7とVMR9でWM_WHEELは確認しました
>>701 ,702
ありがとうございます。
> ParentWndがWM_WHEELを受け取る設計
こんなことが可能なのですか…。メッセージの流れ方を勉強して出直してきます。orz
こんにちは。 今、VMR9を使って、二つの動画のミキシング再生を行うソフトを作っています。 IVMRMixerControl9でそれぞれの動画の位置を変えたりできるので ミキシングモードで動画を読ませるまでは行けたようなのですが、 それぞれの動画用のIMediaControlやIMediaSeekingが取れないので、うまく 動画の再生開始やシーク位置調整ができません。 どうしたら、どうすればそれぞれの動画用のIMediaControlやIMediaSeekingを 生成できますでしょうか? それとも根本的に間違っているのでしょうか? ヒントだけでも教えてもらえたら助かります。よろしくお願いします。
IMediaナントカはIGraphBuilderからQueryInterfaceすればいい
706 :
704 :2010/06/18(金) 02:34:37
>>705 レスありがとうございます。
ですが、その方法では動画を二つ読ませるミキシングモードではうまく
いかなくて困っています。
(前略)
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGB);
(中略)
pGB->RenderFile(wFile1, NULL);
pGB->RenderFile(wFile2, NULL);
pGB->QueryInterface(IID_IMediaControl, (void **)&pMC);
(中略)
pMC->Run();
では、wFile1とwFile2が同時に動いてしまいます(当たり前)
IVMRMixerControl9からは、dwStreamIDを使ってwFile1の動画の位置、
wFile2の動画の位置を個別にコントロールできるので、何らかの方法で
この状態の二つの動画の片方づつへと再生開始等のコマンドが送れるはずだと
思うのですが、まだ見つけることができません。
よろしくお願いします。
もし自分なら2つGraphBuilder作るかな
GMFBridge辺りを修正して別のグラフの二つのストリームを、 VMRのグラフへ同時に入れれるようにしないと無理なんじゃないかね。
Platform SDK 2003 SP1付属のTextture3D9サンプルで質問をさせてください VisualC++2008でUnicode文字セットを使用するを指定しビルドかけたところ、リンクで >DShowTextures.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall CBaseVideoRenderer::CBaseVideoRenderer >(struct _GUID const &,unsigned short *,struct IUnknown *,long *)" (??0CBaseVideoRenderer@@QAE@ABU_GUID@@PAGPAUIUnknown@@PAJ@Z) が >関数 "public: __thiscall CTextureRenderer::CTextureRenderer(struct IUnknown *,long *)" (??0CTextureRenderer@@QAE@PAUIUnknown@@PAJ@Z) で参照されました。 というエラーがでます。 CTextureRenderer::CTextureRenderer( LPUNKNOWN pUnk, HRESULT *phr ) : CBaseVideoRenderer(__uuidof(CLSID_TextureRenderer), NAME("Texture Renderer"), pUnk, phr), m_bUseDynamicTextures(FALSE) { // Store and AddRef the texture for our use. ASSERT(phr); if (phr) *phr = S_OK; } 該当箇所は上記なのですが、Unicode文字セットでビルド通すにはどうすればよいでしょうか?
PlatformSDKが古い
BaseClasses
712 :
704 :2010/06/18(金) 22:19:38
>>707 ,708
ありがとうございます。
頑張って修正してみます。
既存のフィルタとほとんど同じ動作をさせたいフィルタを作りたくて、 既存のフィルタを継承させてclass定義みたいなことって出来るんですかね? 結局CBaseFilterを継承させて内部でその既存のフィルタ呼び出してみたいなことをしないといけないのかな? COMよく分からない。。。
既存のフィルタってのがdllなら継承はできない。ソースがあるのなら勿論おk。 自作フィルタ内にてDirectShowをアプリケーション利用するって方式を想像してるかもしれませんが、Wrapperは相当難しいと思う おそらく、一番楽そうなのはDLL Hackの方法かな
715 :
デフォルトの名無しさん :2010/09/12(日) 12:01:45
やっべぇぜ。 DirectShowでnVIDIAの3D Vision対応動画を表示させることになったが、 IRリミッターの制御やらなんやらがさっぱりわからん。 #この点はスレ違いですまん NVAPIあたりを触ればいいというところまでは解ったけども、 本当に表示できるのかどうかがわからなくなってきた。 とりあえず、このコードでサンプル3D映像を表示できる、というものが どこかにないかい?
横からごめん。URL1行レスに爆笑してしまった
すみません、質問があるのですがよろしいでしょうか? 長文で申し訳ありません。 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で取得してます。)
SetTimeFormat
720 :
デフォルトの名無しさん :2010/09/17(金) 22:36:02
すいません。教えてください。 USBカメラの調整をOleCreatePropertyFrameでできると思いますが、これと 同じ調整を値を指定してソフトから設定してやることはできるでしょうか。 (たとえば明るさを50にする等) よろしくお願いします。
>>718 MPEG2-TSのファイルだったらMPEG2デマルチプレクサフィルタの仕様によるんじゃないか
>>720 IAMVideoControl
IAMVideoProcAmp
IAMCameraControl
あたりじゃないかな
722 :
デフォルトの名無しさん :2010/09/21(火) 13:21:59
Windows SDKだったかなDShow.hは
724 :
デフォルトの名無しさん :2010/09/28(火) 15:59:31
1>main.obj : error LNK2001: 外部シンボル "_PIN_CATEGORY_PREVIEW" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "_IID_IBaseFilter" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "_CLSID_VideoInputDeviceCategory" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "_CLSID_SystemDeviceEnum" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "_IID_ICreateDevEnum" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "_IID_IMediaControl" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "_CLSID_CaptureGraphBuilder2" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "_IID_ICaptureGraphBuilder2" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "_CLSID_FilterGraph" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "_IID_IGraphBuilder" は未解決です。 は何が悪いんでしょうか? VS2005です
「外部シンボル は未解決です」 これをググってから出直せ。
必要なlibがリンクされてない
優しさは罪
頭が悪いってちゃんと正解教えてやれよ
このレベルで止まってたらDirectShowとなんて戦えないぞ。
いや、ある意味ここが一番難しいとも言える。
DirectShowのどこらへんがDirectなのか俺にもわかるように説明してくれないか。
DirectXファミリーだから。
MSだって「あれ? これDirectXじゃないんじゃね?」と思ったくらいなんだから、 誰にも説明できないだろ。 悟れよ。
ActiveMovieを知らずにDirectShowを語っていいのは 小学生までだよねー(AAry
735 :
デフォルトの名無しさん :2010/09/30(木) 15:14:45
もったいぶらずに ダイレクトに答えを示せよ。だからDirect Showだろ。
DirectXはユーザーレベルでダイレクトにハードウェアを操作できるからDirectじゃないの? DXVAが出る前なんかはDirectShowにDirect感が全くしなかったし、むしろDXVA主流の今こそDirectXに入るべきだろう。 逆にDirectSoundはカーネルミキサーを越えられないならDirectXから外れていいよ。
DirectDrawやDirect3Dも別にハードウェアを直接触れるわけじゃないけどな
直に見ろ
生がいいよね
>>724 DirectShowのヘルプのファーストステップガイドに書いてある。
H264のスライスヘッダの後ろのスライスデータ部って先頭はバイトバウンダリでしたっけ? スライスヘッダからビット状態で続くんでしたっけ?・・・・ スライスヘッダの参照IDだけ変えたいんですがビット数がかわってずれるのを どこまでずらせばいいのかわかんねorz
ずらしちゃいやーん
743 :
デフォルトの名無しさん :2010/10/25(月) 21:28:28
DirectShowを使った音楽再生ソフトを作っているのですが RenderFileで読み込んだファイルの種類を判別するにはどうすればいいですか? ユーザーが音楽以外の動画や画像ファイルを読み込もうとした場合に弾きたいのです
ファイルの最初の数バイトを読み込んで判別
DirectShowで動画と音声を含むファイルを読み込む際、音声のみを読み込むにはどうしたらいいでしょうか? NullRendererをグラフに追加してからグラフを作成してみたりしましたが、ファイルにより音声が破棄されたり 動画が破棄されたりまちまちで困ってます。 入力されるファイルの形式が予測できないのでインテリジェント接続を使いたいのですが・・・
メジャーメディアタイプでビデオのみ受け付けるヌルレンダラ作ればいいんじゃね。
ああ・・・やっぱりそうなりますか ありがとうございます
>>743 ファイル名のエクステンションをチェック
>>745 グラフを構築した後、ビデオレンダラーをNullRendererに置き換える
ビデオレンダラーのウィンドウハンドルをNULLにする手もあったかな、ちょっと自信がないが…
749 :
745 :2010/10/28(木) 20:28:11
>>748 その方法で、スプリッタの直後にNullRendererは挿入可能でしょうか?
ビデオのデコーダーを挟みたくないのです。
ビデオ側だけピン切って何も繋がなければいいじゃん
ファイルソースの出力ピンとオーディオレンダラーの入力ピンを明示的にIGraphBuilder::Connectにかければ ムダなフィルタは一切はいらんじゃろ。 その辺はGraphEditとかで操作してイメージ掴んでからコードに落としてみなされ
752 :
745 :2010/10/29(金) 22:55:52
753 :
デフォルトの名無しさん :2010/11/15(月) 12:08:55
-
アプリに動画含めて配布したい場合ライセンスとかインストールされてるか とか考える場合wmvにするしかないのですか?
SCFHみたいな仮想WEBカメラを作ろうと思ってるんだけどDirectShow未経験だから厳しくて・・・ どういう流れで作ればいいの? 教えてエロい人
まずはソースフィルタを作って、それから必要なインターフェイスを実装して、更に登録するカテゴリをデバイスにする。 カメラのようなデバイスを扱うものは、OSがラップしてDirectShowとして使えるようになっていた気がする。 ドライバ作るよりは、フィルタで作ったほうが簡単だろう。 てか、それを自力で調べられないなら作るのは厳しいと思われる。
フィルターを使わずに字幕みたいな文字列を表示させることってできますか? フィルター作るの大変すぎ
760 :
デフォルトの名無しさん :2010/11/28(日) 01:05:53
あげ
DirectShowフィルタ作らないならスレ違いだから他所でやってくれ スレ違いだけどヒントだけ 透明ウィンドウを作って文字を書く 他のものに重ねたいならさらにレイヤードィンドウ
ドィンドウってなんだw レイヤードウィンドウな
763 :
デフォルトの名無しさん :2010/11/28(日) 09:56:04
>>761 ありがとうございます。
でもなんかできないです。
DirectXの画面はこう言うのできないんじゃないですか?
なにがしたいかによる レイヤードウィンドウで解決できるものもあれば、ゲーム画面のサーフェスに書かなきゃならない場合もある しかしすべてDirectShowの範囲じゃない。スレ違いなんだから素直に消えてくれ 以後レスあってもスルーする スレ違失礼
やりたいことはDirectShowで再生されたどうがの上に字幕みたいな 文字列を書くことです。ゲームではないです。
VMR使え
VMR調べてみました。一見よさそうなのですが 環境依存が激しいみたいです なんかハードの設定によって使えないとかあるみたいです><
楽したいならある程度切り捨てろ。 VMRならDirectXに対応しないものは全部とか。 嫌なら自分でフィルター書け。
SampleGrabberとか使って毎フレーム自分で描画してついでに文字も描画したらいんじゃね?
質問失礼します。 FlashMediaLiveEncoder(以下、FME)で読み込めるDirectShowFilterを作成中です。 テンプレート、フィルター、ピン情報を修正して、GraphEditのVideo Capture Sourcesに登録する事はできました。 私が作ったFilterが、FMEのDeviceリストに表示されているのですが、選択すると、 Problem with video capture device. Please verify that the video capture device is working correctly and is not already in use. と警告が出てしまいます。 FMEのEncodingLogには、 Tue Nov 30 2010 11:29:16 : Selected video input device: PrjNikoFilter Tue Nov 30 2010 11:29:17 : Error : Could not find the selected video device Tue Nov 30 2010 11:29:17 : Error : Could not find the selected video device Tue Nov 30 2010 11:29:17 : Problem with video capture device. Please verify that the video capture device is working correctly and is not already in use. と出力されていました。 VS2008で追ってみたところ、コンストラクタが呼ばれた直後にデストラクタの呼び出しが行われていました。 (逆アセンブリまで行ってしまったので、呼び出し履歴やステップ実行で追えませんでした) どうやったら正常にFMEに認識させる事ができるのでしょうか? 同じ症状の解決方法をご存じの方いましたら、お願いします。
FlashMediaLiveEncoderの話であって、Directshow関係ないだろ
最低限必要なインターフェイスが実装されていないために扱えないのだと思う。 あと動作確認するならSkepeでの動作も見ないとな。使用者が多いのでこれで正常動作しないと運用に困ることになる。
自作のDirectShowフィルタを他アプリケーションから映像ソースとして見られるようにするプログラムのサンプルあったら教えてください。
DirectShowフィルタ作ってhoge.axっていうフィルタファイルを作ったんだが regsvrex32でレジストリに登録しようとするとエントリポイントが見つからないって言われて... エントリポイントって extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID); BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved) { return DllEntryPoint((HINSTANCE)(hModule), dwReason, lpReserved); } じゃダメなの?
DllCanUnloadNow DllGetClassObject DllRegisterServer DllUnregisterServer があるかどうかじゃね?普通に作れば実装されていると思うが・・・
マルチ
DirectShowを使って動画を再生するプレイヤーを作っていて、シークバーを実装したいのですが、どうすればいいでしょうか?
適当にTrackBarかなんか用意して ユーザーが動かしてないとき・・・タイマーで再生位置取得→スライダーの位置更新 ユーザーが動かしているとき・・・スライダーの位置を元に再生位置変更
追記 再生位置を取得/設定するのはIMediaSeekingでも使えばいいんじゃない?
GetDurationで取得した値を、秒単位にしたいのですがどうすればいいでしょうか?
教えてください。 DirectShow & Windows7 で mpeg2 のファイルを再生 (最終的には各フレームの画を抜き出)してみたいと思っています。 ・WMP では問題なく再生できます。 ・GraphEdit にファイルを入れると「このムービーのストリームには、 サポートされていない形式のものがあります。」とエラー?が表示され、 音声のみのグラフが形成されます。複数の mpeg2 ファイルで同様です。 ・avi ファイルなどは問題なく動画と音声を再生することができます。 ・Microsoft DTV-DVD Video Decoder を自分で挿入してその後ろに Video Renderer や Sample Grabber などをつなげようとしても 「接続に必要な中間フィルターの組み合わせがみつかりませんでした」と エラーが表示されます。 ・プログラムで IMediaControl::RenderFile を使用して mpeg2 のファイルを 設定しようとすると 0x00040242 のエラーコードが返ってきます。 環境は Windows7 で、OS をインストールした後に VisualStudio2008 を入れ、 WMP のセットアップを走らせただけの状態です。 GraphEdit は SDK などをインストールしないで実行ファイルのみを コピーしました。念のため GraphStudio でも同じことをしてみましたが、 エラーメッセージが表示されないだけで結果は同じでした。 1. Microsoft DTV-DVD Video Decoder の Video Output1 ピンに先の Video Renderer や Sample Grabber を繋げるにはどのようにすればよいのでしょうか。 2. IMediaControl::RenderFile の戻り値 0x00040242 の意味を知りたく、 ヘッダファイルを検索してみたのですが見当たりませんでした。VS の エラールックアップのようなものはないでしょうか。 ご教示いただければ幸いです。
Microsoft DTV-DVD Video Decoderのピン出力のformattypeがFORMAT_VIDEOINFO2のみなので、 FORMAT_VIDEOINFOを要求するフィルタには接続できないんだろう。
vfwmsgs.h:624:#define VFW_S_PARTIAL_RENDER ((HRESULT)0x00040242L)
Windows7って最初からmpeg2videoのデコーダ入ってるんだ。知らなかった。 んじゃプルのDemuxもあるのか?
TSの話なら無理 WMPでは再生できるけど。
789 :
784 :2010/12/15(水) 09:41:55
返信をありがとうございます。 やっぱりそうですよね。 このまま使うならお勉強して対応するピンをもったフィルタを作らないといけないのか。。。 ※無理っぽい VFW_S_PARTIAL_RENDER なんて定義があったのですね。 勉強不足でした。
それくらい作れよw
791 :
784 :2010/12/15(水) 16:43:12
うん。いま、あきらめてフィルタ作りのお勉強してます。(´・ω・`) てきとうなサンプル見つけて動かして、改造して‥‥ ピンが接続されていないので、操作は続行できません。0x80040209 ってなんだー、と頭を抱えてるところ。w
vfwmsgs.h:138:#define VFW_E_NOT_CONNECTED ((HRESULT)0x80040209L)
ttp://msdn.microsoft.com/ja-jp/library/cc352402.aspx このページを参考にシークバーを作成してみたのですが、FLVファイルをシークしようとするとエラーが出て止まってしまいます。
HEAP[tes.exe]: HEAP: Free Heap block 8365fe0 modified at 8388f50 after it was freed
Windows によって tes.exe でブレークポイントが発生しました。
ヒープが壊れていることが原因として考えられます。tes.exe または読み込まれた DLL にバグがあります。
あるいは、tes.exe がフォーカスを持っているときに、ユーザーが F12 キーを押したことが原因として考えられます。
可能であれば、出力ウィンドウに詳細な診断情報が表示されます。
FLVファイルはYouTubeからダウンロードしたもので、
スプリッタにはFLVSplitter.axがデコードにはffdshowが使われています。
他のmp4やwmvなどでは問題なかったのですが、どなたか原因を知りませんでしょうか?
>>783 IMediaSeeking::SetTimeFormatでタイムフォーマットをTIME_FORMAT_MEDIA_TIMEにすると
IMediaSeeking::GetDuration()で100 ns単位の値が返ってくるので秒に換算したらよかろう
100 ns
=100*10^(-9) s
=10^(-7) s
1 s
=10^7 * 100 ns
接続されていないからでは・・・
映像をRenderFileしたものから映像フィルターを削除して音だけ再生させる ことってできませんか?
できる
IGraphBuilderからEnumしてIFilterGraphをもってくるのは わかったんですが、どれが映像のフィルタでどれを削除すれば いいんでしょうか?
ピンのフォーマットでも見れば? ダミーのビデオレンダラを生成してそれを後で削除って方法や色々やりようがあると思うけど。
以下のスキームで先頭に巻き戻して先頭から再生すると、再生開始直後に「プチッ」というノイズが発生してしまいます。 IMediaControl::Stop() IMediaSeeking::SetPositions(0, AM_SEEKING_AbsolutePositioning, duration, AM_SEEKING_AbsolutePositioning) IMediaControl::Play() 考えられる原因はなんでしょうか?ご教授お願いします。
マネージ型のDirectSoundでは プライマリーバッファがクリアされないためにノイズが出る不具合が 知られているが、それか? 対策は、停止した時[再生する前]に無音データを0.2秒ほど再生する
再生する前じゃダメだな、停止する時、無音データを追加再生する に変更
なるほど、ありがとうございます。 試してみます。
教えてください。 1. 自作でフィルタを作ろうと思います。 このフィルタの入力形式(ピンの設定)に優先順位を指定することは可能でしょうか。 たとえばサブタイプを、RGB32 > YUY2 の優先順位にして、フィルタの組み合わが 存在するのであれば IMediaControl::RenderFile() などによるグラフの自動生成の際に RGB32 を入力としたグラフを生成させることは出来ますか。 今の環境ではレンダラフィルタを作成する場合に CBaseRenderer::CheckMediaType をオーバーライドして RGB32 でも YUY2 でもどちらも接続を許してしまうと YUY2 で接続されてしまいますが、 RGB32 の方が処理が楽なので、出来ればそちらで繋いでほしいのです。 2. フィルタ内の処理の高速化について。 素人考えでは、画素数の大きな動画ファイルの形式変換などを行なう場合、 画素ごとに処理をベタで行なうとかなりの時間が掛かるように思います。 それ自体はミリ秒単位ですむので人間の感覚としては大したことはないのですが、 普通の動画の秒辺りのフレーム数などを考えると処理が間に合わなくなりコマ落ちしそうです。 それでも出回っているフィルタでは、複雑そうなことをしているものでもコマ落ちなどはしていないと思います。 ベタな処理の高速化というと、処理をマルチスレッド化して、たとえば処理するフレーム画を 数分割して別個のスレッドに平行して処理させるなどの方法くらいしか思いつかないのですが、 このあたりはどのように考えるべきなのでしょうか。 以上、ご教示ください。
DMA
何フィルタ作ろうとしてるのか、どのような接続を考えているのかわからんけど 1. できるけど、相手側にも都合があるよ 2. そこが腕の見せ所
808 :
805 :2010/12/28(火) 20:37:46
返信をいただき、ありがとうございます。
>>806 Direct Memory Access のことでしょうか。
ハードでやってるいるのなら参考には出来ないですね。。。
>>807 いくつかの種類の動画を特定のフォーマットに変換するプログラムを作成したく、
動画の中の各フレーム画を抜き取るために DirectShow を使えないかと考えています。
それで、対応する(元の)動画の中に個性的なフィルタを使用しなければならないものがあって、
それに対応しつつ、他のフィルタにも同じように使用できるフィルタを作りたいな、と。
後ろに動画の情報を流してあげる必要がないので、いまのところはレンダラフィルタを想定しています。
1. やるとしたら、どのような方法になるのでしょうか。
2. この類の経験がなく、方向性に悩んでいます。
もしご存じでしたら、方法論のヒントだけでもいただけないでしょうか。
>>808 そういう用途なら素直にTransformフィルタベースでいいと思うよ。
後ろにはNULLレンダラを繋げておけば良い。
動画変換と同時にリアルタイムプレビューするのでなければコマ落ちの心配はいらん。
810 :
805 :2010/12/29(水) 22:51:41
>>809 ありがとうございます。
年明けになりますが、その方向も入れて考えてみます。
>>808 自分が過去にやったネタ
(1) サンプルグラバを使う
(2) サンプルにあるDumpフィルタをカスタムして使う
敷居が低いのは前者だけど、
いろいろ細かいことがやりたいなら後者がオススメ。
Nullレンダラも不要。
もちろん代償もあるけど、
Transformフィルタベースで作ったって大変だし。
814 :
525 :2011/01/01(土) 11:40:36
USBカメラのビデオキャプチャで録画開始時間と終了時間を管理したいのですが、いい方法はないでしょうか? avi以外の形式でビデオキャプチャすれば可能な気がするのですが方法がわかりません。。
それはプログラミングの質問か?
817 :
815 :2011/01/05(水) 07:50:47
開始終了時に現在時刻をとってくればいいんじゃないの
ファイルの作成時刻見るだけだろ・・・
820 :
815 :2011/01/05(水) 16:22:35
録画開始指示(run)から実際に録画が開始されるまでのタイムラグが知りたいんです。。 他のデータと同期をとるためにミリ秒レベルでわかれば嬉しいんですが、、、
IMediaControlのRunして戻ってくるまででいいんじゃねえの?
サンプルグラバでタイムスタンプ取れなかったっけ?
Runした時点で開始だろ。 いつから待機する仕様になったんだ?
Run〜実際の録画開始時刻のタイムラグが気になるようなら フィルタ挟み込んで調べる以外に方法はないだろうな。 茨の道だとは思うが。
DirecthShowに関して質問があります IGraphBuilder::RenderFile(FILENAME, NULL) でオート接続した場合に選択されるデコーダフィルタのCLSIDを 取得するにはどのようにすれば良いのでしょうか? やりたいことは SourceFilter->DecoderFilter->SmartTee Filter->PreView側:RenderFilter ->Capture側:SampleGraber と手動で接続することです。 DecoderFilterのCLSIDが取得できれば CoCreateInstanceでフィルタを作成して IGraphBuilder::AddFilter()でフィルタを追加した後に手動で接続することができるのですが、 CLSID が取得できないため手詰まりとなっております。 ヒント等で結構ですのでご教授願います。
AddToRotしておけばグラフ構成がわかる
>>820 VMR9のレンダーレスモードを使ってコールバックされる
タイミングをチェックするのが最適かと。
ただ、その場合描画も自前でやる必要があるけど、
精度にこだわるならそれくらいしてもいいでしょ。
訂正:グラフエディタでわかる
割り込みスマソ AddToRot→GraphEditは便利だよね
830 :
815 :2011/01/07(金) 07:42:45
みなさんアドバイスありがとうございました。 描画を自前で用意することも考慮にいれてもう少し模索してみたいと思います。
831 :
825 :2011/01/07(金) 18:50:24
>826さん、829さん返答ありがとうございます。 ですが私の言葉足らずで質問の意図が伝わっていなかったため再度質問させて下さい。 あらかじめファイルフォーマットがわかっている場合にはグラフエディタを用いてデコーダフィルタのCLSIDを取得する方法でも可能ですが、 任意のファイルフォーマットで下記グラフフィルタを構成するための方法がわからず困っています。 SourceFilter->DecoderFilter->SmartTee Filter->PreView側:RenderFilter ->Capture側:SampleGraber SmartTeeフィルタをグラフに挿入後にPreviewピンとCaptureピンをRenderFilterとSampleGraberに接続する方法だと それぞれにデコーダフィルタが挿入される構成になり、処理に無駄が生じてしまっています。 SourceFilter->SmartTee Filter->PreView側:->DecoderFilter->RenderFilter ->Capture側:->DecoderFilter->SampleGraber どのようなアプローチがよろしいのでしょうか? アドバイスをお願いいたします。
>>831 一旦自動で繋いだ後にフィルタを列挙し、
レンダラの直前にSmartTeeを挿入する
833 :
831 :2011/01/07(金) 22:10:44
>>832 さん
アドバイスありがとうございます。
なるほど、その手がありましたか。
@IGraphBuilder::RenderFile でフィルタグラフを生成
AIGraphBuilder::EnumFilters でフィルタを列挙
Bフィルタピンを列挙してそれがレンダフィルタピンに接続しているかを判定していき、レンダフィルタの前のフィルタを特定
C特定したフィルタとレンダフィルタの間にスマートフィルタを接続
という方法でいけそうですね。
うまくいきましたらご報告します。 ありがとうございました。
834 :
832 :2011/01/08(土) 23:29:24
>>833 Bの前にレンダラフィルタを特定した方が早くね?
てか、レンダラは自分でAddFilterするなら、
フィルタ列挙も不要かも
835 :
825 :2011/01/09(日) 00:03:59
>>832 さん
たびたびのアドバイスありがとうございます。
ようやく@〜Cのやり方で所望の動作を実現できました。
と思ったら、832さんがもっと簡単な方法をアドバイスしてくれていたんですねw
ですがせっかくのアドバイスを理解できないため、もしよろしければもう少しアドバイスください。
レンダラは自分でAddFilterしています。
レンダラの直前のフィルタを特定するためにA〜Bを実行したのですが、もっと簡単な方法があるのでしょうか?
836 :
832 :2011/01/09(日) 08:03:39
>>835 レンダラの入力ピンのConectedToで接続元のフィルタの出力ピン、
そこからそのフィルタ、って分かるんじゃなかったかな、
と思ったんですが、今手元にPCがないので
自信ないすorz
それでいけるよ
838 :
825 :2011/01/09(日) 23:52:21
>>832 さん、837さん
たびたびのありがとうございます。
教えて頂いた方法でうまくいきました!。
@レンダラフィルタの入力Pinから IPin::ConnectedTo() で接続先のピンインタフェースをを取得
A取得したIPinからIPin::QueryPinInfo で接続フィルタを特定することが可能!
おかげでコードもずいぶんすっきりしました。
この度はいろいろとありがとうございました。
webカメラからビデオキャプチャをして、 一部を切り取ったり、拡大縮小してPictureboxに 表示したいのですがそんなことは可能ですか?
可能なのでドキュメントを読んできちんと学習してください
>>840 ヒントをもらえませんか?
ドキュメント読んでSampleGrabberを使用して
キャプチャ出来るところまでは出来たのですが
一部切り出しなど加工方法がわからないのです。
DirectShowのことは理解しているようなので、画像加工は別のスレで聞くかググレ。
サンプルグラバを使用して非同期( IMediaFilter::SetSyncSource( NULL ) )でフレームのデータを取得しています。 この状態で、最後のフレームを識別する確実な方法はないでしょうか。 以下のようなことをしてみました。 ・ IMediaEventEx::SetNotifyWindow でイベント通知を受ける -> 非同期のためソースフィルタが最後のフレームを処理したタイミングで通知が来てしまい、 サンプルグラバはまだ途中のフレームを取得しているらしい ・ IMediaSeeking::GetDuration と ISampleGrabber::GetConnectedMediaType で取得した 再生時間とビデオヘッダ中のフレームあたりの時間からフレーム数を計算して、 それとサンプルグラバで受け取ったフレーム数を比較して判定する -> 計算結果が微妙に異なることがある ネットで調べた限り、フレーム数そのものを受け取る方法は見つけられませんでした。 ほかには、ふたつめの方法と「その後しばらくデータを受信しなければ最後だった」との判定を 組み合わせるくらいしか思いつきません。 確実な方法があれば教えていただけませんか?
再生が停止するまでに来た最後のフレームが最後になるんじゃない?
IMediaDet::get_StreamLength を使う GetDuration と同じ結果になっても当方は一切関知しない
846 :
843 :2011/01/19(水) 13:46:37
遅くなりました。
ありがとうございます。
>>844 再生が停止するまでというのは、IMediaEventEx::SetNotifyWindow による通知のことでしょうか。
それとも他のイベント検知よる判定でしょうか。
基本、非同期で扱っているので、これまでに調べた方法によればあまりあてにはできませんでした。
>>845 試してみます。w
EndOfStream
SampleGrabberを使って全音声データを取得するのは無理なんでしょうか?
C++もDirectXも一通りやってるんですが、 仮想カメラデバイスってどうやったら作れますか? 既存ウェブカメラやデスクトップのスクリーンキャプチャを入力として、 エフェクトを加えて、Ustream配信とかしたいんですが。 オープンソース、フリーでやるつもりなので GPLなコードとか紹介してくださるだけでもOKです。
>それから必要なインターフェイスを実装して、更に登録するカテゴリをデバイスにする。 このへん具体的に知りたいんですが。。。
具体的にもなにもMSDNにそのままのサンプルがあったと思うけど
みんなMMFの勉強もしてるの?
855 :
デフォルトの名無しさん :2011/01/26(水) 15:25:12
>>853 知らないならレスしないで下さい。ウザいだけです。
勉強する気がないならレスしないでください 不快です死んでください
テンプレ通りの荒らしに反応するのイクナイ って、君も荒らしか?
DirectShowでPCのスピーカーから鳴っているのと同じ音をキャプチャする方法はあるんでしょうか? クリック音や再生中の音楽などを丸ごとキャプチャしたいです。
ない
標準の機能としてはない気がするが、フィルタ作ったらできるんじゃね? どうやるかは知らん
XPならオーディオキャプチャフィルタを使って入力を"Stereo Mix" とかに設定したらできるんじゃない?
Part 3 スレ って 17 しかレスないの?
このスレ、立った当初から居るけど、もう二年半も経つのか。 よく落ちないな。
DirectX9 SDKの日本語ドキュメントでdirrectshowが含まれているバージョンを探しているのだけどMSDNで見つけることができません。 DirectX 9.0 SDK Update (October 2004) の前のVerにdirectshowが含まれているっぽいのだけどアップされていない。 場所を知っている人がいましたら教えてください。
867 :
865 :2011/02/24(木) 00:22:08.92
>>866 SDK本体ではなくdirectShowが含まれたDirectXの日本語ドキュメントを探しています。
868 :
865 :2011/02/24(木) 00:33:10.88
ない
ドキュメントは2004年のが日本語で見れるしWindows SDKにDirectShow入ってるのに 2002年のに拘る理由はなによ VC6? ご愁傷様です
うちのPCのHDDにはまだ入ってるな
873 :
865 :2011/02/25(金) 01:42:34.09
ローカルで日本語ドキュメントを見たかっただけですが無理そうですね。 今までどおりWebのやつをみます。 いろいろとレスありがとうございました。
874 :
デフォルトの名無しさん :2011/02/27(日) 07:20:38.17
フィルターを探しています。 動画をフレームごとに静止画形式のPNGに変換してくれるフィルターはないですか?
ありますよ
876 :
デフォルトの名無しさん :2011/02/27(日) 08:46:21.06
>>875 ありがとうございます。
そのフィルターの名前とかダウンロード先を教えてください。
教えてください。 GraphEdit でグラフを構成して再生ボタンを押下すると以下のエラーが出ます。 これはどういうときに出るエラーなのでしょうか。 調べているのですが、今のとこ意味がよく分かりません。 同じフィルタ構成でも、入力のメディアファイルによって出たり出なかったりします。 code : 0x80040204 enum : VFW_E_ALREADY_CONNECTED text : 処理に含まれるピンが既に少なくとも 1 つ接続されている。 GraphEdit のエラーメッセージボックスのメッセージ表示 The graph could not change status. この操作で使用されているピンの中で、少なくとも1つは既に接続済みです。 (Return code: 0x80040204)
レンダラフィルタのインスタンスから CBaseRebderer* を参照する方法を探しています。 端的に言うと、Null Renderer の CBaseRebderer::IsStreaming() を使用したいのですが、 DirectShow でこれを使用する場合、インターフェイスの形でインスタンスを取得すると思います。 こんな↓感じで。 CoCreateInstance( CLSID_NullRenderer, NULL, CLSCTX_INPROC, IID_IBaseFilter, (LPVOID*)&nullRenderer ); 試してみると、(CBaseRebderer*)&nullRenderer でもいけるようなのですが、 IBaseFilter はそもそも CBaseRebderer を含んでいません。また大量に繰り返していると プログラムが落ちるようです。他の原因かもしれませんが うえの方法が間違っている場合、 Null Renderer から CBaseRebderer* を取得する方法としてはどのような手段があるでしょうか。
ない
880 :
878 :2011/03/03(木) 17:21:37.10
そうですか。残念。 ありがとうございました。
IAudioSessionEventsでメインウィンドウにメッセージを送ってセッションのイベントを通知してるんだけど、 その間にメインウィンドウのスレッドから IMediaControl::Stop すると Stop から制御が返ってこなくてプログラムが停止します・・・ なんか解決策ありますか?
デッドロックしてんだろ? スレッド毎の実行位置調べれば、何が悪いのかすぐわかるだろう。
ありがとうございます。 ところでここで聞くことではないかもしれませんが、スレッド毎の実行情報を見る便利なツールはありますか?
visual studio
885 :
881 :2011/03/10(木) 22:36:35.51
解決しました! 処理待ちのメインウィンドウに別スレッドからSendMessageしてました・・・・ ありがとうございました。
Mpeg2TSファイルの再生にMPEG2 Demultiplexerを使用し、 指定PIDのストリームを受け取って何かするレンダラフィルタを作成しているのですが、 ソースによって、動画がドロップします。 自作フィルタに届くIMediaSampleの表示開始ストリームタイムが、その時点でのストリームタイムより小さい時に起こるようで、 demuxからの送出が間に合わず、その結果、動画再生に影響が出ているのかと想像しています。 一度demuxから出力ピンを生やせば、自作フィルタをNullRendererに差し替えても、何も接続してなくてもドロップするという状況ですが、 解決するために試せる事があれば、ご教示下さい。
887 :
デフォルトの名無しさん :2011/03/17(木) 01:01:21.39
>>886 もう少しわかりやすく書かなきゃわからん
transformフィルターを作ったんだけど、
その中でデバッグ用にファイル作成しています。
ただ、フレームごとにファイルが作られない理由がよくわからないため教えてください。デバッグを終了するといっぺんにファイルが作られるようです。
やっていること
transformメソッド内でfopen()を書いて画像データをファイルに書いています。
当然最後にfclose()しています。
処理が重すぎるのでしょうか?
最近めっきりフィルタ開発から離れたPGです。 Windows7が当たり前になってきた昨今ですが、 DirectShowって映像系のソフトではまだ主流の技術ですか? Windows7でもDirectShowにかわる別物は出てきていないのですか? 言語はC++ですか?いまだにCOMが生きていると考えて良い? それともC#ですか?
yes,no,yes,yes,no
検索キーワードは Media Foundation な
892 :
デフォルトの名無しさん :2011/03/30(水) 03:13:25.31
うへ、自己解決 連番ファイルのサンプル数が少なすぎていたようでした
894 :
815 :2011/04/08(金) 17:27:57.08
USBカメラを2台使用してaviファイルへカメラ映像を保存されたことがある方いませんか? 保存中(Run実行中)にPauseを行うと、どちらかのカメラor両方のカメラ映像がフリーズするんですけど原因がわかりません・・・。 1.カメラ1のRun実行 2.カメラ2のRun実行 3.カメラ1のPause実行 4.カメラ2のPause実行 5.カメラ1のRun実行 6.カメラ2のRun実行 6実行後にカメラ映像のフリーズ発生。 特に自作フィルタをつないだりしていないシンプルなコードなのですが。 ちなみに同じ手順をPreviewやAVIファイル再生時に行っても映像のフリーズは発生しません。
895 :
894 :2011/04/08(金) 17:31:35.01
追記です。 6の手順の後にGetStateでそれぞれのカメラの状態を確認すると、映像がフリーズしていてもRun状態が返ってきます。。
>>894 カメラでPauseの件はやったこと無いのでよく分からんが、ぐぐったら録画を一時停止するのは見つかった
"DirectShow run pause camera"でぐぐって上から2つ目とかその辺
どんなフィルタグラフか書かないことには何ともいえない。 2台のカメラの映像をミックスしてファイルに落としてるのか? 2台のカメラの映像をそれぞれ違うファイルに落としているのか? プレビューpinやファイル再生の場合はレンダラにスレッドが居る。 キャプチャpinはそのピン自信がスレッドを持つ。 その辺の違いか?
898 :
894 :2011/04/09(土) 03:45:17.66
>>896 情報ありがとうございます。ControlStreamも試してみましたが、やっぱりフリーズしてしまいます。
>>897 レスありがとうございます。長くなりますがこんな感じのソースです。↓
// エラー処理略
IGraphBuilder *pGraphBuilder_1;
ICaptureGraphBuilder2 *pCaptureGraphBuilder2_1;
IMediaControl *pMediaControl_1;
IGraphBuilder *pGraphBuilder_2;
ICaptureGraphBuilder2 *pCaptureGraphBuilder2_2;
IMediaControl *pMediaControl_2;
IBaseFilter *pFileOut_1;
IBaseFilter *pFileOut_2;
ICreateDevEnum *pCreateDevEnum = NULL;
IEnumMoniker *pEnumMoniker = NULL;
IMoniker *pMoniker = NULL;
ULONG nFetched = 0;
CoInitialize(NULL);
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(LPVOID *)&pGraphBuilder_1);
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(LPVOID *)&pGraphBuilder_2);
CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC,IID_ICaptureGraphBuilder2, (LPVOID *)&pCaptureGraphBuilder2_1);
CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC, IID_ICaptureGraphBuilder2, (LPVOID *)&pCaptureGraphBuilder2_2);
pCaptureGraphBuilder2_1->SetFiltergraph(pGraphBuilder_1);
pCaptureGraphBuilder2_2->SetFiltergraph(pGraphBuilder_2);
// MediaControlインターフェース取得
pGraphBuilder_1->QueryInterface(IID_IMediaControl, (LPVOID *)&pMediaControl_1);
pGraphBuilder_2->QueryInterface(IID_IMediaControl, (LPVOID *)&pMediaControl_2);
899 :
894 :2011/04/09(土) 03:50:43.61
続きです。 CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (PVOID *)&pCreateDevEnum); pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumMoniker, 0); pEnumMoniker->Reset(); // 最初のMonikerを取得 if (pEnumMoniker->Next(1, &pMoniker, &nFetched1) == S_OK) { pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pDeviceFilter_1 ); pGraphBuilder_1->AddFilter(pDeviceFilter_1, L"Video Capture2"); pMoniker->Release(); } // 2番目のMonikerを取得 if (pEnumMoniker->Next(1, &pMoniker, &nFetched2) == S_OK) { pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pDeviceFilter_2 ); pGraphBuilder_2->AddFilter(pDeviceFilter_2, L"Video Capture2"); pMoniker->Release(); } pEnumMoniker->Release(); pCreateDevEnum->Release(); pCaptureGraphBuilder2_1->RenderStream(&PIN_CATEGORY_PREVIEW,NULL, pDeviceFilter_1, NULL,NULL); pCaptureGraphBuilder2_2->RenderStream(&PIN_CATEGORY_PREVIEW,NULL, pDeviceFilter_2, NULL, NULL);
900 :
894 :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の解放実施。
902 :
894 :2011/04/09(土) 21:26:30.11
>>901 レスありがとうございます。RunとPause、PauseとRunの間隔をそれぞれ2秒あけてみましたが、結果は同じくフリーズします。。
(たま〜に正常に録画できたりはしますが)
実行順序を
カメラ1のRun→カメラ1のPause→カメラ2のRun→カメラ2のPause→カメラ1のRun→カメラ2のRun
に変更すると映像はフリーズせず正常に録画できます。
でも何故そうなるのかわからないのですっきりしなくて・・・。
順序を変えて録画できるのも、今の実行環境でたまたまできているだけで、環境をかえるとやっぱりできないのかな?とか考えてしまいます。。
そもそもキャプチャグラフにポーズって概念があるんだっけ? フリーズってのは映像の動きがパタリと止まること? or それともデッドロックみたいに一切プログラムが動かなくなる? (pMediaControl->Pause()が戻ってこないとか)
904 :
894 :2011/04/10(日) 08:43:49.08
>>904 映像の動きがパタリと止まります。
映像が止まっている状態でGetStateを実行するとRun状態が返ってきます。。
ドライバレベルの問題な気がする
Pauseしなくても録画は止められるんだから、 フィルタ内部では流しっぱなしにしておけばいいんでないの なんとなくWebCam側でPauseを考慮していない無い気がする Pauseって、「一旦流れを止めて、次回続きから再開」ってことだろ データ垂れ流しのWebCamで、続きから再開って(こっちでバッファ用意しないと)出来ないし
ライブソース(キャプチャピン)を使ってポーズすると 次にRunしたときにレンダラが送られてくるフレームのタイムスタンプが古いので 表示しないとか、そんな現象があったような。 例えば最初にRunをして3秒後くらいにPauseして、更にRunすると 3秒くらい映像が固まるがその後また動き出すとかそういう現象はないか?
908 :
894 :2011/04/10(日) 21:17:15.95
>>906 PauseやStop以外に録画を止める方法があるのでしょうか?
何故Pauseにこだわっているかというと、カメラ2台の映像とその撮影対象のデータ(数値)の同期をとりたいのですが、Run開始から実際に映像が保存されるまでに時間がかかるため、RunしてすぐにPauseをかけて録画準備時間+α待ってから再度Run実施、という方法をとっています。
みなさん2台のカメラキャプチャを行う時の同期はどうやってとっていますか?そもそもPauseを使って同期をとろうとしていること自体間違っているのでしょうか…。
>>907 2度目のRunのあと一瞬(1〜2フレームくらい)動くことはありますがその後すぐに映像が止まります。1度目のRunの時間とは関係ないようです。
俺なら、完全に同期をとるって目的なら、同一のフィルタグラフで操作するかな? うろ覚えで悪いけど、フィルタチェイン丸ごと、別のフィルタグラフに移動する関数があったはず それが無理そうなら、自作フィルタを作る。 タイムスタンプで同期をとるようなやつ
911 :
894 :2011/04/11(月) 16:33:41.77
>>909 ありがとうございます。
909さんの方法を試してみることにします。
アドバイスしてくれたみなさん本当にありがとうございました。
ビデオキャプチャするときに、理想フレームレートに なるようダミーフレームを自動で挿入してくれる既存のフィルタってありますか?
IMediaControl::RenderFile と IGraphBuilder::RenderFile の違いってなんでしょうか? MSDN では後者を使えってあるんだけども。
GraphEditで遊んでいたのですか、Audio Capture Sourceに登録されている デバイスを見ると、どれにもピン情報が一つもありません(pin 00:のような)。 ところが実際にインサートしてみると、ちゃんとピンが表示されており、 他のフィルタとピンを接続すればちゃんと動作します。 これは一体どういう状況なのでしょうか?
あれは検索用の情報で、そういった情報のないフィルタも作れる。 実際のピンは実行時に決まる。
>>915 ありがとうございます。
ただその後試しにプログラム中でそのAudio Capture Sourceをマネージャーに
登録後、Enumしてピンを見てみると Input Pin(Rendered)というピンしかありませんでした。
本来ならGraphEditで見られるCaptureなどといったピンもあるはずなのですが、
なぜこうなっているのか事情がよく判らないんのですよ。
ピンってのは実行時に増えたり減ったりするんだぜ。 接続状況で変化したり色々。
Transformでステップ実行してみれば
誰か、ビデオキャプチャフィルタ作ったヤツ、いない? サンプルソースのありかだけで良いから教えて欲しい。 プレビューピンとかキャプチャピンとか、訳わかんね。 出力ピン2つ用意して、カテゴリでプレビューとキャプチャ返しても、繋がりやしねぇ。 MSの解説ページは意味不明だし... ほんと、企業はどうやって作ってんのよ?
DDKにサンプルあるんじゃないの
ドライバ作るとDirectShowとして使えるようになる仕組みなので、DirectShowフィルタ自体の作成はしなかった気がする。 ソースフィルタだよね?色々なインターフェイス問い合わせるから、実装していないインターフェイスがあると動作してくれないプログラムがよくある。そういう状況なんじゃないかな。
何を作りたいのか、どこで詰まってるのか書かないと答えようが無いぞ キャプチャデバイスとしてウェブカムみたいに認識させたいならそういう方法はあるし、 カメラとかにはプレビューピン無いのもあるから別にキャプチャピンだけで事足りるし
昔、PlatformSDKになる前のDirectShowSDKでやってたころはビットマップを自分で作って流すソースフィルタのサンプルがあったよ。 もしビデオキャプチャソースというのを単純なソースフィルタのことをさしているならそのサンプルでよいと思う。 でも本当にUSBカメラなどのドライバとしてのビデオキャプチャソースを作りたいならDDKを見ないとダメだろう。 DDKも古いやつしか知らないが、WDMモデルでビデオキャプチャクラスみたいなクラスがあるんだろう。 そしてそのミニクラスドライバを書くとかそういう話になるんじゃないかな。
925 :
920 :2011/05/03(火) 14:05:42.25
皆さんありがと。
まさにUSBカメラのキャプチャソースみたいなものを作りたいんだ。
キャプチャピンのみなら問題ないんだけど、そこにプレビューピンを追加したいんだ。
つまりフィルターを使う側はRenderStream()でPIN_CATEGORY_PREVIEWで繋ぎにいきたいんだ。
そこで出力ピンを2つ用意して、GetPin()でキャプチャピンとプレビューピンを返すようにしてもうまく動かない。
(レンダーフィルターに繋がらない)
MSの解説見て未意味不明だから、皆さんのお知恵に頼ってみた。
>>924 ちょっとDDK見てくる。
いま気が向いたんで探してみたけどたぶん DDKルート\src\wdm\videocap\testcap これだな。 かなりデカイさんぷるなんで読む気がしないが なんかHTML読むと、このドライバはDShowでは4つのフィルタに見えるらしい。
927 :
920 :2011/05/04(水) 00:18:18.39
DDKがなくてWDKのサンプルを見たのだが、
>>926 氏の言うtestcapがなかった_| ̄|○
videocap\usbintelとか1394dcamとかいうのがあったので見てみたが、これはDirectShowフィルターではない...
というか、このサンプル全部検索したが、どこにもDirectShowフィルターを作ってない...
DDKを探してくる...
>>918 DisplayTypeとか使ってQueryAcceptで渡されたサーフェイスの情報を
調べてみるといいよ。
サーフェイスの種類を判別するためにトップとボトムが逆になってたり
プライマリサーフェイスではBI_BITFIELDSが渡されたりする
(プライマリではコーデックが拡大縮小したりしなきゃいけないので面倒)。
929 :
928 :2011/05/04(水) 20:47:12.24
最近フィルタ作ってなくて記憶があいまいになってた。 サーフェイスの違いの判断はHeightが負かどうかで ボトムアップが逆になるのはRGBの時(YUVは常にトップダウン)だったかな。 スマソ YUVはディスプレイドライバによって色や輝度の変換式が異なったりするので注意してね。 CVideoTransformFilterはフォーマット変更やフレームスキップを考慮したクラスに なってるよ。
>>919 ,
>>928 ありがとうございます。
>>CVideoTransformFilterはフォーマット変更やフレームスキップを考慮したクラスに
QueryAcceptはCheckMediaType経由でCTransformFilter::CheckTransformを呼び出す
と記述されているので、そこでS_OKを返してみたのですが、追いかけてみます。
931 :
920 :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); で表示できるようになった。
お疲れさん。 DDKは必要なかったようだね
おめ。自作ソフトからなら問題ないだろうけど、
>>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
COM関係ではよくあるよねえ。 DirectShowじゃないけどShell namespace関係で同じようなデバッグしたことある
動画ファイルを TMPGEnc などのソフトで見ると、アスペクト比などの情報があると思います。 このアスペクト比を DirectShow を使用して取得することは可能でしょうか? 可能であればその方法を教えてください。
ピンから提示されるメディアタイプのVIDEOINFOHEADER2 ファイルやデコーダやデマルチプレクサによっては無い事もある
ありがとうございます。 VIDEOINFOHEAER2:dwPictAspectRatioX と dwPictAspectRatioY ですね。 VIDEOINFOHEAER の場合は、bmiHeader のなかの biYPelsPerMeter と biXPelsPerMeter から 計算できそうですね。
Windows Media関連やったことある人いる? WM ASF Writerを使ってwmvファイルの書き出しをしてるんだけれど、 そん中のコーデックの指定はどうやってやるの? IWMCodecInfo3を使ってコーデック(WIndows Media Video v7 / v8 / 9とか)の 列挙はできたんだが、コーデックをsetする方法が分からんです。。。
IConfigAsfWriter ってのがまんまあるじゃないか
IConfigAsfWriterからたどって、対象のストリームのWM_MEDIA_TYPE::subtypeと BITMAPINFOHEADER::biCompressionをセットしたらできたよ。ありがと! 実は以前も同じようにやったんだけど、その時はsubtypeしか指定してなかったから うまく動かなかっただけでした。 とりあえず感謝!
誰かヘルプ。EVRでHWデインターレースしたいのだがうまくいかん。 Win7 SP1/64bit版で、ffdshowはrev3866で行き詰ったので今はrev3154に落とした。 GraphEditでUSBキャプチャ->ffdshow raw->EVRと接続して、 ffdshowの設定でリセット状態から変更したのは、Outputのページで "Set interlace flag in oouput media type"にチェックを入れただけ。 映像からはさっぱりコーミングノイズが消えない。 ffdshowのInfoページを見ていると望みどおりYUY2のまま出力されてる。 EVRの代わりにVMR9にしてみても状況は同じ。どこか理解できずに手順抜けているんだろうか? よろしくお願いします。。ちなみにGPUは内蔵intelHDです。
具体的にアドバイスはできないが、チップセットの型番くらいは 書いといた方がいいと思う radeonかGeForceで試すことはできないの?
intel media sdkのDirectShow Filter (含むサンプル)がまともに動かん… つーか、COMのインターフェースのヘッダファイルくらい付けてくれよ
なんだか知らんがビルドできないで喚いているならお前が能力不足なだけだ
いやいや、設定してるのに、設定通りにエンコードしてくれない ドキュメントもいい加減だし
何も変更も加えずにビルドできたんだが・・・ 943はまず自分自身を疑うこと覚えよう。 デバッグの鉄則だ。
>>946 そりゃビルドは出来るよ
でも、設定したした通りにエンコード出来ないんだわ
つーか、ビルドって何をビルドしたの?
いったい何をビルドしたのか気になる…
MPEG2デコーダの利用で、正しい展開結果は出力されるけど毎回3フレーム欠落する、 という現象に誰か心当たりがあれば原因を教えてくれないだろうか。 繋ぎ方はソースフィルタ(ES送信用)-MPEG2デコーダ-擬似レンダラ(結果取得用)で、 プッシュモードからGOP単位分のES、例えばIBBPBBPBBPBBPBBの15フレームを送っても 12フレームしか結果が出力されない(レンダラにIMemInputPin::EndOfStreamが来る)。 余分に次の3フレーム(IBB)を送ると、今度は15フレーム出力されたのでこれで 凌ごうかとも思ったけど、後述の無視出来ない量のリークがこれに関連してる気が して来たので、解決が必要かなと思ってる。 追記: 結果出力後にフィルタを停止してタスクマネージャを見ると、それに相当すると 思われるメモリリーク(1440×1080で約20M。RGB32設定)が検出されるので(・∀・)、 デコーダ内部でデコードは終わってるけど「何か」を待っていて残りのサンプルを 放出してくれていないような印象。 受信出来た分のサンプルのリークではないと思う。AddRef/Releaseで確認すると 常に参照カウント1なので、この分はReceiveから戻り次第デコーダが解放するはず。 _CRTDBG_LEAK_CHECK_DFのDEBUGビルドでも報告は無いし、大物GDIリソースも解放漏れは無いっぽい。 上流からES送信後にIPin::EndOfStreamを送るのを暫く待っても無駄だった。 下流からIQualityControl::Notifyが必要かとも思ったけど、それなら6フレーム送った時にも 3フレームしか出力されないのが解せない。グラフへのSetSyncSource(NULL)も効果なし。 プッシュモードの限界という結論だったら泣ける(・∀・)。
ミスった、IMemInputPin::EndOfStreamはIPin::EndOfStreamの間違い。
デコーダへのデータ供給終了処理が必要だと思うけど、どんなデコーダ使ってるの?
PowerDVDを入れたら導入された'CyberLink Video/SP Decoder (PDVD8)'。 ファイル名はCLVsd.axとなってる(日時09/08/24-22:00 バージョン8.4.0.730のもの)。
EndOfStreamでちゃんと終端処理して欲しいよね。特殊なメソッドとかあるのかな?
954 :
949 :2011/06/25(土) 10:33:30.29
その後も調査を進めてみた所、デコーダが放出しないのはどうも末尾でなく先頭3フレームらしい事が分かった (入力フレーム5,6を交換すると出力フレーム2,3が入れ替わった)。 ますます分からない。後のPフレームがデコード出来るって事は、最初のIフレームも理解出来ているのは確定に思えるが…。 何かの判断で手遅れの3フレームがカットされているとか?
Bフレームなしのビットストリームを突っ込んでテストしてみるとか
956 :
949 :2011/06/25(土) 23:59:20.43
ヒントthx。IPPPPのESを送ってみた所、削られるのは1フレームだけに変化。ただしリーク量は変化せず。 その後もアロケータや入力ピンをラップしてトレースしたり色々と調べた結果、以下のような流れらしいと結論。 ・デコーダはレンダラとのピン接続時にひとまずレンダラの提案するアロケータを使用する事を計画。 ただしそれは720x480固定で3フレーム分(SetPropertiesより)。 ・1440x1080のESを流し始めると、最初の数チャンク(Iフレームの一部)を送った時点でデコーダはレンダラに動的フォーマット変更を要求。 しかしこの時点で既にデコーダは内部に独自アロケータを確保して処理を始めているらしく、ReceiveConnectionに対して レンダラ側がDecommit/SetProperties/Commitでバッファを拡大してもその後レンダラ側のアロケータは一切使われない(・∀・) ・GOP分のESを流し終えてEndOfStreamを送ると、デコーダは出力を始めるが最初のI-P区間のフレームが全て削られている ・何か不明なバッファが20M確保されている。デコーダを停止・解放してもグラフを解放しても消えない 動的フォーマット変更を発生させない方向、つまりIフレームの入力前に必要バッファ量≡解像度をデコーダに正しく伝えられれば良いかと思ったけど、 ・レンダラ側のGetAllocatoraaRequirementsで最大解像度のバッファ容量を提案してみる →デコーダは華麗に無視(・∀・) (デコーダからアロケータへの最初のSetProperties要求が何も変わらず、依然としてReceiveConnection発生) ・デコーダとレンダラのConnectDirect時にメディアタイプをNULLでなく最大解像度で明示的に指定してみる →解像度の変更はおろか、たとえデコーダがEnumMediaPinで受入表明したメディアタイプと完全一致でも明示的に指定すると拒否される(・∀・) ダメだこりゃ。 レンダラへの出力がIフレーム以外も全てSetSyncPoint(TRUE)されてるのが少しひっかかるけど、もう限界。 最初に最大解像度のダミーIフレームを流して(当然出力されない)、その後にフィルタをStopせず利用し続ける位しか思いつかない。 後はPause/Playでも新たなリークが発生する仕様でない事を祈る位だけど、何か気づいた事があればアドバイス頼む。
957 :
949 :2011/06/26(日) 00:01:23.54
蛇足: ひょっとしてこのデコーダだと他のアプリでも同じ問題が発生するのでは? と思って某ソフトで1440x1080→1920x1080とチャンネルを切り替えたらやはり20Mリークが発生してた。 (VMR9で確認、受入形式はRGB32でなくYUV2のようだが無関係らしい) 確認は難しいけど720x480を超える(つまり通常の)ストリームを最初に流した時も発生していると思う。 デコーダも色々癖があるって事でFAなのか。それとも同社製デコーダでも後のバージョンだと改善されてるのか。 フィルタを一時停止する事すら少なく、高解像度への変更も数える程な視聴用にはともかく、編集用アプリには微妙過ぎる。 調査が完璧とは思わないし、プルモードでもこうと決まった訳じゃないけどさ。組み方次第で50GOP処理毎に1GBリーク(・∀・)
DirectShowの流し始めはほんとめんどくさいからな
>>954 真のストリームの先頭なのか、GOPでぶった切りした物か分からんけど、OpenGOP/CloseGOPに関わらず、
先頭数フレームはデコード出来ないと思った方が良い
あと、demuxerがAM_MEDIA_TYPEの為に先頭1M程読んでポインタがそのままで、数フレデコード出来ない
事も有る
各社のSDK毎にもっと詳しく書いてあげたいけど、こちらも仕事なので許されよ
CyberLinkのSDKって出てるの?
それは自分で調べられるでしょう…
フィルタ間を接続するときにメディアタイプを指定する方法はありますか? 必要に応じて中間フィルタも追加してもらいたいのですが、IFilterGraph::ConnectDirect だと中間フィルタを追加しないのです。 たとえば通常だとYUY2で接続できてしまうフィルタを、中間フィルタを挟んでRGB32とかで 接続したいのですが。。。
IGraphBuilder::Connect
964 :
962 :2011/07/05(火) 19:36:58.22
IGraphBuilder::Connectで中間フィルタを自動的に追加して接続できる のは理解しているつもりなんですが、この時にメディアタイプを指定したい のです。 あれ?何か根本的に間違ってますか?
ICaptureGraphBuilder2::RenderStreamでメジャータイプとサブタイプの指定をしてやればいいんじゃなかったっけ。 だいぶ昔のことなので忘れた。 名前はキャプチャーグラフビルダーだけど、キャプチャーしない用途でも気にしないでバンバン使っていいから
966 :
962 :2011/07/06(水) 21:35:02.29
レスありがとうございます。 ICaptureGraphBuilder2::RenderStreamで指定できるのはメジャータイプだけのようです。 うーん、やっぱり普通はこんなことしないんですかねぇ。。 それにしてもキャプチャ関連でなくてもICaptureGraphBuilder2は使えるんですね。 これは知りませんでした!
ごめん。嘘言った。 古いソース引っ張り出して確認してみたが IGraphBuilder::ConnectDirectつかってるな。 アップストリームフィルタの出力ピンとダウンストリームの入力ピンを指定のメディアタイプで接続してる。 試してみて。
中間フィルタを自動ではさんでほしいんだっけ。 じゃあだめだね。 すまん
自前のレンダラならCBaseInputPin::CheckMediaTypeのオーバライドを調整すればいいだけだと思うが、 流れから言って既存のレンダラを使う話なんだろ?EVRかVMR9か知らんけど インテリジェント接続で規定の優先順位に逆らいたいという事なら、入力ピンをラップするか 前にバイパスフィルタをかますかしてから入力ピンのIPin::QueryAcceptで不都合なメディアタイプを蹴るしか無いんじゃないか どうも目的を聞いてみたら他の方法でいいだろという結論になりそうな匂いがしてならないが・・・
970 :
962 :2011/07/07(木) 10:58:53.37
皆様アドバイスありがとうございます。 やはり直接的な方法は無さそうですね。まぁ普通は必要ないですもんね。。。 今回は969さんの言われたように適当なバイパスフィルタを通して対処すること で対応できました。ありがとうございました!
971 :
デフォルトの名無しさん :2011/07/20(水) 17:38:02.49
MFCのダイアログアプリで、ダイアログ上に設けたピクチャボックス中でAVIファイルを再生するサンプルは無いでしょうか? 急にDirectShowをいじることになって色々資料を漁ったりしているのですが、時間が限られており、 自分が理解しやすい形式になっているサンプルを探しています。
WindowsSDKの中にビルドして物色可能なDirectShowのプレーヤ・サンプルがいろいろありますよ。
>>971 相談です。USBキャプチャの挿抜を検出してグラフの停止、再起動を自動化すべく戦ってます。
(C# + DirectShowLib + MediaFundationLib)
キャプチャデバイスかどうかを調べるにはGUIDを較べるしかないのかなと思うのですが、手持ちのデバイスで実験したところ
DsDevice()のClassID、DEV_BROADCAST_DEVICEINTERFACE構造体のdbcc_classguid、デバイスマネージャで見えるデバイスクラスID
これら全部が異なっていることを確認して途方に暮れてます。。
ちなみに現在は、GraphEventのDeviceLostを使って抜かれた検出だけに対応しています。
できれば挿されたときにも履歴にあるデバイスの場合は自動でグラフ作成してやりたいのです。アドバイス下さい。
WM_DEVICECHANGEでキャプチャデバイスの列挙行うぐらいしか思いつかないのう。
>>972 普通にポーリングすれば良いんじゃない?
UVCならフィルタドライバ書くとか
USBデバイスIDは書かれて無いのしか見た事無いけど(安物しか買えないので…)ロジクールやMSのは書かれてるらしいので、デバイスを限定するとか
>>973 ,974 感謝。しかし棚上げにしました。。
とりあえず、少なくともグラフが未構築のときに(キャプチャに限定せず)なんらかUSBデバイスが挿されたら、
コンフィグするかポップアップして尋ねるようにしました。しばらく使ってみて余計なお世話感が出るようだったら
この機能、削除します。難しいっす。
976 :
デフォルトの名無しさん :2011/08/04(木) 10:02:49.10
977 :
デフォルトの名無しさん :2011/08/05(金) 17:57:41.41
DirectShowに対応しているビデオキャプチャカードでお勧めのものはありますか? 使用する環境はWindowsXP、PIC or USB、入力ソースとして少なくともD2以上をサポート。 あと、きちんとDirectShowをサポートしていて、へんなソースフィルタとかじゃないやつがいいです。 (DirectShowのフィルタの仕様がわからなくてテキトーにつくったっぽいヤツではなく) ViewCast製のオスプレイがよいとは思うのですが、IOデータあたりから安くていいのが出ていればそれに越したことは無いので。。
DirectShowプログラムスレなのにハード購入相談って夏休みだな プログラムに関しての質問は何?
979 :
977 :2011/08/05(金) 18:38:45.71
出力フォーマットがRGBやYUVをサポートしているものがいいです。 MPEG2のみ、とか、そもそも付属のキャプチャソフトでしか使用できないとかそういうものはなしでお願いします。
>>977 PCのハード板で聞いたほうが良いんじゃないか
981 :
デフォルトの名無しさん :
2011/08/08(月) 02:27:26.25 ぶっちゃけDirectShow自体が鬼っ子なんで後々面倒になるのが嫌ならOspreyでいいと思うけどな。