DirectShowと戦うスレ Part 2
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/11/08(水) 00:25:56http://pc8.2ch.net/test/read.cgi/tech/1026666092/
0409デフォルトの名無しさん
2007/04/04(水) 20:04:25Releaseし忘れっぽい
0410デフォルトの名無しさん
2007/04/04(水) 21:07:23★ ∧η∧
\_(,,・Д・)<ただいまんこ〜拡大縮小できたぞ。BokkingFilterの完成だぞ。
ヽ |フ ビデオのサイズが変わらなかったのはフィルタ接続後にサイズ変えてたからだぞ。
/_ _|
CheckTransformでサイズを変更したぞ。
変更したサイズからRGB24で必要なバッファサイズを計算して保存だぞ。
ストレエッチDIBitmapだぞ。それに対してソースからストレッチDIBitsして
完成したぞ。
そして完成した後に次の問題が出たぞ。
時間指定して3分の動画で1分目から2分目を抽出したいんだが
ControlStreamにS_OK帰ってきてもダメポだぞ。
AVI再圧縮で時間指定して抜き出すテクを知ってたら教えて欲しいぞ。オマンコクロスだぞ。切実だぞ。
0411デフォルトの名無しさん
2007/04/04(水) 21:12:04★ ∧η∧
\_(,,・Д・)<あと、AVI MuxフィルタをキャプチャグラバからFindInterフェラして
ヽ |フ IAMStreamControlを生み出してStartAtとStopAtする方法を作ったんだが
/_ _| ム圧縮AVIなら何とか成功してWMVとかコーデック使うと画像が表示されんぞ。
あと、保存してない間も無駄に待たされて酷い目にあったぞ。
誰かオレがナニをすべきか教えて欲しいぞ。
0412デフォルトの名無しさん
2007/04/04(水) 21:36:48⊂⊃
★ ∧η∧
\_(,,・Д・)<キャプチャビルダのコントロールストリームはこんな具合になってるぞ。
ヽ |フ オマンコクロスだぞ。ソースを持って変えれないので具体的に説明できんぞ。
/_ _|
0413408
2007/04/04(水) 22:46:10まさにそれでした。SDKのヘルプに書いてありましたね
0414デフォルトの名無しさん
2007/04/04(水) 23:23:04素直にこれ使えば?
http://www.microsoft.com/japan/msdn/directx/techart/cplusvbappdevs.aspx
http://www.microsoft.com/japan/msdn/directx/techart/wm_des.aspx
0415414
2007/04/04(水) 23:23:49http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdx8_c/ds/des/Oview/whatisDES.asp
0416デフォルトの名無しさん
2007/04/04(水) 23:35:12★ ∧η∧
\_(,,・Д・)<>>415 それも考えたんだぞ。大人の都合ってヤツでダメなんだぞ。
ヽ |フ くやしいぞ。オマンコクロスファイヤーハリケーンだぞ。
/_ _| 明日、ためしに作ってみるぞ。
0417デフォルトの名無しさん
2007/04/04(水) 23:45:110418359
2007/04/04(水) 23:57:28今のところ問題なさそうですよ。
ただ、スレの流れを見ると私以外で使ってみた人いないのかな?w
もう少し使ってみて気がついたことがあったら報告しますね。
0419デフォルトの名無しさん
2007/04/05(木) 00:03:51>私以外使ってる人いない…
(´・ω・`)ショボーン
0420デフォルトの名無しさん
2007/04/05(木) 21:34:17あと、××の製品かうと着いてくるフィルタは…とか語ろう
0421デフォルトの名無しさん
2007/04/06(金) 11:53:29・・・とはいえ、思いっきり過疎ってるスレだし>>419のニーズには合わんかな。
ところで質問です。
AddSourceFilterで追加したファイルソースの
出力ピンのメディアタイプを指定する方法はないでしょうか?
あるファイルを指定したとき、ただRender()しただけでは期待しているフィルタに
繋がらない(ファイルソースのメディアタイプがGUID_NULLになっている)ので
強制的に指定してみたいのですが・・・。
0422デフォルトの名無しさん
2007/04/06(金) 12:41:37質問は>>419に聞いてるのかな?
だったら応えます。
上流フィルタがカメラとかの入力デバイスの場合は「フィルタのピンプロパティ」から出力タイプを変更できるものがほとんどです。
仮に「動画」などのファイルであれば変換フィルタを噛ます事で変更は出来ますが新たに付けてやることは出来ません。
新規にフィルタを作成すればメディアタイプを付加しる物を作れるよ。
他の方法はわかりません
0423デフォルトの名無しさん
2007/04/06(金) 13:13:09> >>421=>>359さん??
うわー、なんで分かるの?w
> 新規にフィルタを作成すればメディアタイプを付加しる物を作れるよ。
> 他の方法はわかりません
やっぱりそれしかなさそうですね。
AsyncRdrサンプル辺りをベースに1つ作ってみます。
0424デフォルトの名無しさん
2007/04/07(土) 01:07:30★ ∧η∧
\_(,,・Д・)<無圧縮タイプのAVIなら時間切り出しできたぞ。
ヽ |フ ただ、無駄に時間がかかるぞ。切り出すまでフィルタにデータが流れて処理してるんだぞ。
/_ _| ポンドルウォーリア特殊召喚だぞ!ゴルァ!
0425デフォルトの名無しさん
2007/04/08(日) 10:32:36>速くなるらしい。なんかPresent(?)の戻りが早くなるとか言ってた。
これ本当?
0426デフォルトの名無しさん
2007/04/08(日) 11:42:57画面描写しないぶんタイムスタンプに忠実になるだけかと。。
>>424の話とは全然違う話
0427デフォルトの名無しさん
2007/04/08(日) 17:03:02プリロールかな?としても意味通じないし…
予測ツカナス
0428デフォルトの名無しさん
2007/04/08(日) 17:45:380429デフォルトの名無しさん
2007/04/09(月) 21:41:47プログラム動作としては、3つのmp3ファイルをタイマーで順繰りに再生するだけです。※1
この中でソースフィルタを変更してグラフを再構成する部分で分からない点があります。
流れ
1.新しいソースフィルタをグラフに追加する。
2.古いソースフィルタをグラフから削除する。
3.新しいソースフィルタの出力ピンからRenderする。
2の部分の詳細は以下のようになっています。
A.グラフ内のフィルタを列挙する。
B.列挙された全フィルタについて
a.一旦グラフから削除する
b.古いソースフィルタでなければグラフに追加する
疑問点
b.の部分がある意味がわかりません。自分としては、グラフ内の全フィルタを削除して、新しい
ソースフィルタを追加して、Renderすれば簡単に思えるんですが...
どうかよろしくお願いします。
※1 ソースはSDK_Path\Samples\C++\DirectShow\Players\BGMusicです。
0430デフォルトの名無しさん
2007/04/09(月) 22:16:140431デフォルトの名無しさん
2007/04/09(月) 23:29:52Render は重いから。
0432デフォルトの名無しさん
2007/04/10(火) 00:46:05★ ∧η∧
\_(,,・Д・)<>>429 サウンドってのは、レンドルァすると全部のcodecを試すんだぞ。
ヽ |フ だから、全て消して再構築すると連続再生とかできんぞ。
/_ _| アイマスの魔法をかけて!から、とかちつくちての連続技の間に途切れるって事だぞ。
0433デフォルトの名無しさん
2007/04/10(火) 01:13:25やべぇ見直した。。
0434デフォルトの名無しさん
2007/04/10(火) 01:55:46なるほど、それで以前使ったフィルタは残してたんですねφ
ところでその時、つながっていないフィルタがグラフ上に散在している状態ですよね。
その状態でRenderしたら、全Codecを試さず、散在しているフィルタを繋げてくれるんですか?
それともRenderを使わず、ピンを繋ぐ方法が別にあるのでしょうか?
この板のレベルに達するまで勉強して、出直してきます。(時間かかりそう...)
0435デフォルトの名無しさん
2007/04/10(火) 07:21:49★ ∧η∧
\_(,,・Д・)<>>434 朝勃ち中だが答えるぞ。
ヽ |フ レンダーすっと、フィルタが追加されている物から試すんだぞ。
/_ _| そのため、レンダーする前にvmr9のフィルタとかを入れておくとただのビデオレンダーじゃなくなったりするぞ。
だから、先に自分で作ったフィルタを入れておくと正しく繋がったりするぞ。
もちろん、Renderを使わずにグラフビルダのほうでConnectすることができるぞ。
IPinってのをフィルタから抜き出して接続できるみたいなんだぞ。
使った事無いからうまんちんまんだぞ。
0436デフォルトの名無しさん
2007/04/10(火) 07:39:07★ ∧η∧
\_(,,・Д・)<なんか、間違ってるかもしれんが許してほしいマンコ!んじゃ為替予想書いてくるぞ。
ヽ |フ
/_ _|
0437デフォルトの名無しさん
2007/04/10(火) 12:02:08今、DirectShowでUSBカメラからサンプルグラバでBMPをキャプチャするプログラムを作っています。
コールバックを使用してキャプチャをしようとしているのですが、
SetOneShotを使って1フレームだけキャプチャすることは出来ないのでしょうか?
ためしにSetOneShot(TRUE)としてみても、コールバックされ続けてしまいます。
0438デフォルトの名無しさん
2007/04/10(火) 17:56:39フィルタのGetMediaTypeでは、ピンによって2通りの設定が必要と思っています。
(オーディオの方の出力ピンからGetMediaTypeが呼ばれた場合はオーディオの値をセット、
ビデオの出力ピンからGetMediaTypeが呼ばれた場合はビデオの値をセットというように。)
しかし、GetMediaTypeでは、現在どちらの出力ピンから呼ばれているのか判別できないのですが、
どうしたら良いでしょうか。
出力ピンのクラスは同じものを使っているのですが、オーディオ用のピンクラス、ビデオ用の
ピンクラスと別に作成しなければならないのでしょうか?
0439デフォルトの名無しさん
2007/04/10(火) 19:30:13自分がどっちのピンかを区別して処理を変えればいいじゃん。
0440デフォルトの名無しさん
2007/04/10(火) 21:10:34★ ∧η∧
\_(,,・Д・)<>>437 ただいまんこー!ドピュンコしたあとに、コールバックを外せばOKだぞ。
ヽ |フ コールバックをセットしたままだと永遠にデータが流れるぞ。
/_ _| オレだったらSampleCBのあるクラスに BOOL m_Ochinpoいれて
データを流したくない時はfalseいれて SampleCBのなかでreturn S_OKしちゃうぞ。
オマンコクロッサー!
0441デフォルトの名無しさん
2007/04/10(火) 21:13:06★ ∧η∧
\_(,,・Д・)<>>438 IPin淫乱フェラにあるQueryPinInfoで解決できる気もするぞ。
ヽ |フ 俺も調べないと分らんぞ。スマソだぞ。力になれんぞ。
/_ _|
0442デフォルトの名無しさん
2007/04/10(火) 22:06:540443デフォルトの名無しさん
2007/04/11(水) 00:10:36フィルタ内部の話だからQueryはちがうとおもうぞ。
自分も>>439の意見に賛成です。
�@純粋仮想メソッドGetPinを実装してピン番号を取得
�AGetMediaTypeにてまず�@を呼び出す。
�Bピン番号が「1」ならビデオだから・・・メディアタイプ「Video」を要求
�Cピン番号が「2」ならAudioだから・・・・メディアタイプ「PCMAudio」を要求
iPositionにて要求するものをそれぞれ数個書いてやればいいかな。。
0444デフォルトの名無しさん
2007/04/11(水) 00:49:17★ ∧η∧
\_(,,・Д・)<>>443 オレはトランスフォーマーフィルタで1対1の戦いしかやったこと無かったぞ。
ヽ |フ これでピンが複数あるフィルタも手だせそうだぞ。
/_ _|
0445デフォルトの名無しさん
2007/04/11(水) 00:50:19コンボイの謎を2週くらいクリアしとけ
0446438
2007/04/11(水) 14:38:35>>439
僕はどっちのピンか区別できなくてコマッてます…
>>443
GetPinはピン番号を指定して、その番号のピンを取得するのだと思うのですが。
それだとピンの区別はできなくないですか?
実際には、フィルタはm_pOutputAudioとm_pOutputVideoの二つの出力ピンを持ってます。GetMediaTypeの中で、CBasePin::Name()でピンIDを取得して、判断しようかと思いましたが、結局ピンの指定によって取得値が変わってしまいます。
m_pOutputAudio->Name() とすればAudioが返るし、
m_pOutputVideo->Name() とすればVideoが返るので、
結局どちらのピンかわかりません。(両方が存在するので当たり前ですが)
※m_pOutputAudio,m_pOutputVideoはフィルタ作成時に作られます。
どうしたらよいですかね…
0447デフォルトの名無しさん
2007/04/11(水) 14:59:29if (pOutputAudio == this) {
//オーディオピンの処理
} else {
//それ以外
}
0448448
2007/04/11(水) 17:09:38参考にします。
フィルタのGetMediaTypeでピンを判別するから良くなかったみたいです。
フィルタのGetMediaTypeは、出力ピンのGetMediaTypeからコールされるので、
出力ピンのGetMediaTypeでどっちのピンか判断し、それを記憶しておくことにしました。
CSplitterOutputPin::GetMediaType()
{
if(0==lstrcmpW(this->m_pName, L"Audio")){
//フィルタのメンバ変数にオーディオだと記憶させる。
m_pSplitterFilter->m_bOutputPinAudio=true;
}
else{
//フィルタのメンバ変数にビデオだと記憶させる。
m_pSplitterFilter->m_bOutputPinAudio=false;
}
return m_pSplitterFilter->GetMediaType();
}
↑のようにして、フィルタのGetMediaTypeでは、m_bOutputPinAudioを見て、
オーディオ、ビデオの設定をするようにしました。
一応接続はこれで上手くいきました。何かとても簡単な質問をしてしまった気がしますが…
0449デフォルトの名無しさん
2007/04/18(水) 22:36:27時速80km/hで走る車が1時間何キロ走る?
・・・ポカーン
0450デフォルトの名無しさん
2007/04/19(木) 00:29:28★ ∧η∧
\_(,,・Д・)<1500円の2割引きは計算不能だぞ。俺の脳が再起不能(リタイア)したぞ。
ヽ |フ 時速80kmでオレは走れないので1時間も車を見張れないぞ!
/_ _| 果てしなく遠くが答えだぞ。
0451デフォルトの名無しさん
2007/04/19(木) 06:23:08Webカメラで取った映像を扱いたいので、SDKにあるAMCapを参考に機能を探しているのですが
キャプチャした動画をaviではなくmpeg1等で圧縮して吐き出したいのですが
フィルタを何処の関数で挟めばよいのでしょう。
あと、映像のガンマや彩度等がプロパティで調整できてしまいますが、これはなんのフィルタを使用しているのでしょうか?
初心者質問すいません。
0452デフォルトの名無しさん
2007/04/19(木) 07:35:23プロパティはソース見りゃわかるんじゃない。
以下推測
色調節のフィルタが存在するのではなくて
キャプチャデバイスやそのピンのプロパティじゃないのか。
Webカメラのデバイスドライバが変わればその機能も変わる。
MPEG-1エンコーダって標準装備か?
俺持ってない。存在しないフィルターは使えんよな。
0453デフォルトの名無しさん
2007/04/19(木) 07:54:41沖縄県での選挙ですが、どうか民主党だけは避けてください。県民の生命に関わる可能性があります。
民主党の最大の公約は一国二制度(※)ですが、一度「一国二制度 沖縄」等で検索をお願いします。
この際、民主党のHPで調べても良いです。以下の注釈↓と矛盾することは書いてないはずですから…
※一国二制度
簡単に言えば沖縄を中国と日本の共有物にし、そこに3000万人の中国人を入植させます。
(つまり沖縄人口の 96% を中国人にして、実質、沖縄を中国人の居住地とします。)
さらに「自主」の名の下、沖縄で有事が起きても自衛隊は干渉できません。
3000万人の中国人が、少数派となった130万人の日本人に何をしても、です。
そして中国人の反日感情の強さは、ほとんどの日本人の理解を超えるものです。
今回の選挙で民主党が勝った場合、「自主」「発展」を連呼しつつ段階的に進めていくことになります。
自主と言っても、自主を認めるのが「住人の96%が中国人となった」後だということに気をつけてください。
発展と言っても、新沖縄の少数派となった「少数民族日本人」の発展ではないことに気をつけてください。
0454451
2007/04/19(木) 14:09:38えっと、回答ありがとうございます。
トライ&エラーしながら死んでおります。
>色調節のフィルタが存在するのではなくて
>キャプチャデバイスやそのピンのプロパティじゃないのか。
...確かに、自宅で違うWebカメラで試したときは、設定ダイアログの内容がぜんぜん違っていましたね。
>MPEG-1エンコーダって標準装備か?
もう一度探しなおしたデコーダーだけで、エンコーダーはありませんでした。死んできます。
aviだと保存するにも重いから、実用的なサイズに直して自動保存しておいてって言われたんですが、asfかモーションJPEGかDVか、しか使えないのかな?
まぁ、いくらか頑張ってみます。
0455デフォルトの名無しさん
2007/04/19(木) 21:04:090456デフォルトの名無しさん
2007/04/19(木) 23:22:24GRAPHEDTがあれば買わなくてもいいな俺は。
>>454
MPEG4のコーディック2なら標準装備であるよ。
GraphEdtで↓な構成を書いてみるよろし
「WebCam」→「MPG4Codec2」→「AUXMix」→「FileWriter」
んで「WebCam」のPinプロパティを開いてみる
自分の思った通りに出来る場合
⇒そのままコーディング
自分の思った通り出来ない場合
⇒出来る方法を模索
をやっといた方がはやい
0457454
2007/04/20(金) 10:39:55一応あの後がんばった結果、DV形式とモーションjpegでは圧縮に成功しました
「うーん、なんかサイズ大きいね。asfで圧縮できない?」
といわれたわけで、メディアフォーマットSDKを読んで泣いています。
小さければ文句言われないのでmpeg4の方が楽かもしれません。
なんか進歩日記みたいになってすいませんが...。
0458デフォルトの名無しさん
2007/04/20(金) 20:55:50御礼を言うのは大変素晴らしいが、どこまで書いたことを理解できたのか
解るように(回答が的外れでなかったか知りたい)
内容についても一言触れて欲しかったな
と、会社では立場が最下層回答者の愚痴。
0459デフォルトの名無しさん
2007/04/20(金) 21:39:00飯食うので、この辺で。
0460デフォルトの名無しさん
2007/04/20(金) 22:14:15>GraphEdtで↓な構成を書いてみるよろし
>「WebCam」→「MPG4Codec2」→「AUXMix」→「FileWriter」
ここらへんから実は分かっていません。
GraphEdtは分かるのですが、圧縮用のcodecをどう呼び出せばいいのか…
directshow標準のDVだと
CoCreateInstance( CLSID_DVVideoEnc, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pDvFilter);
と書いたら作れたんだけど、標準外のものはクラスIDを何処で知れば良いんだと悩んでおりました。
そこで摘んだのでasfでの圧縮を模索したのですが、なかなか動くコードにならないで今日が過ぎていきました
0461デフォルトの名無しさん
2007/04/20(金) 22:51:49ふむ。成る程。
GraphEdtでのフィルタ登録の操作の仕方なのかそれをコーティングするときの方法なのかわからんです。
Clsid(クラスIDの事ね)がわからないと言ってるから↓↓がわからんのでは??
>自分の思った通りに出来る場合 ⇒そのままコーディング
ClsidはGraphedtでフィルタ登録する時に表示されてるよ。
それとも「Graphedt.exe」のアプリを「フィルタグラフ」(コーティング上の概念)と勘違いしてるのかなぁ…
0462デフォルトの名無しさん
2007/04/20(金) 23:07:45圧縮コーデックの列挙が必要なavi再圧縮に比べたらよっぽど簡単だよ。
0463460
2007/04/21(土) 06:14:41以下asfの書き出しの部分です。(短くするためにエラー処理省略です
IBaseFilter *pAsfFilter;
hr=CoCreateInstance(CLSID_WMAsfWriter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pAsfFilter);
hr = gcap.pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, L"cccc.asf", &pAsfFilter, &gcap.pSink);
hr=gcap.pFg->AddFilter( pAsfFilter, L"asf filter" );
pAsfFilter->Release();
hr = gcap.pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, gcap.pVCap, NULL, pAsfFilter );
このコードだとファイルの書き出しはしてくれるんだけど、何故か無圧縮aviが出力される。何ででしょうね…
> ClsidはGraphedtでフィルタ登録する時に表示されてるよ。
Gapheditでフィルタ選択したときに出るDisplayNameの、 {ランダムな文字} の間の部分って事ですね。
多分理解しました。
0464デフォルトの名無しさん
2007/04/21(土) 12:37:040465デフォルトの名無しさん
2007/04/21(土) 13:49:11ちゃんとMSDNでリファレンス見てから書いたほうがいいよ。
CoCreateInstanceでCLSID_WMAsfWriter作らなくても
SetOutputFileNameが作ってpAsfFilterに入れてくれる。
http://msdn2.microsoft.com/en-us/library/ms779904.aspx
http://msdn2.microsoft.com/en-us/library/ms784861.aspx
0466460
2007/04/23(月) 04:44:00一応頂いたアドバイスからちまちまと頑張っております。
>>465
hr=CoCreateInstance(CLSID_WMAsfWriter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pAsfFilter);
hr = gcap.pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, L"cccc.asf", &pAsfFilter, &gcap.pSink);
上2行からCoCreateInstance関数でのインターフェースの取得をやめて、メディアサブタイプをMEDIASUBTYPE_Asfに改めたのですが、何故かエラー。
どこかまだ問題があるのかも知れません。
というわけで、他のcodecに逃げる方に切り替えて、Graphedit.exeを弄りながらクラスIDを探したのですが書いたグラフをGRFファイルで書き出して、無理矢理テキストエディタで開いたら、それらしいクラスIDがあったので
キャプチャカード -> ffdshow -> File Writer
とフィルタを繋いだ所、無事に書き出しに成功しました。
サイズ的には納得してもらえそうな所にまぁ、落ち着きました。
フォーマットがXViDですが、あはは…。
> >>454
> MPEG4のコーディック2なら標準装備であるよ。
そこなのですが
・MPG4Codec2
・AUXMix
の2つのフィルタがちょっと見たりませんので上の様に逃げています(汗
探し方が足りないのかな?
とりあえず、相手に見せてみます。ありがとうございました。
まだ格闘しなければいけないところがあるので、ほとほと困ったらまた来るかもしれません。
0467デフォルトの名無しさん
2007/04/25(水) 16:01:46スプリッタの2つの出力ピンからデータを出力するようにしました。
が、再生すると何も表示されません(音も映像も)。
一方の出力ピンだけ接続し、もう一方の出力ピンは未接続の状態にすると再生はできます。
しかし、オーディオ、ビデオ両方を同時に再生しようとすると、どちらも
再生されなくなります。
原因は何が考えられるでしょうか。
0468デフォルトの名無しさん
2007/04/25(水) 16:15:00各ピン(のインタフェイス)は別々のスレッドから呼ばれる可能性があることを
ちゃんと考慮した作りになっているか、デッドロック等はないか、など考えてみるべき。
あと「再生されません」ではなく、グラフのステートが再生状態になるのかならないのか、
なる場合には停止で止まるのか止まらないのかなど、プログラマらしい情報の出し方を
0469467
2007/04/25(水) 19:34:56もともと1つの出力ピンのソースに、無理やりもう1つの出力ピンを
追加したのが問題かもしれません。
基本的にm_pOutput(元々あった出力ピン)が出てくるところに、
もう1つのピンの処理を追加したような感じです。
>あと「再生されません」ではなく、グラフのステートが再生状態になるのかならないのか、
>なる場合には停止で止まるのか止まらないのかなど、プログラマらしい情報の出し方を
すみません、情報不足でした。GraphEditで確認しているのですが、
再生ボタンを押した後、再生状態にはなっているようです。
しかし、停止ボタンを押すとフリーズし,
The graph was unable to complete pause within 10 seconds.〜
という警告がでる状況です。
0470デフォルトの名無しさん
2007/04/25(水) 19:37:182つある場合はそれぞれ別のスレッドで動く必要がありますが、
そのあたりは問題ありませんか?
0471467
2007/04/25(水) 20:27:13deliverは使ってませんが、内容は一緒です。
プッシュ型です。
具体的にはフィルタのReceiveでは、下記のようにしてます。
if(m_bOutputSampleAudio)
{
// オーディオならオーディオピンから出力
if(m_pOutput->IsConnected())
return m_pOutput->m_pInputPin->Receive(pSample);
}
else
{ // ビデオならビデオピンから出力する
if(m_pOutputVideo->IsConnected())
return m_pOutputVideo->m_pInputPin->Receive(pSample);
}
1つのスレッドで動かしているような気がします。
スレッドを別々に持つとは、オーディオピンがストップしたとしても、
ビデオピンは関係なく出力できる、みたいな感じですよね。
どう実装すればいいのか…
0472デフォルトの名無しさん
2007/04/25(水) 21:15:13オーディオレンダラにつながっているピンにもデータが来なくなるので、
時間が進まなくなって永遠にブロックするという動作。
出力ピンをCSourceStream から派生させて実装するのが base classes 的には常道。
パースしたビデオ、オーディオのデータをそれぞれのピンの中の Queue (自分で作ること)
に入れておいて、FillBuffer で Queue にあるデータをもとにメディアサンプルを作る。
個人的にはスプリッタを作るなら、ソースフィルタのサンプルコードをもとにして
出力ピンと入力ピンを追加するのが簡単だと思う。
0473デフォルトの名無しさん
2007/05/08(火) 16:19:57ビットマップを入れ、音声もゲームのカメラ位置に従って右の方にあれば
右寄りの位置から聞こえてくるようにしたいのですが、
とりあえず入門にあるようなSampleGrabberを使う方法ではなく
RendererFilterを継承するのが正解なのだろう、というところまでは
わかったのですが、フィルタを継承して自前で書くのにstreams.hとやらが
ありませんでした。Windows2000ではWindowsSDKがインストールできないので
迂回策を探しています(ちょっと前のPlatformSDKには入ってませんでした・・)。
Windows2000上でフィルタを継承するようなコードを書いてる方は、
どのようにやっているのでしょうか?
他にも「別にRendererFilterを継承しなくてももっといいやり方がある」とか
ツッコミがあればお願いします。
0474473
2007/05/08(火) 16:25:19ついでに訂正・・・
×streams.hとやらがありませんでした。
○streams.hとやらが必要みたいですが、ありませんでした。
何がやりたいかわかりやすく書くと、
ゲームの中のテレビに任意の動画を流したい、ということです。
0475デフォルトの名無しさん
2007/05/08(火) 18:11:28D3Dのテクスチャに動画をレンダリングするのは、
SDKのサンプルにそのものずばりのがある。
DirectShow 関連のSDK が利用できないのであれば、
動画ファイルをWMVなりAVIで用意して、AVI関連APIや
Windows Media Format SDKでデコードすれば良いと思う。
0476473
2007/05/08(火) 18:42:40>WMVなりAVIで用意して、AVI関連APIやWindows Media Format SDKでデコード
なるほど!動画関連のAPIに詳しくなかったので盲点でした。
その辺はこれから調べようと思うんですが、一つ質問させてください。
>SDKのサンプルにそのものずばりのがある。
これなんですが、WindowsSDKのことでしょうか?
最初DirectXSDKのサンプルかと思ったのですが見当たらなかったので・・・
0477デフォルトの名無しさん
2007/05/08(火) 19:01:25そうです。
Windows 2000 だと Windows server 2003 SP1 Platform SDK を利用することになります。
SDK の導入あたりから書かれたページを見つけたので読んでみてはいかがでしょうか。
ttp://www.shader.jp/xoops/html/modules/xfsection/article.php?articleid=17
0478デフォルトの名無しさん
2007/05/10(木) 01:38:59VMR9を使って動画の再生を行おうとしているのですが、動画の
元サイズとアスペクト比を取得しようと
IVMRWindowlessControl9::GetNativeVideoSizeを使っているのですが、
このメソッドのセットする値が期待した値になりません。
long x, y;
long aspx, aspy;
HRESULT hr = pVMRWindowlessControl9->GetNativeVideoSize(&x, &y, &aspx, &aspy);
このコードで720×480のmpeg2ファイルを読み込むと期待としては
x = 720
y = 480
aspx = 4
aspy = 3
こんな感じになると思っていたのですが、実際は
x = 720
y = 540
aspx = 720
aspy = 540
となってしまいます。元々のサイズとアスペクト比を取得したいのですが、
これではできません。他の方法があるのでしょうか?
ちなみに、IBasicVideo2を使うとちゃんとできるんですよね。他の機能を実装
するためにVMR9を使わざるを得ないのですが・・・
0479デフォルトの名無しさん
2007/05/16(水) 14:14:00Webカメラから取った動画を保存できるようにプログラムを書いたのですが、そこまで完成したのを見せたところ。
「こんどはコレ再生して、再生時間を表示できるようにできないかな?」
と言われてしまいましたが、正直何を使って実現すれば良いかどうかから思い当たるところがありません。
そのインターフェースを使えばよいかどうかだけでも、教えていただけないでしょうか…。
IAMDroppedFramesあたりかな、とも思ったのですがいまいち思ったように動いてくれていません。
0480479
2007/05/16(水) 14:43:41先ほど、話をしなおしたのですが。私の勘違いがあって。
「Webカメラから取った動画」に「現在の時間」を残せないか?という要求でした。
具体的には動画の何処かの隅っこに、現在時間を画像として書き込んでしまうようなものを想像していたみたいです。
質問するのではなく、自前でフィルタを書くべきみたいですね。すいませんでした。
0481デフォルトの名無しさん
2007/05/16(水) 17:19:42誤差が33ms以内とか
0482デフォルトの名無しさん
2007/05/17(木) 00:56:53単に秒まで出すだけならたやすい。
インプレイスフィルタが1番楽。次点は資料がたくさんあるトランスフォームフィルタ。
1・TranceFormメソッドをオーバーライド
2・IMediaSampleからDIBポインタをとる
3・DIB→デバイスコンテキストに変換
4・WinAPIのTextOutで文字書く
5・デバイスコンテキスト→DIB変換
たったこれだけでおk
0483460
2007/05/20(日) 19:49:18結構頑張ったけど、2,3のステップの所のコードが作れません。
0484デフォルトの名無しさん
2007/05/21(月) 05:05:45厳密なアルファブレンドだと処理が重いから、切り抜き程度でいいと思う。
0485デフォルトの名無しさん
2007/05/21(月) 08:39:410486デフォルトの名無しさん
2007/05/21(月) 15:14:30客の要求仕様に基づいてプログラムを作ってるならしようがないけど、もしかすると
「>>460 が作業する工数 >>>>>>> 撮影時に時計を一緒に写す手間」じゃないか?
もしそうなら道楽で予算を無駄遣いしてることになるから、正直適当なとこでやめて
本業に精を出した方がいいような気がする・・・
0487483
2007/05/21(月) 17:40:41>>484
うん、最初にそんな感じのことを思いついて、ドット絵の様な汚い文字を無理やり表示させてみました。
どうしても気持ち悪いので、なんとかしたいですが、後回しかも…。
>>484
ヒントありがとうございます。
後日完成を目指すです。
0488デフォルトの名無しさん
2007/05/21(月) 21:30:57ィルタを使用すると強制終了が起こってしまいます。
コンパイルエラーは出ません。
デバッグモードでビルドした場合は、問題は起こりません。
強制終了が起こる場所は、おそらくmallocをしているところだと思います。
正確にはmallocを使用している関数で落ちるのですが、その関数の内部は見えま
せん。
デバッグとリリースで、mallocが使えないことってあるのでしょうか。
0489デフォルトの名無しさん
2007/05/21(月) 21:47:43ありません。
0490デフォルトの名無しさん
2007/05/22(火) 03:24:020491488
2007/05/23(水) 00:27:49どうもありがとうございました。
0492デフォルトの名無しさん
2007/05/23(水) 08:32:54フィルタを作るのが最善の解決方法かどうかまだ悩んでいるようだけど自分はそれが1番楽な方法だと思う。
俺はヒントというかフィルタの作り方手順を書いたものだが、手順2、3のどこがわからんのか明確化してくれ。
手順3については>>485で調べられると思うけど
0493483
2007/05/24(木) 10:22:39どうも、お手間をおかけして申し訳ありません。
インプレイスフィルタということで、SDKサンプルのEZrgb24を基本に作っておりました。
フィルタのTansform関数で、引数としてIMediaSampleを受けりますが
これを
・DIB形式に変換
・それをデバイスコンテキストの代入
のところで躓いておりました。
一応やっつけ実装で納得はしてもらったのですが、自分で恥ずかしいので、後で直したいというのが正直なところです。
若輩者で申し訳ありません。
0494デフォルトの名無しさん
2007/05/24(木) 21:37:23それすら今は体力的に自信ない
0495デフォルトの名無しさん
2007/05/25(金) 02:39:17EZrgb24ってさインプレイスフィルタじゃないお( ・ω・)∩
違いはね。何のフィルタクラスを継承してるかで決まるんだ
ちなみに「EZrgb24」は「CTransformFilter」を継承してるお
0496デフォルトの名無しさん
2007/05/25(金) 03:59:410497デフォルトの名無しさん
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つーかキーワードがこれだけでてんのに自力で検索くらいしようとは思わんのかね
0501デフォルトの名無しさん
2007/05/25(金) 23:26:220502デフォルトの名無しさん
2007/05/26(土) 12:58:18IGraphBuilder::AddSourceFilterを使ってもデフォルトのソースフィルタが呼ばれるし、
普通のフィルタ同様に、
CoCreateInstance&AddFilterすると、ソースフィルタに読み込むファイル名が指定できません。
0503デフォルトの名無しさん
2007/05/26(土) 20:01:49>>496の聞きたいことの意味がわからんかっただけで
俺は知ってるからおk。
今日はPCだからしらべてみたけど、ボトムアップという表現
はあんまり使われてないぞ??
■Google調べ 「DIB ボトムアップ」検索結果
っミ【114件】
0504デフォルトの名無しさん
2007/05/26(土) 20:27:02トップダウンとボトムアップの、メモリ上のピクセルの並びの違いについてごくごく簡単に説明している
Top-Down vs. Bottom-Up DIBs
ttp://msdn2.microsoft.com/en-us/library/ms787796.aspx
サンプル画像のセンスの無さには相変わらず笑わせてくれる。
0505デフォルトの名無しさん
2007/05/26(土) 21:27:48今後使っていくよ。
まぁBITMAPの仕様の話であって
あんまりDirectShowとは関係ないとこで使うことになりそうだけど
0506デフォルトの名無しさん
2007/05/26(土) 21:32:32ごめんボトムアップに気を取られていた
自作フィルタを登録する方法はコマンドラインから
「regsvr32 ぱす&自作フィルタ.ax」でレジストリ登録が必要です。
その後「Graphedt」でフィルタグラフに登録できることを確認するんだよ
それでもできなかったらまた質問しましょう
0507502
2007/05/27(日) 02:21:11すいません、説明不足でしたが、レジストリ登録、GraphEditでの確認は出来ています。
ただアプリケーションから自作ソースフィルタを使ってファイルを読み込む方法がわかりません。
GraphEditで追加したときは、読み込むファイルを聞いてくるのですが、アプリからソースフィルタを追加しても、ファイルを聞いてこないのです。
0508デフォルトの名無しさん
2007/05/27(日) 04:22:30窓枠の提供はどこがやるの?って事だと認識しました。
自作ソースフィルタを「GraphEdit」で開いた場合、
ファイル選択ウィンドウはディスクトップ画面のド真ん中に出ますか?
もし真ん中に出ない場合、「hWnd」をデスクトップから取っていないことになります。
アプリケーションから渡してやる(=ファイル選択ウィンドウを作って選択結果をフィルタに渡すような設計)
にしてやる必要があるかと思います。
自作ソースフィルタのファイル選択ダイアログを出す部分のソースを晒せば解決できると思いますよ
■ このスレッドは過去ログ倉庫に格納されています