トップページ⇒tech
990コメント427KB

DirectShowと戦うスレ Part 2

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/08(水) 00:25:56
前スレ
http://pc8.2ch.net/test/read.cgi/tech/1026666092/
0497デフォルトの名無しさん2007/05/25(金) 08:12:46
ボトルアップってどういう意味?
座標原点の話しかな。DIBは他画像形式に比べると上下逆さまだけど、変換時にY座標をマイナス値を指定すればどうとでもなる
0498デフォルトの名無しさん2007/05/25(金) 08:34:21
ボトムアップなら単語そのままの意味だが
ボトルアップは飲み終わったボトルを投げ上げるという意味だな
0499デフォルトの名無しさん2007/05/25(金) 18:04:09
なるほど〜私はてっきりボトルを飲み干す事かとおもたよぉ〜

で、、意地悪しないでDIBのボトムアップを教えてくれ
0500デフォルトの名無しさん2007/05/25(金) 23:13:53
>>497でほざいていることがまさにボトムアップ

つーかキーワードがこれだけでてんのに自力で検索くらいしようとは思わんのかね
0501デフォルトの名無しさん2007/05/25(金) 23:26:22
ただ単にBITMAPの話じゃん 画像いじるなら基礎の基礎
0502デフォルトの名無しさん2007/05/26(土) 12:58:18
自作ソースフィルタってどうやってフィルタグラフに追加するんですか?
IGraphBuilder::AddSourceFilterを使ってもデフォルトのソースフィルタが呼ばれるし、
普通のフィルタ同様に、
CoCreateInstance&AddFilterすると、ソースフィルタに読み込むファイル名が指定できません。
0503デフォルトの名無しさん2007/05/26(土) 20:01:49
>>500
>>496の聞きたいことの意味がわからんかっただけで
俺は知ってるからおk。

今日はPCだからしらべてみたけど、ボトムアップという表現
はあんまり使われてないぞ??
■Google調べ 「DIB ボトムアップ」検索結果
っミ【114件】
0504デフォルトの名無しさん2007/05/26(土) 20:27:02
DirectShow スレということで、本家のDirectShowカテゴリ内のページ。

トップダウンとボトムアップの、メモリ上のピクセルの並びの違いについてごくごく簡単に説明している

Top-Down vs. Bottom-Up DIBs
ttp://msdn2.microsoft.com/en-us/library/ms787796.aspx

サンプル画像のセンスの無さには相変わらず笑わせてくれる。
0505デフォルトの名無しさん2007/05/26(土) 21:27:48
ありがとう。本家MSDNが使ってる言葉なのか
今後使っていくよ。
まぁBITMAPの仕様の話であって
あんまりDirectShowとは関係ないとこで使うことになりそうだけど
0506デフォルトの名無しさん2007/05/26(土) 21:32:32
>>502
ごめんボトムアップに気を取られていた
自作フィルタを登録する方法はコマンドラインから
「regsvr32 ぱす&自作フィルタ.ax」でレジストリ登録が必要です。

その後「Graphedt」でフィルタグラフに登録できることを確認するんだよ
それでもできなかったらまた質問しましょう
05075022007/05/27(日) 02:21:11
>>506
すいません、説明不足でしたが、レジストリ登録、GraphEditでの確認は出来ています。
ただアプリケーションから自作ソースフィルタを使ってファイルを読み込む方法がわかりません。
GraphEditで追加したときは、読み込むファイルを聞いてくるのですが、アプリからソースフィルタを追加しても、ファイルを聞いてこないのです。
0508デフォルトの名無しさん2007/05/27(日) 04:22:30
なるほど。
窓枠の提供はどこがやるの?って事だと認識しました。
自作ソースフィルタを「GraphEdit」で開いた場合、
ファイル選択ウィンドウはディスクトップ画面のド真ん中に出ますか?

もし真ん中に出ない場合、「hWnd」をデスクトップから取っていないことになります。
アプリケーションから渡してやる(=ファイル選択ウィンドウを作って選択結果をフィルタに渡すような設計)
にしてやる必要があるかと思います。

自作ソースフィルタのファイル選択ダイアログを出す部分のソースを晒せば解決できると思いますよ
0509デフォルトの名無しさん2007/05/27(日) 04:26:48
ソースフィルタはIFileSourceFilterインターフェースを持ってるでしょ。
AddFilterした後でそれを呼び出して(QueryInterface)、Loadメソッドを
実行してやるんだよ。
でも、そんな基本的な所でつまずいてるのにソースフィルタ自作とかよく出来たな。
0510デフォルトの名無しさん2007/05/27(日) 12:31:49
手っ取り早くソース晒せといいたい
05115022007/05/28(月) 12:17:00
>>508,509,510
回答ありがとうございます。

>>509
まさにそれでした!ありがとうございました。
無知ですいません。
0512デフォルトの名無しさん2007/05/28(月) 18:24:46
簡易動画編集のようなことをやるために、複数の動画ファイルを連結して1つのファイルにエンコードしようとしています。
いまのところ、ファイルごとに構築した再生用のフィルタグラフから静止画を取り込みまくって
録画用のフィルタグラフに流し込むやり方を考えているのですが、
こういうバカっぽいやりかたでなく、もっとエレガントな方法はないもんでしょうか。
0513デフォルトの名無しさん2007/05/28(月) 23:44:50
この辺を使ってビデオ再生やってます。
IGraphBuilder
IMediaControl
IMediaEventEx
IVideoWindow
IBasicVideo
ビデオ再生自体は問題ないのですが、サウンドデバイスが複数
あった場合に、音声の出力先を指定するにはどうしたら良いで
しょうか?

現状、Windowsの標準のサウンドデバイスのみ音が出ます。
よろしくお願い致します。
0514デフォルトの名無しさん2007/05/29(火) 00:38:22
DirectShowを使わない
0515デフォルトの名無しさん2007/05/29(火) 03:07:01
ええええええ
まじっすかあああ?
DirectShowって使えねーなぁ!!
ゴミじゃん。M$てめえやる気あんのか?殺すぞ
0516デフォルトの名無しさん2007/05/29(火) 06:00:31
>>515
真偽の程が全く不明な一文にそこまで熱くなれるのもすげえな
05174732007/05/29(火) 14:57:28
かなり亀レスですみません、あまり作る暇なくて
少しずつやっていたんですが、出来ました。
教えていただいた
ttp://www.shader.jp/xoops/html/modules/xfsection/article.php?articleid=17
↑ここと、あとはここのサンプルソース↓
ttp://www.greenwood.co.jp/~k-aki/article/directshow_movie/directshow_movie.html
を見ながらやって作れました。
(下のURLのサンプルソースは、多分GraphEditで使えるようなDLLとして作るものではなく、
ほぼCBaseRendererを継承してメソッド書いてるだけだったのでわかりやすかったです)
色々ありがとうございました。次は音を取得するのに挑戦しまつ ヽ( `・ω・)ノ
0518デフォルトの名無しさん2007/06/01(金) 16:33:46
test
0519デフォルトの名無しさん2007/06/01(金) 17:49:21
DirectShow編集サービスでWMV9のAVIファイル作ろうとしてるんだけど、
エンコードパラメータの設定がうまくできません。
IAMVfwCompressDialogsで出したダイアログだと、変更が反映されないし。
かといってWMV9フィルタの出力ピンからIAMStreamConfigをqueryしてGetFormatするとエラーになります。
AviUtilだとうまくやっているみたいなんですが、やり方が間違ってるんでしょうか・・・
0520デフォルトの名無しさん2007/06/10(日) 04:56:19
           __
         /:::::::::::::`ヽ_    _
  n      /::::::::::::::::::::::::::l   l L_
,─' ヽ_    _|::::::::::::::::::::::::/)  /   _彡__
三_  ヽ、 l/::::::::::::::::::::::::ヽ / ∠, - 、:::::::\
    `丶、 `/::::ノT` ^ 'l´l:::::|´ /(・|・)) |::::::::::::ヽ
      `ヽW ̄     ̄W /ヽ、_●_/ \::::::::l
        `1  l ヽ  /'´`\_|__三、ヽ::::|
         l  /    / |  __       | l:::l
         l      |__\(  ヽ-'"´)  //:/
         /  ,    |::::::::::ヽニ二二ニ_∠_'/__
         |  l    /つ 、/(〒) ヽ::::::::::::::::::

0521デフォルトの名無しさん2007/06/10(日) 23:23:28
すいませんが教えてください。
この↓を参考にしてMFCで動画再生アプリを作っているのですが、
ttp://www.geekpage.jp/programming/directshow/setnotifywindow.php
DirectShowで動画再生しているウインドウが、別のウインドウの陰に隠れてから
手前に表示されたときなどに再描画されません。
再描画するにはどうすればいいですか?
0522デフォルトの名無しさん2007/06/10(日) 23:34:50
ビデオウインドの親ウインドでWM_ERASEBKGNDをDefaultWindowProcに渡さない。
0523デフォルトの名無しさん2007/06/10(日) 23:50:53
>>522
できました。ありがとうございます
0524デフォルトの名無しさん2007/06/11(月) 22:13:25
まさかだが、>>520 は DirectShow にかけたネタなのか?
0525デフォルトの名無しさん2007/06/11(月) 22:36:29
どらえもんだとおもいます
0526デフォルトの名無しさん2007/06/11(月) 22:43:54
直見せというか、モロダシ?
0527デフォルトの名無しさん2007/06/12(火) 07:31:58
ドラえもんShoWです。
スマンむしゃくしゃしてやった。
今は反省してる
0528デフォルトの名無しさん2007/06/12(火) 10:11:14
静ちゃん・・・
0529デフォルトの名無しさん2007/06/12(火) 21:39:31
静ちゃんは原作名だよね。
原作も途中からアニメに合わせて「しずかちゃん」になってる。

最近にふにふ動画やようつべを見てるんだけどフレームレート変更フィルタ作れば「速聞」みたいなサービス作れるかな
0530デフォルトの名無しさん2007/06/12(火) 21:49:48
最近ようつべてw
いつの人間だよ
0531デフォルトの名無しさん2007/06/14(木) 01:02:27
新しいほうがいいにきまってる
:::::::::::::::::::::::::::::    ,.-ヽ
::::::::::::::::::::::   ____,;' ,;- i                         へ、     /;へ\
::::::::::::::::::   ,;;'"  i i ・i;                       // _l::|___l::|_ヽ:ヽ
:::::::::::::::  ,;'":;;,,,,,, ;!, `'''i;          / ̄ ̄ ̄ ̄\,,     |l/−、 −、:::::::::::::::`::|
:::::::::::  ,/'"   '''',,,,''''--i        /       __ヽ    /::::::|  ・|・  | 、::::::::::::::\
:::::::::  ;/  .,,,,,,,,,,,,,,,,,   ;i'⌒i;       |       |   |、   /::/ `-●−′ \:::::::::::ヽ
:::::::  i;"     ___,,,,,,,  `i".       |       ∩─| |  ,|/ ── |  ──   ヽ:::::::::|
::::::: i;    ,,;'""" `';,,,  "`i;      |      ∪  `l   |. ── |  ──   .|::::::::|
::::::: |  ''''''i ,,,,,,,,,,  `'--''''"       ヽ __/  _.ノ    | ── |  ──     |:::::_l__
::::::: |.    i'"   ";               |――― 、".      ヽ (__|____  /::::| 新 |
::::::: |;    `-、.,;''"             /  ̄ ̄ ̄ ̄^ヽ∞=、  \           /:::,/| 品 |
::::::::  i;     `'-----j          | |      |  |っ:::::)  l━━(t)━━━━┥ |___|
0532デフォルトの名無しさん2007/06/16(土) 00:31:23
Platform SDK インストールしたけど、GraphEdit入ってなかった
0533デフォルトの名無しさん2007/06/16(土) 06:58:35
>>532
C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Bin\graphedt.exe
0534デフォルトの名無しさん2007/06/16(土) 14:14:45
カメラって暗くなると露光を変化させるためにフレームレートがころころかわるやん?
フレームレートを一定にするフィルタを作った人いる?
0535デフォルトの名無しさん2007/06/16(土) 15:54:38
>>533
あ、あった。さんきゅー
スタートメニューにショートカット作ってよねー
0536デフォルトの名無しさん2007/06/16(土) 16:27:00
フレームレートがころころ変わる??
0537デフォルトの名無しさん2007/06/17(日) 00:43:24
>>536
うん。そのカメラの最低露光付近で以下を調べる
「カメラ」-「レンダラ」
の接続で「レンダラ」のプロパティ「品質」タブ
平均フレーム率が明るさで変化するのがわかるよ
0538デフォルトの名無しさん2007/06/17(日) 00:51:45
操作説明する前に何の設定をしている場面なのかを言ってくれ
我々はエスパーじゃないんでね
0539デフォルトの名無しさん2007/06/17(日) 02:49:07
確かにそういうカメラもあったような気がする。
っていうか安物のカメラは結構フレームレートいい加減だったりする

0540デフォルトの名無しさん2007/06/17(日) 02:58:43
>>537
「そのカメラ」ってどのカメラよ?
0541デフォルトの名無しさん2007/06/17(日) 03:47:55
つかカメラやらタブやら、話が唐突すぎるし悪文だしで理解不能
0542デフォルトの名無しさん2007/06/17(日) 08:57:09
プロパティ「品質」タブってグラフエディットでの話か?
だとしたらあれはソースそのもののフレームレートではないよ?
俺ならよくわからん糞カメラだけのためのフィルタなど作る気にはなれないな
0543デフォルトの名無しさん2007/06/17(日) 16:58:49
まあ作ってやってもいいが、ここから先はビジネスになるよ
0544デフォルトの名無しさん2007/06/17(日) 17:22:39
たぶんグラフエディットのことだろうね。

ところでソースそのもののフレームレートじゃないっていうのはどういうこと?
レンダラが捨てるって事?
0545デフォルトの名無しさん2007/06/17(日) 18:00:33
>>543
まじで?たのむ っ�I

>>544
ソースフィルタが一定間隔に絵を出してこなくなるということだよ
レンダラが捨てるわけではないみたい
0546デフォルトの名無しさん2007/06/17(日) 18:32:00
>>545

>ソースフィルタが一定間隔に絵を出してこなくなるということだよ
>レンダラが捨てるわけではないみたい
つまりソースフィルタが実際に出力しているフレームレートだよね。
それが明るさで変動するね、って話だったと思うんだけど。
0547デフォルトの名無しさん2007/06/17(日) 19:12:30
>>546
うん。その話です。

私は「フレームレートを一定にするフィルタを作った人はいますか?」
という質問をした者なんですが、
暗いときに光を映す場合、フィルムに光を取り込む時間を長めに
取ってやる必要があります。ちゃんとした画像を取り込むのと
シャッタースピードはトレードオフ関係になるのかと思います。

一般的なカメラは上記を自動で行っているので周囲の明るさが変化すると
フレームレートがころころ変わっていく・・・と思っています。
これを時系列処理が必要なフィルタに通した場合問題がおきるので、
フレームレートを一定にするフィルタが必要なのでは?と考えています

どなたか作成した人はいらっしゃいませんか?
0548デフォルトの名無しさん2007/06/17(日) 19:21:29
>>544
メディアタイプとしてののフレームレートってことだとおもう。
レンダラのレートはレンダラが表示できてるレートってことじゃね?
デコーダがうんこだったりPCすぺっくがうんこだと激低かと
0549デフォルトの名無しさん2007/06/17(日) 19:26:05
カメラって何だ?デジカメ?かむコーダ?
記録するフォーマットは何よ?グラフ構成は?DirectShow経験有り?
出すべき情報が出てない感じ。
0550デフォルトの名無しさん2007/06/17(日) 19:36:52
>>549
カメラ・・・USBカメラ(Qcam)を想定していただければいいです
記録フォーマット・・・なし。記録してもしなくてもよし。
グラフ構成・・・ソースフィルタのみ。
        ただ、見るために「ソース」-「レンダラ」でお願いします
Directshow経験・・・およそ3ヶ月。画像関係の変換フィルタ作成ならわかるくらい

>>548
PCスペックが悪くてフレーム落ちすることはこの際無いという前提でお願いします

>>538->>548
「ソースフィルタのフレームレートが外光によって変化すること」
に話の争点がいっていますが、できれば
「フレームレートを一定にする変換フィルタ」についての事を話したいです。

0551デフォルトの名無しさん2007/06/17(日) 19:48:10
そのカメラが本当に正しい絵を取るために露光時間を調節しているのかどうかは不明だが
本来なら正しいレートでがんばって出すべきだと思う(この辺はMSがどう設計しているのかによるが。)
で、そのメーカのソースフィルタがそう実装されてないから後ろでなんとかしましょう、ってことですね?
(Qcamって路地クールのやつでしょ。あれはなんかキャプチャした絵を解析しているっぽいから感光待ちじゃないような希ガス)


どっちかっていうとそのカメラのソースフィルタの性能の問題、あるいはバグに近いので
そもそも、それを正しくするフィルタの需要って無い気がする
自分もそういうフィルタはしらない。

でも一般化して「レートを一定にする中間フィルタ」という意味では需要もあるかもしれないね。

0552デフォルトの名無しさん2007/06/17(日) 19:51:12
タイムスタンプチェックしてバッファしておいた前回映像を投げてやれば良いような気もするが
グラフ構成ソースフィルタのみ??ダウンストリームが無いのに変換フィルタ??
うーん 何がしたいのかますますわかんねーな…

[ソース]-[レンダラ]はダイレクトで繋がるの?メディアタイプはRGB?
本来期待されるべきフレームレートはいくつですか?
ソースが吐き出すタイムスタンプ確認してみた?てんでバラバラの間隔だったのかな
0553デフォルトの名無しさん2007/06/17(日) 20:24:27
>>552
ご回答ありがとうございます。
「タイムスタンプにて・・・の件」
DirectShowのフィルタ同士の動きはイベントドリブンです。
なので、スレッドを立てて別レートで処理するシステムを考えました
>「ソースフィルタ」-ここ6fps-「レート安定フィルタ」-ここ15fps-〜
私のコーディング技術の問題でレート安定フィルタ以降のアロケータを6fps以上で
使うとロックしてしまいうまくいきません。

>[ソース]-[レンダラ]はダイレクトで繋がるの?
繋がりますが私の想定する使い方とは若干違います。
カメラのフレームレートを争点にしていたのでこれを出しました。
本来使いたいのは
「ソース」-「時系列処理が必要なフィルタ」-「レンダラ」
です。

>メディアタイプはRGB?
なんでもいいです。私の作ったフィルタは「RGB24」「RGB555」「RGB565」「IYUV」
「I420」のいづれかを想定して設計しております。

>本来期待されるべきフレームレートはいくつですか?
固定されていれば何でも。あえて決めるとすれば15fpsでよいです
6fpsのカメラであれば同じ画像を2.5回程度下流ストリームに投げるものでいいです

>ソースが吐き出すタイムスタンプ確認してみた?てんでバラバラの間隔だったのかな
う〜ん。どのカメラでやったか定かではないのですがQcamかbuffaloのカメラでは
バラバラでした。自分でも少々不確定なので試していないということでお願いします
0554デフォルトの名無しさん2007/06/18(月) 16:38:27
ちょっと前のFPS倍化の話と同じじゃん。
つーか、サンプルのレートばらばらでも動くように作れよ。
0555デフォルトの名無しさん2007/06/18(月) 22:19:44
VMR9でのデインターレースについて調べてるんですが、デインターレース
について何も設定しなければ、デフォルトの設定でデインターレースが有効
なってるんでしょうか?
テストプログラムで調べてるんですが、VIDEOINFOHEADER2のdwInterlaceFlags
が必ず0になってるんで、デインターレースの設定のしようがないんですが・・・
0556デフォルトの名無しさん2007/06/19(火) 14:35:18
>>555
>VIDEOINFOHEADER2 の dwInterlaceFlags が必ず0になってるんで

「なってるんで」ってのは意味不明だな。0 ならインターレース解除は行われない。
まともな MPEG2 デコーダーでインターレース物のファイルをデコードすれば
適当な値が入るはず。
05575552007/06/19(火) 16:38:40
>>556
そのメディアが確実にインターレースであると確認する方法がないんですよ。
(見た目ではインターレース縞は確認できるけど)
今、手元にあるDVD数種からVOBをそのままコピーして拡張子をmpgに変えて
テストしてるんですが、InterVideo、Mainconcept、ffdshowどれも0でセット
されてますね。InterVideoはデコーダがインターレース解除じているように
見えますけど。

0558デフォルトの名無しさん2007/06/19(火) 17:10:25
ffmpeg でのビデオの設定で、インターレース解除はオフに(チェックを外す)、
出力で「オーバーレイミキサーを使用する」「ハードウェアインターレース解除」をオンに、と設定してみて。
05595552007/06/19(火) 18:07:20
>>558
ありがとうございます。ffdshowでそのような設定にしたところ、
dwInterlaceFlagsに0以外が設定され、VMR9初期状態のデインターレスモード
がGUID_NULLから変化しました。何も設定しなくても、インターレース
ストリームが繋がればデインターレースが有効になっていることが確認でき
ました。「ハードウェアインターレース解除」をオンにするっていうのは
レンダラーにインターレースストリームであることを通知するって意味
だったのね。(わかりにくい)
0560デフォルトの名無しさん2007/06/19(火) 23:32:28
ハードウエアインターレース解除をONってのは
ハードウエアでデインタレースするって意味だが。
あとオーバーレイミキサを使用したらVMR9はつながらないということはない?
05615552007/06/20(水) 00:51:24
>>560
VMR9に繋がってますねぇ。まあ、ffdshowのその設定のとこのバルーンヘルプを
見ると、VIDEOINFOHEADER2ヘッダを使用するかどうかって設定らしいので、
VMRと繋がるかどうかは関係ないんじゃないかな。
あと、ハードウエアインターレース解除をONにしないとdwInterlaceFlagsに0
を入れてくるので、VMRにハードウェアデインターレースさせるって意味みたいね。

0562デフォルトの名無しさん2007/06/20(水) 01:44:55
フリーMLの方にも同じ質問してない?あっちにも途中経過報告よろ。
05635552007/06/20(水) 02:45:26
>>562
あい、あっちにも報告します。

その後、ひとつ確認ミスがあったので、報告を。
InterVideoは自前でデインターレースしているのではなく、VMR9のデインター
レースを有効にしているようです。InterVideoはなぜかデバッグモードでアプリ
を起動すると、接続を拒否するようです。(デバッグトレースを見られるのが
いやなのかな)それで、InterVideoが繋がってるつもりで、実はMaincncept
が繋がっていたという落ちでした(^_^;)
0564デフォルトの名無しさん2007/06/22(金) 00:45:35
qedit.hとvmr9.hは同居できないかもな。
vmr7.hとvmr9.hは同居できない。なぜなら前者はDirectX7に基づいていて、後者はDirectX9にもとづく。
そしてDirectX7と9は定義の一部が被るので一緒に使えない。
qeditもおそらく同じだろ。

と、さりげなくレスしてみる。
0565デフォルトの名無しさん2007/06/22(金) 14:12:31
>>564
vmr9.h (+その他もろもろ)がインクルードされた後に、

#define _D3DRMOBJ_H_
#define __D3DRM_H__
#include <Qedit.h>

でOK。
0566デフォルトの名無しさん2007/06/24(日) 17:48:41
カメラで画像を取り込みながら、画像処理をしたいのですが、
これはDirectShowを使えば可能なのでしょうか?
具体的にいうとカメラから取り込んだ画像は、リアルタイムで画面に描画しながら、
ある間隔でその画像を取得して画像処理を行いたいです。
また、サンプルなどがあれば教えていただきたいです。
0567デフォルトの名無しさん2007/06/24(日) 17:57:54
可能だYO!サンプルはたくさんあるYO!調べろYO!
0568デフォルトの名無しさん2007/06/25(月) 12:04:22
まず、GraphEditで
カメラ−画像変換フィルタ−VideoRenderer
と繋いであげるといいと思うよ。
画像変換のフィルタは標準では入っていないので、SDK付属のサンプルをビルドしてOSに登録してあげてください。
個人的にはEZrgb24フィルタがお勧め。
VideoRendererはDirectShowフィルタとして標準で入っているので、探してください。
0569デフォルトの名無しさん2007/06/25(月) 22:59:28
フィルタを開発するのに、ある時間の映像を静止画として、メモリに保存しておいて
その画像と現在の画像の差分を出力したいのですが、メモリ上にコピーを保存するコードが分からないのですが
似た様な事を昔やった方や、やり方分かる方いらっしゃらないでしょうか?
0570デフォルトの名無しさん2007/06/25(月) 23:05:00
単に必要な分だけバッファ確保すればいいんちゃうの?
0571デフォルトの名無しさん2007/06/26(火) 00:53:20

 EZrgb24 フィルタを改造して映像に文字を表示するフィルタを作りたいんですが,
どのような手順を踏めばいいのでしょうか?

CEZrgb24::Transform(IMediaSample *pMediaSample) 関数を改造して,

1) CreateDIBSection() で DIB 作成
2) TextOut() で表示

で試したんですが,文字が表示されませんでした….

AM_MEDIA_TYPE* pType = &m_pInput->CurrentMediaType();
VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *) pType->pbFormat;

HDC hDC    = GetDC(NULL);
HDC hdcMem = CreateCompatibleDC( hDC ); // メモリDC を作成
ReleaseDC( NULL, hDC );

void* lpRGB;
HBITMAP hDIB = CreateDIBSection( hdcMem, (BITMAPINFO*)&(pvi->bmiHeader),
                        DIB_RGB_COLORS, &lpRGB, NULL, 0);
// hDIB は NULL ではありませんでした.

このように pvi->bmiHeader から DIB を作成しているんですが,ここが間違っているんでしょうか?

0572デフォルトの名無しさん2007/06/26(火) 04:21:27

 すいません,どうやら非常に恥ずかしい間違いをしていたようです….
このやり方が標準的なのかは分かりませんが,以下のコードで無事表示できました.


int nPicels = pvi->bmiHeader.biHeight*pvi->bmiHeader.biWidth;
int nDataSize = nPicels*pvi->bmiHeader.biBitCount/8;

void* lpRGB;
HBITMAP hDIB = CreateDIBSection( 0, (BITMAPINFO*)&(pvi->bmiHeader),
                       DIB_RGB_COLORS, &lpRGB, NULL, 0);
if(hDIB && lpRGB)
{
  memcpy(lpRGB, pData, nDataSize );// DIB array を映像で初期化

  HDC hdcMem = CreateCompatibleDC( 0 ); // メモリDC を作成
  HBITMAP hOldBMP = (HBITMAP)SelectObject(hdcMem, hDIB); // メモリDC にビットマップを選択

  char szText[256] = "Test string";
  TextOut( hdcMem, 0, 0, szText, strlen(szText));

  SelectObject( hdcMem, hOldBMP);
  DeleteDC( hdcMem ); // メモリDC 削除

  memcpy( pData, lpRGB, nDataSize );//BMP を書き戻す.
  DeleteObject( hDIB );
}
0573デフォルトの名無しさん2007/06/26(火) 19:11:56
Transform(IMediaSample *pMediaSample)
で
pMediaSample->GetSize();
と
pMediaSample->GetActualDataLength();
を実行して、メディアのデータサイズを取ったら、どちらも0が返ってきたのですが
これって、何かの使用ですか?
0574デフォルトの名無しさん2007/06/28(木) 10:27:55

 DirectShow のサンプルをみてると JIF, LIF マクロがよく使用されてますが,
機能や使用目的はわかるんですが,これは何の略なんですか?
 どうにも気になるんで御教示下さい.
0575デフォルトの名無しさん2007/06/28(木) 11:47:29
Jump If Failed
Leave If Failed
0576デフォルトの名無しさん2007/06/28(木) 16:02:20
>>575
げ、これマジなの??
05775742007/06/28(木) 17:09:12

>>575
 有難う御座います.一応ググってみたら LIF の方は Log-If-Failed のようですね.
何はともあれ助かりました.
0578デフォルトの名無しさん2007/06/28(木) 17:11:13
>>577
なら書き込む前にググれよ・・・
それってすげーたち悪いぞ
0579デフォルトの名無しさん2007/06/28(木) 17:13:43
代わりにググってくれ、という書き込みだったのに
ググってくれなかったから、しかたなく自分でググリました、とさ
0580デフォルトの名無しさん2007/06/28(木) 17:16:27
( ´_ゝ`)フーン
05815742007/06/28(木) 17:52:42

失礼,JIF, LIF macro でググっても関係無いページばかりヒットしてしまい,
わからなかったので質問しました.
0582デフォルトの名無しさん2007/06/28(木) 18:23:23
失礼、すまんかった
0583デフォルトの名無しさん2007/06/28(木) 21:20:37
Return-If-Failed、てのがあっても良いような
0584デフォルトの名無しさん2007/06/28(木) 22:07:33
DirectShowのサンプルではこんなの使ってるな。

#define FAIL_RET(x) do { if( FAILED( hr = ( x ) ) ) \
return hr; } while(0)
0585デフォルトの名無しさん2007/06/28(木) 22:11:06
>>584
やっぱりあるのか・・FAIL_RETか

つかそのマクロの使い方はあれだな、VC6の時のforみたいだな
0586デフォルトの名無しさん2007/06/29(金) 11:51:22
DirectShowでBGMを、DirectSoundで効果音を出そうとしています。
DirectSound側で、IID_IDirectSoundNotifyを用いると、ターゲットのリンク時に
関数が重複しるぞ、ゴルァと言われてしまいます。

リンクしているのは以下のライブラリ
dsound.lib dxguid.lib uuid.lib strmiids.lib

dxguid.libを抜けば、IID_IDirectSoundNotifyのみ見つからないという状態に
なるので、これを使わないコードにすれば良いという話もあるのですが、うまく
共存させる方法はないでしょうか。ご教授お願いします。
0587デフォルトの名無しさん2007/06/30(土) 09:29:53

CComPtr を std::vector に入れても大丈夫?

std::vector< CComPtr<IMoniker> > vtIMonikerArray;

というふうに使いたいんだけど,std::auto_ptr をいれるときのような問題はありますか?
0588デフォルトの名無しさん2007/06/30(土) 19:15:08
>>587
少なくともauto_ptrのような問題が起きることはない
安心して突っ込みたまえ
05895872007/06/30(土) 21:11:13

>>588
 ありがとう,やってみます.
0590デフォルトの名無しさん2007/07/05(木) 09:35:54
再生レートを設定できるようスプリッタにIMediaSeekingを実装したのですが、
実際にアプリから使用してみると、SetRate(8.0)のように高いレートを設定すると
エラー0x8004025cが返ってきます。
スプリッタ内部のSetRateでは、レートの制限をつけていないのですが、
どうしてかわかりますでしょうか?


0591デフォルトの名無しさん2007/07/05(木) 12:35:20
たぶんオーディオレンダラだな。
0592デフォルトの名無しさん2007/07/05(木) 22:31:42
現在、プログラムを全画面モードで動作させ、そこからムービーを再生(全画面)しようと
しているんですが、なぜかムービーウィンドウがトップにならず、
プログラムウィンドウの裏にまわったりして、きちんと再生されません。
VideoWindowはトップにくるように命令を入れてるんですが、きちんと機能していないみたい。
どなたかご指導お願いします。

// 自前のウィンドウにムービーを再生する
pVideoWindow->put_Owner((OAHWND)m_hwnd);
pVideoWindow->put_WindowStyle(WS_CHILD|WS_CLIPSIBLINGS);
pVideoWindow->SetWindowPosition(0,0,800,600);
pVideoWindow->SetWindowForeground(OATRUE);
pVideoWindow->put_Visible(OATRUE);
// ストリームの再生(グラフの実行)
hRslt = pMdaCtrl->Run();
pMediaEvent->WaitForCompletion(15000, &eventCode);
05935902007/07/06(金) 09:52:06
>>591

オーディオレンダラをフィルタグラフから外すと成功しました。
ありがとうございました。
しかし、いちいち外したり、接続したりするのは面倒ですね。。
0594デフォルトの名無しさん2007/07/06(金) 12:21:01
>>592
何再生してもそうなる?
ビデオデコーダにDivX本家使うと、再生開始時に何かにアクティブ
ウインドウ奪われちゃうって経験はあるけど。
05955942007/07/06(金) 12:35:38
>>592
それよく見たら、全画面表示するにはメインウインドウの子
じゃできないような。親をNULLにしたらいいんじゃない?
0596デフォルトの名無しさん2007/07/07(土) 01:13:03
DirectShowで画像を回転させるフィルタでいいのない?
逆さ向けてビデオとってしまったんだorz
■ このスレッドは過去ログ倉庫に格納されています