DirectShowと戦うスレ Part 2
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/11/08(水) 00:25:56http://pc8.2ch.net/test/read.cgi/tech/1026666092/
0191デフォルトの名無しさん
2007/02/11(日) 23:20:450192デフォルトの名無しさん
2007/02/12(月) 00:04:10はい。IYUV、I420の2つでお願いします。
どちらもU値とV値が四分の一に圧縮されていてMediaSubTypeは違っていても中身は同じフォーマットだと思います。
0193デフォルトの名無しさん
2007/02/12(月) 01:29:29IMediaSample::GetPointer(), IMediaSample::GetActualDataLength()というメンバ関数を通してバッファにアクセスできる。
ただし幅や高さなどの情報はAM_MEDIA_TYPEという構造体に収められていて、
これはIMediaSampleからは限定的な用途でしか取得できない。
その用途とはメディアタイプがダイナミックに変化したことをダウンストリームに伝えるという用途である。
そのため、IMediaSampleにはGetMediaTypeという気の利いた名前のメンバ関数があるが、
この関数を通してAM_MEDIA_TYPEが取得できるのはメディアタイプがダイナミックに変化した瞬間だけであり、
取得できるのは変化した後のメディアタイプである。
常に今流れているサンプルのAM_MEDIA_TYPEが取得することはできない。
0194デフォルトの名無しさん
2007/02/12(月) 01:47:42ネットで調べたところ、どうやらプレーンぽいなあ。
最初にYプレーン
次に縦横がそれぞれ1/2に縮小されたU
次に縦横がそれぞれ1/2に縮小されたV
となっているようです。
0195デフォルトの名無しさん
2007/02/12(月) 06:07:340196デフォルトの名無しさん
2007/02/14(水) 01:56:31なにやってるんだかよくわからんよ。
このままだとVAIO部門も潰されるんじゃないか?
潰されたとしてNECあたりが買い取ってくれるといいけどね。
0197デフォルトの名無しさん
2007/02/14(水) 22:02:18誤爆(^ω^)おつ
>>190なんですがMSDNと睨めっこしてたけどまだワカランス
>>193の内容は理解出来てるんだけどプレーンがわからんのだな。GetPointer()で映像の画素情報にアクセスできるんだけどプレーンってどうアクセスするの(`・ω・´)??
>>194
そう自分もググッたんでそれは大丈夫。IYUVは一画素にYに8bit、UVに2bitの計12bit使うほーまっと
0198デフォルトの名無しさん
2007/02/14(水) 22:58:43LPBYTE pY = GetPointer で得たポインタ。
LPBYTE pU = pY + width*height;
LPBYTE pV = pU + width*height/4;
Y値は pY から width*height バイト。
U値は pU から (width/2) * (height/2) バイト(縦横ともに半分の解像度ってこと)。
V値は pV から (width/2) * (height/2) バイト。
こんな感じ。UVは逆かもしれない。
パック形式のYUYVとかの場合は(4:2:2ってやつ)、UとVだけ水平解像度が半分で
UとVがYと交互に入ってる式。
>IYUVは一画素にYに8bit、UVに2bitの計12bit使うほーまっと
UVは4ピクセル辺り1バイトだから、8/4で2bitと言ってるだけ。
0199デフォルトの名無しさん
2007/02/14(水) 23:42:16ありがとう了解それがわからんかったです。
0201デフォルトの名無しさん
2007/02/15(木) 08:14:540202デフォルトの名無しさん
2007/02/17(土) 18:32:41これって何かいまいちだね。
データを得られればとりあえずはいいので
サンプルグラバっていうのを使ったほうが簡単だったみたい。
でも微妙な動作が違うような。
まあ、既にリリースもしたし、いまさら作り直して挙動が変わるのは困るので
このまま突き進むしかない。
DMOだとピン接続決定とか切断とかわからないみたいだね。
ピン接続できるかの問い合わせがあるけど、
これにOkで答えてもその後同じ条件でまたピン接続できるか問い合わせがある。
接続したとか接続してないとかないみたい。
データの出力が能動的じゃなくて受動的なのもなんか作りにくいな。
DirectShowって難しい。
0203デフォルトの名無しさん
2007/02/17(土) 18:35:23カテゴリにオーディオエンコーダってのを指定しているんだけど
接続できるか問い合わせされるときビデオ関係が含まれていやがんの。
別に問題ないけどさ。
0204デフォルトの名無しさん
2007/02/18(日) 00:39:210205デフォルトの名無しさん
2007/02/21(水) 00:47:18これでサイズ指定が出来ました。
使えないフォーマットがあるし
RGB555とかYUY2とかはどれ選んでいいのか(負荷の一番低いもの)わからないので
とりあえず設定ファイルに入れて変更可能にしといた。
プレビューがデフォルトで640x480になって高負荷になり
画像サイズ変更はプレビュー(レンダラ接続)前じゃないと変更できない
という不便さから解放されました。
0206デフォルトの名無しさん
2007/02/24(土) 12:06:13ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/DirectX9_c/directx/htm/selectingacapturedevice.asp
レベルが低くて大変恐縮なんですが、上記のページのようにすると
キャプチャのデバイスで、ネットワークカメラも選択できるようになるのでしょうか?
・USBカメラのプログラム作成すると、ネットワークカメラも
そのまま取り込み出来るのでしょうか?
・プログラミングも初級レベルなので、サンプルプログラム
などあると勉強しやすいのですが、本やサイトなどありますでしょうか。
USBカメラについてのサンプルプログラムは、いくつか見つかりました。
よろしくお願いします。
0207デフォルトの名無しさん
2007/02/24(土) 13:07:39ttp://homepage1.nifty.com/MADIA/vc/vc_bbs/200307_03070013.html
こちらにネットワークカメラについての制御の仕方について
少し書いてありました。
USBカメラのように一律なプログラムでなくて、
ネットワークカメラごとに、プログラムを変えないといけないのでしょうか。
なにを考えていけば、わからないのですが。
・ネットワークカメラごとのマニュアルを読んで、HTTPでネットワークカメラに
接続、画像を取り込む
・そのあとは、USBカメラと処理が同じ
こんな感じなのでしょうか?
具体的なコードはまだわからないのですが、方針として
ネットワークカメラの制御が、HTTPだけですむなら、
USBカメラのプログラムで、画像を渡す部分だけ、
改造すれば大丈夫でしょうか。
スレ違いでしたら、誘導していただけますと助かります。
よろしくお願いします。
0208デフォルトの名無しさん
2007/02/24(土) 23:27:29そういう場合、そのカメラを操作するにはそのメーカーが提供するライブラリを使うことになるだろうね。
映像を受ける側はカメラ用のフィルタグラフではなくネットワークからのストリームを受信するような感じになると思う。
0209デフォルトの名無しさん
2007/02/25(日) 01:49:42お返事ありがとうございます。
livecaptureっていうフリーのすごいソフトありますが、
どうやって複数のネットワークカメラに、対応しているのか疑問でしたが、
メーカーさんが公開しているマニュアルを見て、プログラミングしてるのかもしれないですね。
通信の仕方をメーカーさんが、公開してないとだめなんですね。ふむふむ。。
0210デフォルトの名無しさん
2007/02/25(日) 14:22:290211デフォルトの名無しさん
2007/02/26(月) 10:33:36>当然遠隔操作のコマンド
付いてくるけど画像ストリームの仕様は無いのよ
とりあえずメーカーに問い合わせてみる
0212デフォルトの名無しさん
2007/02/26(月) 18:16:380213デフォルトの名無しさん
2007/02/27(火) 01:19:35IAMCameraControlがありますが、これらでサポートされていないパラメータへ
アクセスする方法はありますか?
具体的には、USB Video Classのサポートで追加された、
KSPROPERTY_VIDEOPROCAMP_DIGITAL_MULTIPLIER
KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE_COMPONENT
辺りへアクセスしたいんですが。(対象デバイスがそれらのプロパティをサポート
してるのは確認しています)
axextend.idlやstrmif.hのenumにはidが定義されていないし、WHITEBALANCE_COMPONENTの
NODE_S2タイプのアクセス関数(パラメータが2個あるタイプ)もヘッダに見つかりません。
これはカスタムで書くしかないんでしょうか。
0214デフォルトの名無しさん
2007/02/27(火) 13:54:190215デフォルトの名無しさん
2007/03/01(木) 02:00:42DirectShowの勉強を始めました。
一通り調べた結果、以下の事を勉強する必要があると思いましたが、他にも「これ知っとけ」
みたいなことがあったら教えてください。
〜既にある知識〜
C、Win32API、grapheditの扱い
〜これから学ぶべきと思うこと〜
C++、COM、自作フィルタの作成と登録の方法
0216デフォルトの名無しさん
2007/03/01(木) 07:21:37概念理解が勉強の中心になると思う。ガンガレ〜
既に知ってるとは思うが、「BMP構造」を理解しておくとよいよ。
基本はBMP画像のぱらぱら漫画を加工する事になりますので。
0217215
2007/03/01(木) 14:07:11ありがとうございます。
BMPについてはWin32APIでいじり倒してきたのでいけると思います。
DirectShowについてはその仕様と情報の少なさに辟易していますが、
地道にがんばろうと思います。
0218デフォルトの名無しさん
2007/03/01(木) 17:23:44学ぶべきことがわかってるのはすばらしい!
ただし、下手に段階踏むと挫折しかねないので、
とりあえずサンプルコードからはじめるといいと思う。
「これで動くけど、なんでだろー?」って形で勉強するといいかも。
0219デフォルトの名無しさん
2007/03/01(木) 21:52:110220デフォルトの名無しさん
2007/03/01(木) 22:30:270221デフォルトの名無しさん
2007/03/01(木) 22:44:15この2つを最初にみたとき何が最低限実装が必要なメソッドかわからんかった。
そんな意味でのもっとシンプルなサンプル
0223デフォルトの名無しさん
2007/03/02(金) 00:06:52ひとまず、君の使ってる環境を教えてくれ。
自分はVC6+DX8SDK、VC2003+DX9(オウガスト)
の2つの環境でやっとる
0225デフォルトの名無しさん
2007/03/02(金) 00:25:29http://www.geocities.co.jp/SiliconValley/7406/tips/dshow/
http://hammer.prohosting.com/~arabo/DirectShow.shtml
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/DirectX9_c/directx/htm/directshow.asp
0226デフォルトの名無しさん
2007/03/02(金) 02:37:07わかったよ。確かにそれみりゃわかるね。
甘やかすのは無用。勉強させろと無言のプレッシャーを感じる…。
0227215
2007/03/02(金) 03:03:29二つ目のサイト以外は既に目を通したものばかりですが、それでも難しいと思いました。
キャプチャの出力解像度を変えることすらできませんでした・・・。
とりあえずC++から地道にべんきょーします。
0228デフォルトの名無しさん
2007/03/02(金) 04:17:440229デフォルトの名無しさん
2007/03/02(金) 08:49:03そしてここはsage進行なんですね。マイナーだからageてました
0230デフォルトの名無しさん
2007/03/02(金) 08:53:36C++経験者でないときついのか。
0231デフォルトの名無しさん
2007/03/02(金) 15:09:51入門や概説を一通り読んだら、リファレンスを全部読むのを薦めます。
0232213
2007/03/02(金) 21:13:20色々調べて試したみたところ、IKsPropertySetが使えそうなのは判りました。
ただ、これでVideoProcAmpのプロパティへアクセスしてみたところ、
旧来のKSPROPERTY_VIDEOPROCAMP_BRIGHTNESSのようなFilterベースの
プロパティアクセスをサポートしているものはうまく動作しますが、
KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE_COMPONENTのような
ノードベースのアクセスしかサポートされていないパラメータへはアクセス出来ないようです。
入力インスタンス構造体のFlagsにKSPROPERTY_TYPE_TOPOLOGYをつけて
Get()を使ってみてますが、正常終了するものの中身が0です。
旧来のパラメータもノードベースでアクセス出来るようなので試したみたところ、
入力インスタンス構造体をノードベース(KSP_NODE)ではなくフィルタベース(KSPROPERTY)で
見ているようです。
どうもIKsPropertySetはフィルタベースのアクセスしかサポートしていないのでは、と
推測してるのですがどうなんでしょうか。
IKsControlを使うべきなのかと思い試してますが、こっちはnot supportedのえらーコードが返ります。
0233デフォルトの名無しさん
2007/03/02(金) 21:25:17今でもわかんないこと多いけど。
サンプルと手助けがないとつらいね。
0234デフォルトの名無しさん
2007/03/02(金) 22:02:35勘で書いてるんだけど、IKsTopologyInfo:, CreateNodeInstanceでノードを作って、
ノードの方から IKsProperty を QueryInterface で取得して、IKsPropertySet::Setで
プロパティをセットするんじゃないだろうか。
0235デフォルトの名無しさん
2007/03/02(金) 23:55:00DirectShowは設計がマズイと思う。
フィルタグラフマネージャは自前でスレッドをもってユーザスレッドストリームスレッドとの切り離しをすべきだ。
いつの間にかメインスレッドから呼び出されていたりしてデッドロックとか多い。
0236デフォルトの名無しさん
2007/03/03(土) 11:14:01ほんとそのとおりだね。
IBasedPin::Reciver内で別スレッド立ててアロケータ確保すると
うまくやらないとアボーンする。。
0237215
2007/03/03(土) 23:03:00ありがとうございます。
そうしてみます。
C++の入門書を一通り読みましたが、新しいことがいっぱいで疲れました・・・。
次はMSDNのリファレンスを読みます。
早くキャプチャソフト作りたいです。
0238デフォルトの名無しさん
2007/03/04(日) 00:56:51切り離すモードと切り離さないモードがある。
0239213
2007/03/05(月) 22:24:32DDKやPlatformSDKの情報からみて、まさに指摘されてるようなことなんじゃないかと
思って試してみてますが、IKsTopologyInfo::CreateNodeInstance自体がエラーになるんですよね。
色々調べてみると、どうもWindowsXPでCreateNodeInstance自体が完全にサポート
されていない雰囲気がするのですよ。UVC extensionを調べててこんな情報がありました。
ttp://www.codecomments.com/archive421-2005-11-657282.html
自分のやり方が間違ってるかもとも思うんで、しばらく頭を冷やしてもう一度
試してみるつもりです。
0240デフォルトの名無しさん
2007/03/05(月) 22:27:24キャプチャ(640×480出力)→ビデオレンダラ
というふうに繋いでいます。
ビデオレンダラでフルスクリーンにすると、4:3のアスペクト比を守りながら拡大してくれるのは
うれしいのですが、16:9ソースの表示にも対応するために、フルスクリーンの状態で
16:9にしたいです。
しかし、どうしてもできません。
描画されるビデオウィンドウはウィンドウズアプリのメインウィンドウに貼り付けているカタチです。
ソースは640×480を保ったまま、16:9にリサイズしてフルスクリーンにしたいです。
ご助言、よろしくお願いします。
0241デフォルトの名無しさん
2007/03/05(月) 22:40:46ビデオレンダラーから(フィルタグラフからでもいいのか?)
IVMRAspectRatioControl、IVMRAspectRatioControl9 や IVMRWindowlessControl を取得して、
SetAspectRatioModeでアスペクトレシオを無視するようにする。
レンダラのサイズは自前で16:9にしておく。
0242デフォルトの名無しさん
2007/03/05(月) 22:57:06再接続することなく対応したいのですが、レンダラへ新しい縦横サイズは教えてやれたのですが、
バッファサイズを変更できませんでした。
マニュアルには現在より大きなバッファサイズが必要な場合は、ReceiveConnectionを使えとありますが、
フィルタのどこにどのようなコードを追加すればよいのか分かりません。
デタラメな文章ですが、アドバイスありますでしょうか。。
0243240
2007/03/06(火) 00:47:31ありがとうございます!
まずウィンドウレスモードですが、試そうとしたところ、ビデオをウィンドウに転送するところで
強制再起動が掛かかるなど恐ろしいことになってしまったので、ちょっと置いておきます。
ウィンドウモードで作りこんでしまったこともあり、できればこのままで解決したいと思っております。
他の試みとして、IVMRAspectRatioControlをVMR7から呼び出してSetAspectRatioModeで
アスペクト比固定をしないよう設定したのですが、相変わらずアス比固定でフルスクリーン
になりました・・・。
GetAspectRatioModeで確認しましたが、ちゃんとVMR_ARMODE_NONEになっていました。
そこで、grapheditで調べましたところ、
ttp://vista.jeez.jp/img/vi7310912755.jpg
二つあるフルスクリーンボタンのうち、「Set Full Screen」のほうはアス比固定拡大、「Full Screen Window」
のほうは全体に引き伸ばして表示される、という結果になりました。
先に試したプログラムのほうでは、前者のほうになっているのではないかと考えられます。
後者の「Full Screen Window」ボタンを押すことと等価な処理としては何が考えられるでしょうか?
0244240
2007/03/06(火) 01:37:56ここのウィンドウレスモードの説明を見ていると、こちらのほうが良さそうですし、なんとか
ウィンドウレスモードで動くようにしてみます。
0245デフォルトの名無しさん
2007/03/06(火) 15:01:49古来より DirectShow でフルスクリーン再生をする際には、
レンダラをフルスクリーンモードにするのではなく
単に全画面のウィンドウで再生する方が好しということになっています。
後者はそれでしょう。
0247デフォルトの名無しさん
2007/03/07(水) 21:22:13IEnumMoniker::Next()を繰り返すことでキャプチャデバイスを切り替えるというプログラムを組んでいます。
デバイスが検出されなくなったら、IEnumMoniker::Reset()をして先頭から数えなおすように
しています。
一回の切り替えを細かく説明すると、
ストリームの停止→キャプチャフィルタの削除→上記メソッドで検出した新たなデバイスをグラフに追加
→ICaptureGraphBuilder2::RenderStream()でグラフをVMR9に直に接続→再生
という流れです。
これに問題がありまして、この切り替えを8回繰り返す(4順する)と必ず画面が最後のフレームを
表示したまま固まってしまいます。
考えられる原因や対処法がありましたら、ご教授お願いします。
0248デフォルトの名無しさん
2007/03/08(木) 02:22:270249213
2007/03/08(木) 03:23:24問題が度解決できました。この辺を触る人はあまりいなさそうですがご報告だけでも。
結論からいうと、IKsTopologyInfoを使ってKSNODETYPE_VIDEO_PROCESSINGノードを
検索し、そのノードからIVideoProcAmpインタフェイスをCreateNodeInnstanceで生成することで、
拡張されたプロパティへアクセス出来ました。(IAMVideoProcAmpやIKsPropertySetではなく)
IVideoProcAmpはノードベースのインタフェイスとしてvidcap.hで定義されてますが、
Vista用のWindowsSDKで配布されているバージョンでないと定義自体存在しません。
USB Video ClassがXPSP2以降のサポートだったのでPlatform SDK(2003R2)を使っていたのですが、
これがまず失敗でした。
また、NTDDI_VERSIONとsdkddkver.hを使い、XPSP2以降であることを明示する必要がありました。
あと細かい話ですが、MSDNやWindowsSDKのドキュメントには、IVideoProcAmpノードの
生成時にIIDとしてIID_IVideoProcAmpを指定しろ、と書かれてますが、こいつのオブジェクトが
どこにも存在せずリンクエラーになります。_uuidof(IVideoProcAmp)で指定しないと駄目な模様です。
0250247
2007/03/08(木) 17:52:00原因は二つ目のキャプチャデバイスをRenderStream()するときのみ、間に色空間変換フィルタが
挿入され、キャプチャフィルタを削除したときに色空間変換フィルタ、VMR9間のピンが持つ
アロケータにバッファがどんどん蓄積されていくためだったようです。
デバイスを切り替える度、VMR9との接続を切るようにすると、うまく動作するようになりました。
0251デフォルトの名無しさん
2007/03/09(金) 00:51:33ビルドがどうしてもできません。
お持ちの方がおられましたらお譲りください。
お願いします。
アップローダ
ttp://www.rupan.net/uploader/
環境
WindowsXP SP2
Platform SDK for Windows Server 2003 SP1
Visual Studio 2005 Express Edition
0252デフォルトの名無しさん
2007/03/09(金) 02:40:170253251
2007/03/09(金) 03:08:44いえ、最近になって.slnや.dswのファイルが付属しなくなりまして、makefileがついているんです。
それで
ttp://www.shader.jp/xoops/html/modules/xfsection/article.php?articleid=17
このページと同じように進めてもcl.exeが見つからないようなことを示すエラーが出て、
それじゃあとcl.exeのあるフォルダを環境変数のPathに設定してやると今度はmspdb80.dllが
見つからないと言われて失敗します。
0254デフォルトの名無しさん
2007/03/09(金) 04:01:110255デフォルトの名無しさん
2007/03/09(金) 04:16:23お前の最近は2年前か?
0256251
2007/03/09(金) 04:29:10え!?そうなんですか!?
ttp://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en
ここのPSDK-x86.exeをダウンロードしてインストールしたのですが、違うのでしょうか?
>>255さんの入手経路を教えてください。
0257デフォルトの名無しさん
2007/03/09(金) 05:18:470258251
2007/03/09(金) 07:07:13ttp://ugd555.blog1.fc2.com/page-13.html
同じ症状を解決した方のページを見つけました。
最終的に別のフォルダから5つファイルを持ってこなければいけませんでした。
この問題に18時間費やしました・・・
0259251
2007/03/09(金) 09:44:34ライブラリファイルが無い、と言われどうしようもありません。
そういえば、VC2005EEでDirectShowフィルタを開発したという話を聞いたことがありません。
ちゃんとしたVCを買え、ということでFAでしょうか?
もしそうなら、観念して買いに行きます・・・
0260デフォルトの名無しさん
2007/03/09(金) 09:45:260261デフォルトの名無しさん
2007/03/09(金) 16:37:130262デフォルトの名無しさん
2007/03/09(金) 16:42:53初心者スレにでも行け
DirectShowスレで語るべき内容ではないだろ
0263デフォルトの名無しさん
2007/03/10(土) 01:13:370264デフォルトの名無しさん
2007/03/10(土) 02:25:220265デフォルトの名無しさん
2007/03/10(土) 05:35:57という構成の中の変換フィルタで、キャプチャフィルタからサンプルが1枚くる度に
サンプルに対し処理Aを実行→出力→表示
サンプルに対し処理Bを実行→出力→表示
というように2回の処理、出力を行いたい(フレームレートを倍化したい)のですが、
どうすればよいでしょうか?
なお、キャプチャ出力のフレームレートは上限に設定しています。
タイムスタンプをいじるだけではうまくいきませんでした。
IMemInputPin::Receiveを使うにしても、それを呼び出す頻度をどのようにすれば
合わせられるかが分からずできません。
0266デフォルトの名無しさん
2007/03/10(土) 07:16:470267デフォルトの名無しさん
2007/03/10(土) 11:46:39仮にキャプチャフィルタが30f/secで投げてくるなら0.033...秒間隔のスタンプが設定されているだろうから
自分でつくる変換フィルタは2枚目に0.033.../2秒のタイムスタンプを足して設定してやる。
んで自分が出力ピンからDeliverするときに、自分で送りたい2枚分、下段の入力ピンReceiveを呼ぶ。
2回送信完了してから、上段にDeliverの結果を返す。
0268デフォルトの名無しさん
2007/03/10(土) 17:49:27の658です。
たぶんこっちで質問したほうがいい気がしたので。
何度やっても同じところ(CopyMemory)で落ちます。
原因として思い当たる件があったらご教示願います。
0269デフォルトの名無しさん
2007/03/10(土) 18:11:4124bit以上のソースなら、BITMAPINFOHEADERだな。
0271268
2007/03/10(土) 19:24:59どこが悪いんでしょう?
0272デフォルトの名無しさん
2007/03/10(土) 19:32:55これか、
CopyMemory( &BitmapInfo.bmiHeader, &(pVideoHeader->bmiHeader),
sizeof(BITMAPINFOHEADER));
探すの面倒だから直リンして欲しいな。
http://pc11.2ch.net/test/read.cgi/tech/1168354839/658
コピー先と、コピーするサイズとか確認してみれば。
&BitmapInfo.bmiHeader が有効なメモリを指してる?
&(pVideoHeader->bmiHeader) が有効なメモリを指してる?
sizeof(BITMAPINFOHEADER) これはあっていると思うけどさ。
0273268
2007/03/10(土) 19:37:59&(pVideoHeader->bmiHeader):30
むう?
0274268
2007/03/10(土) 19:41:33&BitmapInfo.bmiHeader:12F044
&(pVideoHeader->bmiHeader):30
&BitmapInfo.bmiHeaderが怪しいですね。
0275268
2007/03/10(土) 19:42:420276デフォルトの名無しさん
2007/03/10(土) 19:49:110277デフォルトの名無しさん
2007/03/10(土) 19:50:180278デフォルトの名無しさん
2007/03/10(土) 19:51:15もう8回くらいリビルドしてますorz
手動でbmiHeaderを初期化したりしてもダメでした。
0279デフォルトの名無しさん
2007/03/10(土) 20:06:490280268
2007/03/10(土) 20:09:100281265
2007/03/10(土) 23:31:42その方法を試すために、まず出力ピンのメディアタイプを取得しようとしたのですが、
原因不明のエラーが出ます。
何がまずいのでしょうか?
HRESULT (作成した変換フィルタクラス名)::Transform( IMediaSample *pIn , IMediaSample *pOut ){
・・・
//出力ピンのメディアタイプを探す
IEnumPins *pEnumPins;
IPin *pPin;
PIN_DIRECTION PinDirThis;
AM_MEDIA_TYPE *pmt;
this->EnumPins( &pEnumPins );
pEnumPins->Reset();
while( pEnumPins->Next( 1 , &pPin , NULL ) == S_OK ){
pPin->QueryDirection( &PinDirThis );
if ( PinDirThis == PINDIR_OUTPUT ){
pPin->ConnectionMediaType( pmt ); ←定義されてないのに使ってるというようなエラー
}
}
DeleteMediaType( pmt ); ←上と同じエラー
・・・
}
0282265
2007/03/10(土) 23:36:19タイムスタンプ修正は行えるのですが、下段の入力ピンのIMemInputPin::Receiveを
どのようにすれば呼び出せるのかが分かりません。
>>281で示したようなコードでIPinクラスは取得できるのですが、
ttp://msdn.microsoft.com/library/ja/jpdx8_c/ds/ref/class/CBaseInputPin.asp?frame=true#CBaseInputPin
ここを見ると、IMemInputPinはIPinの子クラスなので、それに実装されているReceiveメンバに
アクセスできません。
ご教授願います。
0283デフォルトの名無しさん
2007/03/11(日) 00:38:34CTransformFilter、CTransformInputPin、CTransformOutputPinね
入力サンプルがどう入ってきてどこで変換してどうやって出て行くのか
更にしたのベースクラスの知識も必要になるだろうけどさ
既に下段に接続してる相手のメディアタイプが欲しいなら
出力ピンのCurrentMediaTypeでいいだろ
0284デフォルトの名無しさん
2007/03/11(日) 01:14:56m_pOutput->Deliver するだけでOK
0285265
2007/03/11(日) 03:49:55ありがとうございます。
m_pOutput->CurrentMediaTypeでメディアタイプを取得し、pbFormat(VIDEOINFOHEADER)内の
AvgTimePerFrameを変更してやることでフレームレートの変更を試みてみました。
しかし、今まで通りの10000000/29.97[100ns]であれば下流のフィルタ(色空間変換フィルタ)に
繋がるのですが、倍の10000000/59.94[100ns]では接続できませんでした。
残念ながら対応していないようです。
0286265
2007/03/11(日) 03:50:22ありがとうございます。
一枚のサンプルに対し二度出力できるようになりました。
しかし、fpsがきれいに倍化する期間と倍にならない期間が移り変わってうなりのようになっています。
二度の出力中、一枚目のスタートと二枚目のエンドのタイムスタンプはいじっていないので、
そこでの同期は保障されていると思ったのですが・・・
どのようにすれば改善できるでしょうか?
一枚のサンプルに対して行う処理を以下に示しておきます。
//一枚目の処理
・・・
// 入力サンプルのタイムスタンプを取得する
pIn->GetTime( &TimeStart , &TimeEnd );
//エンドタイムを1/59.94[s]早める
TimeEnd -= 166833; //[100ns]
pOut->SetTime( &TimeStart , &TimeEnd );
//下流フィルタにDeliverする
m_pOutput->Deliver( pOut );
//二枚目の処理
・・・
// 入力サンプルのタイムスタンプを取得する
pIn->GetTime( &TimeStart , &TimeEnd );
//スタートタイムを1/59.94[s]遅くする
TimeStart += 166833;//[100ns]
pOut->SetTime( &TimeStart , &TimeEnd );
//下流フィルタにDeliverする
m_pOutput->Deliver( pOut );
0287デフォルトの名無しさん
2007/03/11(日) 05:56:40部分的コードなのでわからないが、サンプル使いまわしたりはしていないよね?
0288265
2007/03/11(日) 09:37:13試しに
AvgTimePerFrame /= 2;
としてみましたが、やはり受け付けませんでした。
AvgTimePerFrame /= 1;
だったら大丈夫です。
>サンプル使いまわしたりはしていないよね?
他の方が作られたサンプルを使いまわししてます。
ですが、Transformメソッドをいじるだけくらいのシンプルな変換フィルタでして、その処理部分に関しては
すべて書き換えています。
0289デフォルトの名無しさん
2007/03/11(日) 11:18:23> Transformメソッドをいじるだけくらい
CTransformFilter::Receive内でもDeliverしてるからな。その辺り大丈夫だよね?
文面から察するに
OutputPin::CurrentMediaTypeでメディアタイプ取得できるってことはピンが繋がっている状態なのだが
一旦Pin接続解除した後にフレームレート倍のメディアタイプを色変換に提示(OutputPin::GetMediaTypeで設定)して
再接続を試みてるんだよね?
0290265
2007/03/11(日) 11:56:35>EndTimeが0で来る場合もあるのでチェックして下さい。
チェックしてみましたが、EndTimeが0で来る様子は見られませんでした。
>CTransformFilter::Receive内でもDeliverしてるからな。その辺り大丈夫だよね?
どうなんでしょう・・・影響があるかは判断しかねます・・・
メディアタイプ変更の件ですが、グラフエディタ上で接続が断たれた状態からピンを繋ごうとしたとき、
キャプチャフィルタのメディアタイプから変更しなかった場合は成功し、変更すると失敗する、というかんじです。
フレームレートの不安定ですが、もしかしたら処理負荷が大きいためかもしれません。
表示ウィンドウのサイズを大きくする(ネイティブサイズは同じ)とフレームレートが落ちていきます。
CPUの使用率は60〜70%ですが、VMR9側の問題でこのようなことになっているのかもしれません。
この負荷の原因として、変換フィルタとVMR9との間に挟まっている色空間変換フィルタが挙げられます。
キャプチャフィルタから直接VMR9に繋ぐときは介在せず、CPU負荷も小さいです。
ところが、同じメディアタイプを設定しているにも関わらず、変換フィルタを挟むと、その後に色空間変換フィルタ入ってきます。
キャプチャから直接VMR9の場合はシステムメモリは介さず、直接ビデオRAMに移す、というようなことでもしているから
こんなことになるのでしょうか?
もし変換フィルタから直接VMR9に繋げられるような方法がありましたら教えてください。
■ このスレッドは過去ログ倉庫に格納されています