うーん
Windows SDK以外に
旧式のPlatform SDKも入れないといけないのか
Win2K+VC6ならね。
Windows SDK(for Vistaのアレ?)はWinXP SP2以降しかサポートしてないから。
素のVC6でDX9SDKを使う手抜き技。
#include <windows.h>
#ifndef _W64
typedef unsigned long DWORD_PTR;
typedef long LONG_PTR;
typedef unsigned long ULONG_PTR;
#endif
#include <dshow.h>
何故summer 2003を使わない?>VC6
どのdshow.h使ってる?
>>9のPlatform SDKでは
#include <dshow.h> だけでコンパイル出来たけど。
マクロあたりで引っ掛かるのかな。
MicrosoftのSDKはいいかげんにして欲しい。
単体で良いかどうか、出た日付、サポートする環境を書いて一覧ページを置いて欲しい。
BaseClasses入ってたり入ってなかったりするし。
16 :
10:2006/11/12(日) 12:22:01
ってよく見たらWindows SDKにもDirectShow入ってた。
Webカメラの映像の解像度を変更する処理にチャンレンジしているが、
初期化時に
pAMStreamConfig->SetFormat(*****);
で解像度を変更するには成功。
しかし、
pCaptureGraphBuilder2->RenderStream(****);
を実行してしまうと解像度の変更ができない。
これを解決する方法か、または
RenderStreamで接続したピンを未接続にする方法はないでしょうか?
再起動後ではなく、リアルタイムに解像度を変更したいので。
IID_IMediaControlでプレビューをSTOPして
SetFormatして
プレビュー再開じゃだめなの?
>>18 いえ、Runする前にでもRenderStream後だと
SetFormatが失敗するようなのです。
ですのでRun後、Stopしたとしても
それまでに一度RenderStreamが実行されていると
SetFormatがうまくいかず、苦労しています。
初期化の過程で、RenderStream前に
SetFormatした場合は成功しています。
しかし、リアルタイムに変更するからには
それができずにいます。
なので、RenderStreamをする前の状態に
戻すような方法はないのかと。
一度止めて初期化からやり直すのは無理なの?
DirectShow関連をすべてReleaseしてから
再度初期化からやり直しても
やはり二回目のSetFormatが失敗します。
やはりRenderStreamを解除するような手段が必要な気がします。
> 再度初期化からやり直しても
そうか、それは困るね。
CoUninitializeとかプロセス起動し直しでも失敗する?
丁寧にありがとうございます。
CoUninitializeまでやっても同様でした。
プロセス再起動というのは初耳ですが、
カメラに関する処理以外(DirectShow以外)には
影響を与えたくないんですが、大丈夫でしょうか?
いろいろ調べてますが、
IFilterChain::RemoveChainが怪しいのですがネット上の情報が皆無で
コンパイラを通すところですでに引っ掛かってます。
子プロセス作ってパイプで、とかアドホックな手もあるだろうけど
CoUninitializeで無理なら駄目かもね。
インターフェイス使ってどうにかする方は俺には分からない。
25 :
デフォルトの名無しさん:2006/11/12(日) 22:50:09
>>23 1.IPin::Disconnectでピンの接続解除
2.SetFormat
3.RenderStream
AMCapみたいに、USBカメラのプロパティダイアログを呼んで
解像度変更するのはダメなの?
Managed DirectXが先に死亡したのねw
>>25 うおーー!!
成功しました。ありがとうございます。
FindPinで2つのフィルタ間の出力ピンと入力ピンとを見つけ、
そのピンをDisconnectで接続を外し、SetFormat。
そののちRenderStreamでできました。
ヘルプのDisConnectの欄をを見るとIPin::Disconnectの方は
「アプリケーションからこのメソッドを呼び出さないこと」
とか書いてて「じゃあヘルプに載せるなよ」とか思いました。
なんとかIFilterGraph::Disconnectの方で成功。
本当に助かりました。1つの問題で何時間も悩み、
DirectShowのクセの強さを痛感しました。
今のSDKに GraphEdit って付いてないんだっけ。
あれでちょっと調べてみれば接続済みのときには設定変更できないとか
あれこれ挙動もわかるし悩まずにプログラミングできるんだけど。
ん???ついてるよ
Videos for Windoewsは
前スレにも過去スレにも話題も出てないし
スレも立っていないようですが
もはや今の時代こんなの使うべきじゃない
って解釈でOKでしょうか?
XPが最後でVistaでは廃止されて使えないんじゃなかったっけ?
使えないと困るだろ。
今後改善・改良されないだけ。
そういえば64bitプロセスからDShow使うとどうなるんだろう。
フィルタも64bit用DLLを用意しないとダメ?
MDX2.0は期限切れで使えません
36 :
デフォルトの名無しさん:2006/11/15(水) 12:41:43
質問があります。
DirectShowフィルタのプロパティー画面を制作しているのですが、
タブを追加する方法がわかりません。
CBasePropatyという基底クラスにタブ追加メソッドがないのでどうしたらいいのかがわからんです。
WindowsAPIでいうところの「TabContrl_InsertItem」みたいなことをするにはどうしたらよいでしょうか?
>>33 どっかで廃止って見て、かなり前に作ったVideos for Windoews使いまくりのアプリを
どうしようって思ってたんだけど、勘違いだったか。
よかったよかった。
38 :
デフォルトの名無しさん:2006/11/15(水) 17:22:27
VFWは最近のボードだと、
正しく動作しないことも多いような...。
39 :
デフォルトの名無しさん:2006/11/15(水) 17:55:43
>>36 ISpecifyPropertyPages::GetPagesで複数のCLSIDを返せば良いだけでは?
40 :
デフォルトの名無しさん:2006/11/15(水) 18:30:09
うちのUSBカメラはVFWはすでに無視してます
41 :
デフォルトの名無しさん:2006/11/15(水) 23:17:00
>>39 せっかく教えてもらったのにヽ(´ー`)ノ
VFWtってC#マネージドでも使えますか?
43 :
デフォルトの名無しさん:2006/11/16(木) 02:01:34
動画をデスクトップに保管しそのファイルを解凍し(解凍ソフト)、そのファイルをMPG2AVIに
入れて変換開始ボタンを押すと<DirectShowフィルタが構築されません>
とでて変換出来ません。どなたか親切な方教えて下さい。ちなみに私は初心者です。
宜しくお願いします
動画板池
45 :
デフォルトの名無しさん:2006/11/16(木) 08:09:05
>>43 保管したファイルを解凍の時点でわかんない
向こうで質問するにしても気をつけれ
46 :
デフォルトの名無しさん:2006/11/16(木) 20:15:19
つかDirectShowも所詮はCOMだしなぁ
.NETで動画触ろうと思ったら
結局何が一番良いんだろうなぁ
所詮はCOMってどーゆー意味だろ
COM拒否症かも
>>38とか
>>40とか色々まとめると
動画に静止画とかを挿入するような
単純な機能だけならVFWで十分
と思って良い?
50 :
デフォルトの名無しさん:2006/11/17(金) 08:50:22
じゃあSHOWってなにがすごいのさ?
51 :
デフォルトの名無しさん:2006/11/17(金) 09:02:24
すごいかどうかは別にして、VFWでできることはDirectShowでも簡単にできる。
あえてVFWを使う必要なしってことかな。
COMでとっつきにくいのを乗り越えてDirect Showで書いても
別に局.NETでマネージされてくれるわけでもないし
じゃあ結局どの辺にご利益があるのかなあ
と言うことだとエスパー
53 :
52:2006/11/17(金) 13:20:15
スマソ2行目の局は入力ミス
脳内あぼーんしてくれ
>>50 AVI 以外を扱いたくなったときに対応可能ってとことか。
>>46 .Net で動画触るなら、C++/CLI で書くのが一番。
DirectShow でも WMF でも SDK 使って普通に使える。
単にVFWを捨ててDirectXに統合したかったんでしょ。
で、のちのち気が変わってDirectShowだけプラットフォームSDKに移動したと。
プラットフォームSDKへの移動は、どちらかというと昇格だね。
DVDでコマ送り、コマ戻しはどのようにやるのがよいのでしょう?
。みいかはいつ対応するの?
なんでそんな書き方する?普通にドットネットってかけよ。
最初のshiftが同時押しになったらしい
61 :
デフォルトの名無しさん:2006/11/20(月) 18:26:00
.NETのことだったのか
62 :
デフォルトの名無しさん:2006/11/24(金) 02:05:52
質問です。
変換フィルタを使って動画の画面サイズ解像度を変更(下げる)するフィルタ
を作ろうかなと考えております。
中身の処理はアンチエイリアスを自作する予定です。
【質問】
壱:OutPinに解像度を設定する項目があると思うんですがどうやってするんでしょうか?
弍:動画(1秒に15枚のBMP画像)を周波数解析したら普通のPCでは処理重杉でしょうか?
1.希望サイズ、フォーマットの出力メディアタイプの提示をする。(TransformフィルタならGetMediaTypeで提示したいメディアタイプを返す。)
2.JPEG圧縮だって一応周波数に変換するから何とかなるんじゃない?
64 :
デフォルトの名無しさん:2006/11/24(金) 04:46:37
>>63 壱:InputPinからGetMediaTypeで解像度取得してSetMediaTypeで
下流ストリームに教えてあげるのね。やってみます。
弍:JPEGはDCT。コサイン変換で周波数解析すればおk
と言う事と深読みしてみる(`・ω・´)
回答いただきありがとうございます。
なんか公式の解説ページにあるコードが間違いだらけな気がするのは俺だけ?
明らかにNullのクラスポインタからメソッド呼び出そうとしてたり
>>44 動画板って特別企画の動画2ch板のことか?
あそこに初心者質問スレが立つことなんてあるのか?
67 :
デフォルトの名無しさん:2006/11/24(金) 20:07:34
>>64 下流ストリームに教えてあげるのはGetMediaTypeと思われ。。。
68 :
デフォルトの名無しさん:2006/11/24(金) 21:10:08
>>67 なんですと〜。ちゃんと
確認の意味で書いてよかった。
へるぷ見て勉強しなおします
>>68 ヘルプもいいけど、ベースクラスのソースとサンプル見た方が早いよ
70 :
デフォルトの名無しさん:2006/11/25(土) 01:01:26
>>68 「おいおい、あんた何を俺にくれるのよ?」が GetMediaType
>>65 あるね。ビルドやってないだろ、見たいなの。
DirectShowってやっぱ"Show"って言ってるだけあって
入力方向より出力方向の方が充実してるって感じなんでしょうか?
正直、他アプリからDirectShowへの入力はかなりイマイチな希ガス
ソースフィルタ側ってあんまり活用されてないよねえ
上流はプッシュ、プルモデルを正しく理解して実装するのは(最初のうちは)大変かと
トランスフォームなら良くわからなくても実装しやすいからね
フィルタ開発しているとピン接続を拒否されたときの理由を調べるのがつらい。
もっと簡単にわかってほしい。
>>51とかよぉ、VFWとやらがどんなもんなのかはまあ知らねぇんだが
DirectShowが簡単ってこたぁねぇ気がすんだがなぁ。
普及させたいからかなんか知らんが誤解を与えるような表現はイクナイ
簡単じゃないけどそれはハードルであって
そこを超えると何もかもが簡単になるという
RUBYYYYYYYYYYYYYYYYYYY
ってやつ
質問です。
長さ無制限のストリームを供給し続けるプル型のソースフィルタを実装することは可能でしょうか?
IAsyncReader::LengthでTotalバイトを取得できるようになっていますので、ここに長さ無制限を示す数値を設定しないといけないのかとは思うのですが、
0や-1を返すとかありなのでしょうか。
ご存知のかたいらっしゃいましたら、ご教示お願いします。
79 :
デフォルトの名無しさん:2006/11/27(月) 23:36:33
素人でスマンが、DrectXからDirectShowへ入力しようとしてるんだが、
俺なりに調べてみた所、サーフェイスを云々してRECT型使ってGDI経由で入力、
と言うようなスマートじゃない方法しか思いつかないんだが、
何か調べ方間違ってるんだろうか?
WindowsXP限定なら他にもありそうな感じだったがそれはしたくない。
そもそもこういう用途でDirectShowを使おうとすること自体間違いなんだろうか?
Directつながりでやりやすそうとか安易に思ってたんだが。
よくわからんがDirectShowのレンダラに絵を表示させる仕事をさせたいわけ?
できなくはないが簡単にはできない。
81 :
79:2006/11/28(火) 01:35:49
編集とか圧縮とかもできればやりたいが基本的にはまずは動画を出力したい、
レンダラ側とかは何とかなりそうだが、ソース側が‥
「プッシュ型ならどっちかって言うと簡単」みたいな記述を↓で見かけて
http://m--takahashi.com/old/09850.html 鵜呑みにしてソースフィルタ自作しようと思ったものの失敗だったか?
かと言ってFile Monikerとやらも簡単そうには見えないし
と言った状況であります。
>>81 DirectX でレンダリングした結果を動画ファイルにしたいってこと?
それってソースフィルタ書くことになるわけだけど、ソースフィルタ書くってのは
DirectShow のアレコレの中でも非常に難しいことなので、覚悟してやってくれ。
あとプッシュにするかプルにするかは勝手に選べるわけでもないんで、
その辺の理解も必要(パーサが対応してる方じゃないとそもそもグラフが組めない)。
漏れならWMF SDKで WMV にするなぁ。
あと万が一もし単に画面に動画を出したいだけなら、DirectXだけでそのままやれば十分。
ってかDirectShowのレンダラもDirectXで描いてるわけで。
WMF SDKは日本語のドキュメントが公開されてないっぽいので躊躇してたが
実際インストールしてマニュアル見たらこっちのほうが簡単そう
>>82ありがとうございました
84 :
デフォルトの名無しさん:2006/11/28(火) 19:34:50
62ですが動画サイズ変換フィルタでしました
ありがとうございました
なぜGetMediaTypeの中に出力Pinの設定をかくのか未だ謎。
まぁもう少し使い勝手(入力画像サイズの自動判断など)よくしたら
ソースとバイナリうpします
今後の為にも
85 :
デフォルトの名無しさん:2006/11/28(火) 19:36:21
う〜〜〜ん 何をしたいのか よくわからん。
DirectXで描画したイメージを100%忠実に取り出すことなんて そもそもできるのか?
> なぜGetMediaTypeの中に出力Pinの設定をかくのか未だ謎。
ココわからないと、この先しんどいと思われ
87 :
デフォルトの名無しさん:2006/11/28(火) 23:01:47
>>86 GetMediaTypeは上流ストリームの設定を取るインターフェースだけではなく
下流ストリームの接続の設定も取るしくみなのかしら?
だとしたらPinそれぞれにMediaTypeを取れるインターフェースを作ってもらいたいものよね
88 :
デフォルトの名無しさん:2006/11/28(火) 23:52:18
>>84 後学の為の資料としてソースうpしてくれるなら
ソースは直接書き込んだ方がいいかも。
うpろだだと後々検索でこのスレ見た人とかは拾えないから。
>>85 DllInjectionでDirect3D乗っ取ってフロントバッファを取得して、
それを直接DirectShowに流して動画キャプチャソフトを作りたいんじゃないかな?
俺は
>>83じゃないからわからんけど。質問見た感じそんな所じゃないかなーと思った
90 :
デフォルトの名無しさん:2006/11/29(水) 19:49:16
>>89 わかりました。
えいちてぃーえむえるにしてソースをどこかに貼りますね。
ただまだ解決出来ない問題がありますので暫くかかると思うけど…
画面の解像度変更すると出力Pinとレンダラの間に中間フィルタ「Colorコンバータ」が何故か入る
(´・ω・`)
中間フィルタさえはいらなきゃちゃんと表情されるのに…
91 :
デフォルトの名無しさん:2006/11/30(木) 02:41:37
>>89 フロントバッファと画面イメージって必ずしも同じじゃないんじゃ?
よくわからんけど。。。
>>91 え、BeginScene()とEndScene()の間のレンダリング結果が
Present()によってバックバッファからフロントバッファに
Blt(あるいはFlip)されると思ってたけど、違う?
93 :
デフォルトの名無しさん:2006/12/07(木) 14:28:29
class CGrabCB: public CUnknown, public ISampleGrabberCB
{
・
・
・
とコールバックとかいうのをすると、下記のようなエラーがでるのですが
どうすればよいのでしょうか?
.\AAA.cpp(489) : error C2504: 'CUnknown' : 定義されていない基本クラスが宣言されています。
.\AAA.cpp(492) : error C2501: 'CGrabCB::DECLARE_IUNKNOWN' : 識別名を宣言するのに、型が指定されていません。
.\AAA.cpp(1057) : error C2259: 'CGrabCB' : 抽象クラスをインスタンス化できません。
次のメンバが原因です :
'HRESULT IUnknown::QueryInterface(const IID &,void ** )' : 純粋仮想関数は定義されていません。
c:\Program Files\Microsoft Platform SDK\Include\Unknwn.h(113) : 'IUnknown::QueryInterface' の宣言を確認してください。
'ULONG IUnknown::AddRef(void)' : 純粋仮想関数は定義されていません。
c:\Program Files\Microsoft Platform SDK\Include\Unknwn.h(117) : 'IUnknown::AddRef' の宣言を確認してください。
'ULONG IUnknown::Release(void)' : 純粋仮想関数は定義されていません。
c:\Program Files\Microsoft Platform SDK\Include\Unknwn.h(119) : 'IUnknown::Release' の宣言を確認してください。
まず、CUnknownはどこから出てきた?
仮にCUnknownがIUnknownのメソッドを実装するクラスとして存在したとしても、
C++ではCGrabCBがCUnknownを継承しただけでは、
ISampleGrabberCBのIUnknownのメソッドを実装したことにはならないはず。
95 :
デフォルトの名無しさん:2006/12/07(木) 14:51:07
96 :
93:2006/12/07(木) 14:59:05
streams.hをインクルードし忘れてました。。
で、インクルードすると
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\atlconv.h(1000) : error C2084: 関数 'LPDEVMODEA AtlDevModeW2A(LPDEVMODEA,const DEVMODEW *)' は既に本体を持っています。
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\atlconv.h(548) : 'AtlDevModeW2A' の前の定義を確認してください
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\atlbase.h(6683) : warning C4193: #pragma warning(pop) : 一致する '#pragma warning(push)' がありません
またエラーが出てきてしまいました。前はこれでうまく言ったのですが・・
DirectShowでWEBカメラ映像を表示するプログラムを作ったのですが、
TVチューナーの付いたパソコンだとTV映像が表示されてしまいます。
なんとかWEBカメラに限定させることはできないでしょうか?
今、WMVを無圧縮AVIにするプログラムを作っているのですが
(最終的に別のソフトでxvidでmp4にする予定)
出力されるAVIが映像の再生時間だけ2倍になってしまいます
(音は普通に再生)
Directshowでの調整がうまくいかなかったので一度AVI作成後にRateとScaleとMicroSecPerFrameを調整して
AVI状態ならずれの修正はできたのですが、それをmp4に変換すると再生がおかしくなってしまい
原因がつかめなかったのでDirectshowでAVI作成するところまでもどってきたのですが
Grapheditでマスターストリーム指定で30秒くらいのファイル一個だけですがうまくいったので<wmv9
IConfigAviMuxをソースに追加してみてSetMasterStreamが成功はしているのですが
結果に反映されてくれません。
ソースは以下のようなものなのですがどこがいけないのでしょうか
-------------------------------------------------------------------------
IGraphBuilder*pGraph= NULL;
ICaptureGraphBuilder2*pBuilder= NULL;
IBaseFilter*pSrc= NULL;
IBaseFilter*pMux= NULL;
IBaseFilter*pAudioDec= NULL;
IBaseFilter*pAVIDec= NULL;
IPin*pPinIn= NULL;
IPin*pPinOut= NULL;
IMediaSeeking*pSeek= NULL;
IMediaSeeking*pRate= NULL;
IMediaEvent*pMediaEvent= NULL;
IMediaControl*pMediaControl;
longevCode;
CoInitialize(NULL);
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&pGraph);
CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC, IID_ICaptureGraphBuilder2, (void **)&pBuilder);
IBaseFilter *pAVIMux =NULL;//+id{CLSID_AVI mux}_GUID
pAVIMux = searchFilter(pGraph, L"AVI Mux" );
IConfigInterleaving *pConf = NULL;
IConfigAviMux *pConfMux = NULL;
pGraph->AddFilter(pAVIMux, L"AVI Mux");
LONG lo = -1;
pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, OutputFile, &pMux, NULL));
pBuilder->GetFiltergraph(&pGraph));
pGraph->AddSourceFilter( InputFile, L"SourceFilter", &pSrc));
pAVIDec = AVI Decompressorフィルタ取得
pAudioDec = WMAudio Decoder DMOフィルタ取得
pGraph->AddFilter(pAVIDec, L"AVI Decompressor");
pGraph->AddFilter(pAudioDec, L"WMAudio Decoder DMO");
pPinOut = GetPin(pSrc, PINDIR_OUTPUT);
pPinIn = GetPin(pAudioDec, PINDIR_INPUT);
pGraph->Connect(pPinOut, pPinIn);
pBuilder->RenderStream( NULL, NULL, pSrc, pAVIDec, pMux );
pBuilder->RenderStream( NULL, NULL, pSrc, NULL, pMux );
pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);
pGraph->QueryInterface(IID_IMediaEvent, (void **)&pMediaEvent);
pMux->QueryInterface(IID_IMediaSeeking, (void**)&pSeek);
CLSID id;
pAVIMux->GetClassID(&id);
CoCreateInstance(id, NULL, CLSCTX_INPROC, IID_IConfigAviMux, (void **)&pConfMux);
pAVIMux->QueryInterface(IID_IConfigAviMux, (void**)&pConfMux);
pConfMux->QueryInterface(IID_IConfigAviMux, (void **)&pAVIMux);
pConfMux->GetMasterStream(&lo);
pConfMux->SetMasterStream(1);
pConfMux->GetMasterStream(&lo);
if (pMediaControl->Run() == S_OK)
{
途中経過表示など
}
//終了処理
if(pRate != NULL) pRate->Release();
if(pConf != NULL) pConf->Release();
if(pAVIMux != NULL) pAVIMux->Release();
if(pConfMux != NULL) pConfMux->Release();
if(pAudioDec != NULL) pAudioDec->Release();
if(pAVIDec != NULL) pAVIDec->Release();
if(pGraph != NULL) pGraph->Release();
if(pBuilder != NULL) pBuilder->Release();
if(pSrc != NULL) pSrc->Release();
if(pMux != NULL) pMux->Release();
if(pMediaEvent != NULL) pMediaEvent->Release();
if(pSeek != NULL) pSeek->Release();
if(pMediaControl != NULL) pMediaControl->Release();
if(pPinIn != NULL) pPinIn->Release();
if(pPinOut != NULL) pPinOut->Release();
CoUninitialize();
-----------------------------------------------------------------------
いろいろ試行錯誤していたので少し読みにくくてもうしわけありません。
CLSID id;
pAVIMux->GetClassID(&id);
CoCreateInstance(id, NULL, CLSCTX_INPROC, IID_IConfigAviMux, (void **)&pConfMux);
pAVIMux->QueryInterface(IID_IConfigAviMux, (void**)&pConfMux);
pConfMux->QueryInterface(IID_IConfigAviMux, (void **)&pAVIMux);
の辺りを主にいじっていました(コードを実行する場所をかえたりなども)
>>98-102 WMV: 各サンプルにタイムコードあり
AVI: 各サンプルにタイムコードなし
とかこのあたりの問題はOK?
AVI→mp4の変換がうまくいかなかずに調べていて自分で出力済みのAVIを
いじるのは無理と判断しまして、Directshowで出力前設定をいじれば勝手に
それをはさんでくれるのではないかと思いまして(Grapheditではうまくいったので)
動画関係をいじりはじめたのがつい最近なので色々調べはしましたが
細かいところはよくわかっていないと思います
「AVI→mp4の変換がうまくいかなかずに」
↓
「AVI→mp4の変換がうまくいかずに」
が誤字なのとそのあとの調べたものを書きそこねました
自分で無理だと判断↓原因がタイムコードです
GraphEditではどんなフィルタ構成になった?
>>97 ソースをWEBカメラになるように明示的に指定すればいいんじゃね?
>107
そういうのって、どこかで指定できましたっけ?
接続してるカメラを列挙してるから
カメラ以外は入ってこないと思ってたんですが。
なんかフレームの持続時間が意識されていないような気がするけどどうだろう。
>>103氏の懸念していることに近いけど。
入力のWMVと出力されたAVIの総フレーム数は一致しているだろうか。
また、それぞれのフレームレートはどうなっているのかな?
その辺の具体的な数値があった方が状況を確認しやすいと思う。
110 :
98:2006/12/12(火) 10:44:27
GraphEditでは
WMVファイル →WMAudioDecoderDMO →AVIMux →FileWriter
→WMVideoDecoderDMO →AVIDecompresser→
となっています
変換結果は
フレームレートは両方30fpsなのですが、
出力されたAVIのフレーム数は1723です(WMVのほうは調べ方がちょっとわからなかったです)
再生時間がWMV時点で28.7秒でAVIにすると57.4秒で丁度綺麗に2倍になる感じです
フレームの持続時間のほうはフレームレートの調整程度しか意識していませんでしたので
また少し自分でも調べてみようと思います。
111 :
98:2006/12/12(火) 10:55:08
出力済みAVIファイルは下のようにヘッダを書き換えればAVI状態ではうまく再生できたのですが
mp4に変換するとファイルによって色々な症状がでて3個ほどサンプルを試した内では
ひとつもまともに再生できませんでした。
dwAudioTime = (double)dwAudioLength * dwAudioScale / dwAudioRate;
dwMicroSecPerFrame = dwAudioTime / dwVideoLength * 1000000.0+0.5;
dwVideoRate = 1000000L;
dwVideoScale = dwMicroSecPerFrame;
112 :
98:2006/12/12(火) 11:05:27
3連続で書いてすいません。
書き換えた部分はstrhヘッダ(ストリームタイプがvids)の
rateとscale、avihヘッダのmicrosecperframeです
>>110 >フレームレートは両方30fpsなのですが、 出力されたAVIのフレーム数は1723です
30fpsで1723フレームなら、57秒ちょっとで合ってるじゃないですか。
GraphEdit で WMV ファイルを再生して、ビデオレンダラのプロパティで再生フレーム数を見れば
おおむねのフレーム数がわかると思います。それでフレーム数を確認してみてください。
それから、WMV はフレーム毎にタイムスタンプが付いていますから(≒フレームの時間的間隔が
一定ではない)、デコードして AVIMux で結合という簡単な処理では決して正しい AVI ファイルは
出来ないということも理解する必要があります。
114 :
98:2006/12/12(火) 13:05:01
指示いただいた通りGraphEditでフレーム数確認したところ861フレームでした
WMV(変換元ファイル)のほうは28秒ちょっとなので57秒でフレームが丁度2倍になっている感じですね
>それから、WMV はフレーム毎にタイムスタンプが付いていますから(≒フレームの時間的間隔が
>一定ではない)、デコードして AVIMux で結合という簡単な処理では決して正しい AVI ファイルは
>出来ない
やはりちょっとヘッダー部などをいじった程度だと無理でしたか
Directshowのフィルターがその辺の処理をやってくれるのではないかと
甘く見ていました
115 :
98:2006/12/12(火) 13:17:20
あと、AVIDecompressorのあとにビデオレンダラにつなげるとその時点では
まともに再生されるのですが、AVIMuxでファイル保存できるようにするときに
タイムスタンプが抜かれてしまうのでしょうか?
>>115 AVI 形式のファイルは、メディアフォーマットで指定された同一持続時間の
サンプルがずらーっと並ぶだけというようなフォーマット。
なので正しいフレームレートでかつ1フレームの欠落もないデータじゃないと
正常に再生できない。
変換元ファイルを走査して、真のフレームレートを計算してWMV側で落ちている
フレームも捏造して自分でmuxするとかやり方はあるような気がするけれども、
絵と音がずれないAVIファイルを作るのはとても難しいです。
117 :
98:2006/12/12(火) 19:17:37
やはり、自分でやるしかないとなると相当むずかしいみたいですね
とりあえずWMVファイルを調べてその最小公倍数分のフレームレートをAVIファイルに設定、
フレームの余計な部分に空フレーム挿入などで試してみようと思います。
途中で挫けそうですが、もしうまくいったら報告だけでもさせていただきます。
…WMVとかに使っているコーデックで圧縮かかってるとその別ソフトが読み込んでくれないから大変です...orz
色々教えていただいてありがとうございました。
118 :
デフォルトの名無しさん:2006/12/21(木) 21:42:10
ボコノン教授
どこみても質問に回答してる。
ネ申ですか?それともM$の中の人ですか?
教徒だろw
>>119 教徒と言う事は宗教団体さんみたいなもんなんすね。
DirectShow究めるためにボコノン教に入ってみたいかも
121 :
デフォルトの名無しさん:2006/12/23(土) 17:14:46
パーサー(スプリッタ)フィルタを自作したいのですが、
参考になるサンプルなどありますか?
情報が少なくて困っています。
変換フィルタはいくつか作成したことがあります。
YUY2の16bit列をRGB16bit列に変換したいのですが、便利な関数またはフィルタありませんか?
>>121 ソースがプルなのかプッシュなのかによりスプリッタの挙動が大きく異なるわさ
プッシュなら来たサンプルバラして後方にポンポコ投げろや
プルなら入力ピン繋がった時点でソース先読みして各種情報提供してやるとか色々とアレ
年末ゆえ酒飲んでて上手く得ないけど、まあ察しろ
出力ピンに関してはINFTeeのサンプルが参考になるよ
>>122 変換式ならググればゴロゴロみつかるし、後は自分でやってもたいしたことないだろ がんばれー
上手く得ないけど → 上手く言えない タイプミスうぜー
125 :
デフォルトの名無しさん:2006/12/27(水) 20:37:01
>>123 変換を自作したがいちピクセル単位でやると遅くてつかいものにならんかったよ。
そこで私は
趣味→オーブンしーぶい(ただだけど配布できない)仕事→あいぴーぴー(よっしゃでかえるレベル)
を使った。一個関数呼ぶだけだった
126 :
122:2006/12/28(木) 02:18:06
>>123 変換式は見つかりました。でもSSE命令とか使いたいところです。
アセンブラ画像処理プログラミング って本買ってきたので頑張ります
>>125 OpenCVやIPPの場合、どんな関数使えばいいですか?
正にIplImageが欲しいです
127 :
122:2006/12/28(木) 02:23:55
128 :
122:2006/12/28(木) 02:57:28
IPPの関数は見つかりました。しかしOpenCVのcvHoughLines2が使いたいので
OpenCVで変換する関数を是非教えて下さい
129 :
122:2006/12/28(木) 09:22:06
>>123 アドバイスありがとうございます。
ソースフィルタはFile Source(Async)です。
とりあえず、空の変換フィルタ(CTransformFilter)を作成し、
ソース→空フィルタと接続して解析しようと思ったのですが、
「同じトランスポートをサポートしていない為、ピンを接続できません。0x80040266」
というエラーが起こり、接続することすらできません…
130 :
121:2006/12/28(木) 09:23:06
↑121でした。
>>129 FileSource にTransformFilterがそのまま接続可能(かも)と思う時点で
知識が少なすぎて説明とか不可能なレベル。
SDK の DirectShow のドキュメントを先頭からちゃんと読むべし
(大した分量じゃないでそ)。
132 :
デフォルトの名無しさん:2006/12/30(土) 08:42:31
#define D3D_DEBUG_INFO
が定義されているとムービー再生時に
VMR9のRenderlessが無視されてActiveMovie Windowが
ポップアップで出てくるんだけど、これ抑制させる方法ないでしょうか?
どこの何の話?
134 :
デフォルトの名無しさん:2007/01/05(金) 01:08:09
お、スレッド落ちてたの直ったのか。
>>127>>128 オープンしーぶいの話し少し待ってもらってもいいか?
仕事始まれば家に帰るからさ
ライセンスの話は多分私が間違えていると思う。
ただインターネットの書き込みで気になるのがあった
それを張り付けますよ〜。
落ちてたんじゃなくてサーバ移転しただけじゃないのかな
136 :
デフォルトの名無しさん:2007/01/09(火) 19:46:03
かなり前にインスコ済みなんだが
December 2006 DirectX SDK
DirectShow関係で何か変わってます?
139 :
デフォルトの名無しさん:2007/01/10(水) 00:15:22
VMRってWin2KではDirectX9.0およびビデオカードがサポートしていればサポートするよ、
見たいな事言ってるけど実際Win2Kではどうですか?
ぶっちゃけウインドレスモードが欲しいだけなんですが。
オーバーレイとかDirect3Dで描画なんたらとかじゃなく
140 :
デフォルトの名無しさん:2007/01/10(水) 07:56:14
【ネガティブ派遣根性チェック】
3つ以上、思い当たる点があればアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。
□派遣先の社員の意見にはたとえ間違っていても反対しない
□派遣先から「いつまでもここで仕事してくださいね」と言われるようになりたい
□自社に仕事を持ち帰れるように言われるとムカつく
□自社で仕事なんてできるわけがない
□派遣/受託の差異を指摘する人間はムカつく
□派遣先には仕事だけでなく自分のプライベートについても指示して欲しい
□自分の月額金額を知らない
□派遣先社員より自分の生涯収入が低いのは当然だ
□派遣先に尻尾を振り、いつまでも一緒に仕事をすることが大切だ
□今のプロジェクトが終わっても同じ派遣先に常駐したい
141 :
デフォルトの名無しさん:2007/01/12(金) 02:18:08
ネガティブ派遣社員(σ´Д`)σゲッツ!!
正社員なんだが仕事の為なら派遣さんにも尻尾ふりますよ。寧ろ俺が最下層。
OctoberではVC6のサポートしていたんだが、December 2006 DirectX SDK は打ち切ったようだね。
「.dws」と言うプロジェクトファイルがなくなっとる
142 :
デフォルトの名無しさん:2007/01/12(金) 02:48:15
正社員は「自分の仕事のため」に尻尾ふり
派遣は「切られないため」に尻尾ふり
143 :
デフォルトの名無しさん:2007/01/15(月) 03:19:51
>>143 GetMediaType で解像度入れたメディアタイプを返せばいいんじゃない?
145 :
デフォルトの名無しさん:2007/01/15(月) 16:31:10
>>144 回答ありがとうございます。
そのあたりを嗜好錯誤してかつできませんでした。
解像度を返すにはCMediaType->Formatのポインタが必要ですがそこが
空になっているんです。
>>145 それは当たり前でソ。フォーマットタイプによってpbFormatの先の構造体のサイズは変化するんだから、
事前にアロケートしてもらうのは無理。
>>145が自分で SetFormat & SetFormatType してあげないと。
147 :
デフォルトの名無しさん:2007/01/15(月) 17:15:08
>>146 できました。
優先的に上流フィルタの解像度を選んでくれるようになりました。
Direct3D9+VMR9 Renderlessモードでビデオ画像を表示しているのですが
60fpsで描画すると(SetTexture→DrawPrimitiveUP→Present)
フルスクリーンモードでDirectShowが固まってしまいます。(デコードが停止)
同じような問題に遭った方いらっしゃいますか?
フルスクリーンでもビデオに合わせて30fps程度に落としたり
(ソースは典型的な29.97fps)、ウィンドウモードにすると問題は無いんですけども・・・。
VGAは NVIDIA GeForce4MX , DirectX9 2006-feb
ドライバは ForceWare 93.71 (2006年11月2日) WHQL認定 です。
RenderFileでディスク上のmp3が鳴らせる、というとこまでわかりました。
メモリ上のmp3を鳴らす場合、ソースフィルタをどうにかこうにか、
と言うことのようですが、それ以降さっぱりわかりません。
なにかいいサンプルがあったら教えてください。
>>149 C:\Program Files\Microsoft Platform SDK\Samples\Multimedia\DirectShow\Filters\Async\MemFile
と、よく知らないのに返答してみる・・・
>>149 まず標準的なPCにプレインストールされているMP3デコーダフィルタがある、と仮定すると
それが何なのかGraphEdtで調べる。
次にそのMP3デコードフィルタとつながるソースフィルタを自作する。
そしてソースフィルタがそのMP3デコーダフィルタに対してどのようなメディアタイプで接続できるのか調べる。
メディアタイプがわかったらそのメディアタイプにあった形式に、メモリ上のデータとやらを加工してMP3デコーダに渡す。
フィルタ作ったことが無いなら相当大変だよ。
152 :
149:2007/01/19(金) 03:05:59
レスありがとうございます。
サンプルも151もまるで理解できないのでとりあえずDirectShowを1から勉強してます。
最終的にどういう条件で何がしたいのかを書いたほうがいいかもよ。
他の選択肢があるかもしれんし。。。
154 :
デフォルトの名無しさん:2007/01/19(金) 23:55:04
MPEG3Layer-3デコーダ
これが標準にインストールされてるデコーダだよ。
このデコーダ通ったストリームがWAVEファイルみたいな生な音声ファイルになってるからそこに変換フィルタを自作してやればいいよ。
意外と簡単にいけるかもしれん…
155 :
デフォルトの名無しさん:2007/01/24(水) 10:52:40
ttp://mobiquitous.com/programming/usbcamera.html この↑ページをみながらDirectShowLibを使ってC#で
USBのマイク&カメラ(LogicoolのQcam10.0)からの入力をCaptureGraphBuilderを使って
MuxAVI経由でAVIファイルとして保存しているのですが、
フィルタグラフマネジャIGraphBuilderのRun(),Stop()およびIFileSinkFIlterのSetFileName()を使って、
Run 5秒間保存 Stop 保存先変更 Run 5秒間保存 Stop 保存先変更・・・
と繰り返すと、できあがったファイルは
1つ目、所望のものが得られた
2つ目、映像が〜5秒フリーズして5秒後から再生される。音声は再生直後から5秒までにちゃんと入っている
3つ目、映像が〜10秒フリーズして再生される。音声は同上
のようになっていて、どうもVideoのほうの時間がおかしいのですが、
そこをうまく扱えるような方法があったら教えてください。
156 :
デフォルトの名無しさん:2007/01/24(水) 12:34:32
それQCAMのバグだと思ってる。
厳密に言うとMediatimeの初期化をしてくれてないからそうなる。
カメラの後に「Smart Tee」繋いで、さらにフレビューピンに繋いだら?
157 :
155:2007/01/24(水) 17:57:20
ありがとうございます!
とりあえずそれでやってみます!
158 :
155:2007/01/24(水) 20:43:33
GraphEditでも再現できる現象だと(いまさらながら)わかったのですが、
>>156さんの
>>カメラの後に「Smart Tee」繋いで、さらにフレビューピンに繋いだら?
のおっしゃるように
VideoSource->SmartTee->PreviewPin->AviMux->FileWriter
とつないだら、Runできずに
The graph could not change the state.
タイムスタンプがこのサンプルに設定されていません。(Return code:0x80040249)
と出て行き詰まっています。
知識不足でお聞きしたいのですが、
タイムスタンプがないのはバグなのでしょうか、
それとも当然の動きで設定になにか必要なのでしょうか・・?
もともと連続でファイルを区切って数秒間の音声付き映像をキャプチャできれば違う方法でもよく、
いちいちGraphBuilderを解放してまた作るとうまくいくことはいくんですが、
それでは解放と作成に時間がかかるのでもっと早くできる方法を探していて
上記155みたいな試行錯誤してます。
>>158 previewピンからの出力にはタイムスタンプがつかないのがDirectShowのお約束です。
>いちいちGraphBuilderを解放してまた作るとうまくいくことはいくんですが、
QCAMのフィルタだけDisconnectして取り除いて作り直して挿入して接続するとか。
160 :
デフォルトの名無しさん:2007/01/24(水) 20:58:38
そうそう。そのタイムスタンプを付けないのがプレビユーピンなんだ。
で、なんでそうしろといったかと言うと
キャプチャピンとプレビューピン両方にレンダラ繋いで再生→停止を繰り替えすとわかる。
キャプチャピンに繋いだ方は画像が流れて来なくなる以前に5秒再生してたら5秒間固まる。
これはQCAMがタイムスタンプを初期化してないからだと思う。
多分自分でスタンプ情報作ってやればよかったと思うけどソースが会社なんだ…
コンブライアンスが厳しい
161 :
155:2007/01/24(水) 22:07:33
>>159,
>>160 ご返答ありがとうございます。
なるほど。
タイムスタンプが設定されていません。はPreviewPinより下流のFilterが発していたことがわかっていませんでした。(恐らくFileWriter?)
>キャプチャピンに繋いだ方は画像が流れて来なくなる以前に5秒再生してたら5秒間固まる。
まさにそのとおりです。
>多分自分でスタンプ情報作ってやればよかったと思うけどソースが会社なんだ…
>コンブライアンスが厳しい
っということは諦めるかタイムスタンプを自分で打つfilterを作るかでしょうか・・キビシイですね
とりあえず
>>159さんの
>QCAMのフィルタだけDisconnectして取り除いて作り直して挿入して接続するとか。
をやってみます。
外で携帯打つと手がかじかんでまともに文入力できてないな俺w
フレビューピン、コンブライアンスワラタ
163 :
155:2007/01/25(木) 08:21:37
現在、問題がどういうわけか再現しなくなって直ってしまったので嬉しいような複雑な気分です。
たぶん(としかいえないのがつらいのですが)Qcam10.5をインストールした後に直ったと思われるので、
Qcam側の原因が自動的に解決されたのだろうと解釈しています・・
いろいろと本当にありがとうございました。
164 :
155:2007/01/25(木) 08:23:22
165 :
162:2007/01/25(木) 18:45:16
最新のカメラドライバを入れる事でこの問題が解決されるのですね。
どうもありがとう。自分も試してみますm(__)m
DirectSHOWと直接は関係ない質問かと思いますが、教えてください。
変換フィルタにてRGB24ビットのIMediasampleを扱っているのですが、
カメラから入ってきた画像に線を書いてレンダラに渡したいと思ってます。
DIB形式のBMP画像に直接線を描く関数を探しております。
なにが難しいと思っているかというと、デバイスコンテキストが得られない事で、「LineTo」などを代表するWinAPIが使えない事です。
みなさんはどのように画像の加工をしているのでしょうか?
やっぱりオーバーレイとかですか?
生のRGBデータ配列を渡してHBITMAPを返すようなWin32APIがあったはず。
それをメモリデバイスコンテキストでセレクトしてやればGDIで描画できるんじゃないかな。
>>167 ありがとうございます。
http://www.greenwood.co.jp/~k-aki/pc/directshow_movie/directshow_movie.html#h-7 ↑このページのレンダラ処理に
>>167さんのおっしゃるようなことが書いてあったため
試して見ます
ちなみにこんなソース
// ビデオ ヘッダーへのポインタを獲得する。
const VIDEOINFOHEADER *pVideoHeader
= (const VIDEOINFOHEADER *)pMediaType->pbFormat;
// ビデオ ヘッダーには、ビットマップ情報が含まれる。
// ビットマップ情報を BITMAPINFO 構造体にコピーする。
ZeroMemory(&m_bitmapInfo, sizeof(m_bitmapInfo));
CopyMemory(&m_bitmapInfo.bmiHeader
, &(pVideoHeader->bmiHeader)
, sizeof(BITMAPINFOHEADER));
// ビットマップ ヘッダーから DIB を作成し、バッファへのポインタを獲得する。
HBITMAP hBitmap
= CreateDIBSection(0, &m_bitmapInfo, DIB_RGB_COLORS, &m_buffer, NULL, 0);
if(hBitmap){
m_hdc = CreateCompatibleDC(NULL);
SelectObject(m_hdc, hBitmap);
169 :
デフォルトの名無しさん:2007/02/05(月) 11:52:49
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/directx9_c/directx/htm/creatinganaudiocapturegraph.asp ここを参考に、DirectShowLib + C#で、
waveレンダラを
マイク--> tee --> スピーカ(default audio renderer)
--> wavDest(wavFilter) --> file writer(sinkFilter)
なる構成で作ろうとしています。(GraphEditではできました。)
上記URLによるとcaptureGraphBuilderが使えないので、FindPinとフィルタグラフマネジャのconnectを使って
つなげていこうとしています。
しかし、実行時に、各Filterを作ってAddFilterをした後に、つなげる段階でエラーが出てしまいます。
エラーの出る場所
//wavDest(wavFilter) --> file Writer(sinkFilter)
wavFilter.FindPin("Out", out outPin);
sinkFilter.FindPin("in", out inPin);
graphBuilder.Connect(outPin, inPin);//ここでエラー0x80040217
他のフィルターの結合はすべてGraphEditによるデバッグ(?)で確認しましたが、
最後のファイル書き込み部分がつながりません。
なにかヒントをいただけたらよいのですがどうでしょうか・・
170 :
169:2007/02/05(月) 11:53:51
ちなみに
wavFilterは
Guid id = new Guid("3C78B8E2-6C4D-11D1-ADE2-0000F8754B99");
Type comType = Type.GetTypeFromCLSID(id);
object comObject = Activator.CreateInstance(comType);
wavFilter = (IBaseFilter) comObject;
sinkFIlterは
sinkFilter = (IBaseFilter)new FileWriter();
sinkSetFilter = (IFileSinkFilter) sinkFilter;
AMMediaType mediaInfo = new AMMediaType();
mediaInfo.majorType = MediaType.Audio;
mediaInfo.subType = MediaSubType.PCM;
sinkSetFilter.SetFileName(sinkFileName, mediaInfo);
こんな感じでやっております。
171 :
169:2007/02/05(月) 21:45:12
自己レスです。
sinkSetFilter.SetFileName(sinkFileName, null);
にしたらできました。
なんでやろ
DirectShowのフィルタプロジェクトを作成できるアドインか何か、
むかしここかどこかに貼ってあった気がするんだけど、
誰か知りませんか?
173 :
デフォルトの名無しさん:2007/02/07(水) 12:21:04
>>172 「拡張ストアド プロシージャーDLL」
これで作っちゃだめなの?
自分はいつもこれで作って、
〇「proc.c」を削除
〇「stdafx.c」にStreamヘッダを追加
〇追加インクルード
〇モジュール定義
〇ライブラリ追加
をしていた。これがめんどいです?
>>69 有り難うございます。
あちらで聞いた方が良かったですか。でも、今から同種の質問を飛ばすとマルチですし。
やはり、October 2004かsummer 2003ですか。試してみます。
私もVC6やめたいところですが、色々としがらみと要望がありまして。
未だにVC6の需要があるので困ります。
175 :
174:2007/02/07(水) 13:30:27
すみません、DirectX初心者質問スレ宛を誤爆しました。
>>173 ありがとうございます。めんどいとかじゃなくて
そのやり方を知りませんでした。
参考になりました。
と思ったけど、2005には拡張ストアド〜がありませんでした。
Sampleを改造することにします。
179 :
デフォルトの名無しさん:2007/02/07(水) 19:02:10
え〜2005無料版でもほとんど一緒なのあるよ
ぶっちゃけDLL作るプロジェクトならなんでも可
まぁ結局新規プロジェクトでフィルタ作れるようになってもサンプル改造に落ち着くんだけど
180 :
デフォルトの名無しさん:2007/02/08(木) 08:58:22
DirectShow使う開発で一番多く使われているプログラム言語ってVC2003かな?
VC6…DirectXサポート切れていて最新の盛り込みできない
VC2005無料版…リソースエディタがないため扱いづらい
VC2005…普及してる?
C#…これ自体存在が微妙
VB…本格的にやるには不向き
他…資料がなさすぎね??
>>180 VC2005無料版はいろいろ難関がありそうだよね。
ただVC2003のプロジェクト(非DirectShow)をコンバートしただけなのに
PlatformSDKのセッティングとか初めてだと面食らう。
なぜかウチの環境だとPlatformSDKのツリーがVc7の下にあって・・・。
近いうちにVC2005導入予定だけど、普及の問題は別として開発しやすいのかな?
182 :
デフォルトの名無しさん:2007/02/09(金) 00:09:39
プログラムからビデオキャプチャを行わせることに挑戦しています。
プレビューで使われる画像サイズやフレームレートをプログラムから
指定する方法は無いでしょうか。
IVideoWindow等でウィンドウを小さくする等だと転送するデータは変わらないので
負荷が下がらないと思うので駄目だと思います。それとも変わるのでしょうか。
IPropertySetStorageで色々設定できるダイアログが表示されるが
これって使う人の立場で考えると
製品によってダイアログが違うので説明が大変だし
変にいじって品質を落としたりする可能性があって嫌なんだが
これしかないのでしょうか。
>>182 自分でカメラの出力pinに対して要求だせばいいよ
MSDNのヘルプみるよろし
>>183 プレビューが
[キャプチャ]->[レンダラ]
という接続なので要求の出し方わかりません
185 :
183:2007/02/09(金) 08:20:34
×カメラ
〇キャプチャー
でした。誤解させてしまったかもしれませんすみません。
で、キャプチャのピンのプロパティーページにて解像度やフレームレートをかえられるのであれば
そのピンに対して「EnumMediaType」、メディアタイプの列挙型を受けとればよいです。
列挙型のなかにピン接続したいタイプがあれば接続させます。
私はフィルタ内制作ばかりやっているのでフィルタグラフ用の具体的な関数名までわかりませんが、「Free Mail」と言うSNSサイトにくれば過去ログに貴方と同じ質問の回答があります
私は流れ設定です
188 :
デフォルトの名無しさん:2007/02/09(金) 19:51:15
流れ設定ってなんですか?
IAMNewAboutDirectShow
190 :
デフォルトの名無しさん:2007/02/11(日) 02:17:48
YUVで映像が流れてるとき「IMediaSample」には
どんな形で入ってるんですか?
RGBTRIPLEしか構造体ワカランス(´・ω・`)
YUVにも色々あるわけだが
192 :
デフォルトの名無しさん:2007/02/12(月) 00:04:10
>>191 はい。IYUV、I420の2つでお願いします。
どちらもU値とV値が四分の一に圧縮されていてMediaSubTypeは違っていても中身は同じフォーマットだと思います。
質問の意味が良くわからないが、IMediaSampleからデータにアクセスするには
IMediaSample::GetPointer(), IMediaSample::GetActualDataLength()というメンバ関数を通してバッファにアクセスできる。
ただし幅や高さなどの情報はAM_MEDIA_TYPEという構造体に収められていて、
これはIMediaSampleからは限定的な用途でしか取得できない。
その用途とはメディアタイプがダイナミックに変化したことをダウンストリームに伝えるという用途である。
そのため、IMediaSampleにはGetMediaTypeという気の利いた名前のメンバ関数があるが、
この関数を通してAM_MEDIA_TYPEが取得できるのはメディアタイプがダイナミックに変化した瞬間だけであり、
取得できるのは変化した後のメディアタイプである。
常に今流れているサンプルのAM_MEDIA_TYPEが取得することはできない。
>>192 ネットで調べたところ、どうやらプレーンぽいなあ。
最初にYプレーン
次に縦横がそれぞれ1/2に縮小されたU
次に縦横がそれぞれ1/2に縮小されたV
となっているようです。
MSDNのドキュメントに普通にある
SONYが設備投資を縮小だってね。
なにやってるんだかよくわからんよ。
このままだとVAIO部門も潰されるんじゃないか?
潰されたとしてNECあたりが買い取ってくれるといいけどね。
197 :
デフォルトの名無しさん:2007/02/14(水) 22:02:18
>>196 誤爆(^ω^)おつ
>>190なんですがMSDNと睨めっこしてたけどまだワカランス
>>193の内容は理解出来てるんだけどプレーンがわからんのだな。GetPointer()で映像の画素情報にアクセスできるんだけどプレーンってどうアクセスするの(`・ω・´)??
>>194 そう自分もググッたんでそれは大丈夫。IYUVは一画素にYに8bit、UVに2bitの計12bit使うほーまっと
>>197 LPBYTE 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と言ってるだけ。
>>198 ありがとう了解それがわからんかったです。
200 :
194:2007/02/15(木) 08:07:41
>>197 なんだよプレーンの意味がわかってないのかよ
うん。ビットマップみたいにピクセル毎に並んでるかと思ってた。
DMOというのでフィルタを既に作ったんだけどさ
これって何かいまいちだね。
データを得られればとりあえずはいいので
サンプルグラバっていうのを使ったほうが簡単だったみたい。
でも微妙な動作が違うような。
まあ、既にリリースもしたし、いまさら作り直して挙動が変わるのは困るので
このまま突き進むしかない。
DMOだとピン接続決定とか切断とかわからないみたいだね。
ピン接続できるかの問い合わせがあるけど、
これにOkで答えてもその後同じ条件でまたピン接続できるか問い合わせがある。
接続したとか接続してないとかないみたい。
データの出力が能動的じゃなくて受動的なのもなんか作りにくいな。
DirectShowって難しい。
DMOだけどさ
カテゴリにオーディオエンコーダってのを指定しているんだけど
接続できるか問い合わせされるときビデオ関係が含まれていやがんの。
別に問題ないけどさ。
サンプルグラバを使う道もそれなりに険しいと思うよ。
>>186 これでサイズ指定が出来ました。
使えないフォーマットがあるし
RGB555とかYUY2とかはどれ選んでいいのか(負荷の一番低いもの)わからないので
とりあえず設定ファイルに入れて変更可能にしといた。
プレビューがデフォルトで640x480になって高負荷になり
画像サイズ変更はプレビュー(レンダラ接続)前じゃないと変更できない
という不便さから解放されました。
206です。いろいろと検索しております。
ttp://homepage1.nifty.com/MADIA/vc/vc_bbs/200307_03070013.html こちらにネットワークカメラについての制御の仕方について
少し書いてありました。
USBカメラのように一律なプログラムでなくて、
ネットワークカメラごとに、プログラムを変えないといけないのでしょうか。
なにを考えていけば、わからないのですが。
・ネットワークカメラごとのマニュアルを読んで、HTTPでネットワークカメラに
接続、画像を取り込む
・そのあとは、USBカメラと処理が同じ
こんな感じなのでしょうか?
具体的なコードはまだわからないのですが、方針として
ネットワークカメラの制御が、HTTPだけですむなら、
USBカメラのプログラムで、画像を渡す部分だけ、
改造すれば大丈夫でしょうか。
スレ違いでしたら、誘導していただけますと助かります。
よろしくお願いします。
特殊なカメラ(業務向けの何十万もするような奴)で遠隔地で画像を取ってネットワークにストリームしてくれるカメラならあると思う。
そういう場合、そのカメラを操作するにはそのメーカーが提供するライブラリを使うことになるだろうね。
映像を受ける側はカメラ用のフィルタグラフではなくネットワークからのストリームを受信するような感じになると思う。
>>208 お返事ありがとうございます。
livecaptureっていうフリーのすごいソフトありますが、
どうやって複数のネットワークカメラに、対応しているのか疑問でしたが、
メーカーさんが公開しているマニュアルを見て、プログラミングしてるのかもしれないですね。
通信の仕方をメーカーさんが、公開してないとだめなんですね。ふむふむ。。
専用のカメラを使ってるね。その手のカメラは買えば当然遠隔操作のコマンドとかマニュアルが付いてくるはず。
>>210 >当然遠隔操作のコマンド
付いてくるけど画像ストリームの仕様は無いのよ
とりあえずメーカーに問い合わせてみる
っ自分で解析
キャプチャデバイスのプロパティへアクセスするにはIAMVideoProcAmpや
IAMCameraControlがありますが、これらでサポートされていないパラメータへ
アクセスする方法はありますか?
具体的には、USB Video Classのサポートで追加された、
KSPROPERTY_VIDEOPROCAMP_DIGITAL_MULTIPLIER
KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE_COMPONENT
辺りへアクセスしたいんですが。(対象デバイスがそれらのプロパティをサポート
してるのは確認しています)
axextend.idlやstrmif.hのenumにはidが定義されていないし、WHITEBALANCE_COMPONENTの
NODE_S2タイプのアクセス関数(パラメータが2個あるタイプ)もヘッダに見つかりません。
これはカスタムで書くしかないんでしょうか。
IKsPropertyとかなんかそんな名前のインタフェイスで出来ると思う。
キャプチャボードからの映像信号に処理を加えて、それを表示するプログラムを作りたいと思い、
DirectShowの勉強を始めました。
一通り調べた結果、以下の事を勉強する必要があると思いましたが、他にも「これ知っとけ」
みたいなことがあったら教えてください。
〜既にある知識〜
C、Win32API、grapheditの扱い
〜これから学ぶべきと思うこと〜
C++、COM、自作フィルタの作成と登録の方法
216 :
デフォルトの名無しさん:2007/03/01(木) 07:21:37
俺も似たような事やってる…
概念理解が勉強の中心になると思う。ガンガレ〜
既に知ってるとは思うが、「BMP構造」を理解しておくとよいよ。
基本はBMP画像のぱらぱら漫画を加工する事になりますので。
217 :
215:2007/03/01(木) 14:07:11
>>216 ありがとうございます。
BMPについてはWin32APIでいじり倒してきたのでいけると思います。
DirectShowについてはその仕様と情報の少なさに辟易していますが、
地道にがんばろうと思います。
>>215 学ぶべきことがわかってるのはすばらしい!
ただし、下手に段階踏むと挫折しかねないので、
とりあえずサンプルコードからはじめるといいと思う。
「これで動くけど、なんでだろー?」って形で勉強するといいかも。
219 :
デフォルトの名無しさん:2007/03/01(木) 21:52:11
簡単なサンプル作ってあげよか?インプレイスフィルタとトランスフォームどっちの変換フィルタ使ったらいいか調べるだけでも最初は一苦労だろ
SDKのサンプルが一番いいよ
221 :
デフォルトの名無しさん:2007/03/01(木) 22:44:15
そりゃサンプルで自分も勉強したけど、映像の処理なら「コントラスト」、「RGB」この2つから入ると思う。
この2つを最初にみたとき何が最低限実装が必要なメソッドかわからんかった。
そんな意味でのもっとシンプルなサンプル
222 :
215:2007/03/01(木) 23:19:46
>>218 ありがとうございます。
そうすることにします。
>>219 助かります!
是非お願いします!
223 :
デフォルトの名無しさん:2007/03/02(金) 00:06:52
>>222 ひとまず、君の使ってる環境を教えてくれ。
自分はVC6+DX8SDK、VC2003+DX9(オウガスト)
の2つの環境でやっとる
224 :
215:2007/03/02(金) 00:12:39
>>223 了解です。
VC++2005Express + PlatformSDK + DirectX SDK (June 2006)
226 :
デフォルトの名無しさん:2007/03/02(金) 02:37:07
>>255 わかったよ。確かにそれみりゃわかるね。
甘やかすのは無用。勉強させろと無言のプレッシャーを感じる…。
227 :
215:2007/03/02(金) 03:03:29
>>225 二つ目のサイト以外は既に目を通したものばかりですが、それでも難しいと思いました。
キャプチャの出力解像度を変えることすらできませんでした・・・。
とりあえずC++から地道にべんきょーします。
あとアセンブラの知識が必要になることもあるな
マジすか?アセンブラワカンネ。
そしてここはsage進行なんですね。マイナーだからageてました
DirectShowの本見ると「この本はC++を3年以上やってる方を対象に書いてます」みたいな事が書いてありますね。
C++経験者でないときついのか。
>>227 入門や概説を一通り読んだら、リファレンスを全部読むのを薦めます。
232 :
213:2007/03/02(金) 21:13:20
>>214 色々調べて試したみたところ、IKsPropertySetが使えそうなのは判りました。
ただ、これでVideoProcAmpのプロパティへアクセスしてみたところ、
旧来のKSPROPERTY_VIDEOPROCAMP_BRIGHTNESSのようなFilterベースの
プロパティアクセスをサポートしているものはうまく動作しますが、
KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE_COMPONENTのような
ノードベースのアクセスしかサポートされていないパラメータへはアクセス出来ないようです。
入力インスタンス構造体のFlagsにKSPROPERTY_TYPE_TOPOLOGYをつけて
Get()を使ってみてますが、正常終了するものの中身が0です。
旧来のパラメータもノードベースでアクセス出来るようなので試したみたところ、
入力インスタンス構造体をノードベース(KSP_NODE)ではなくフィルタベース(KSPROPERTY)で
見ているようです。
どうもIKsPropertySetはフィルタベースのアクセスしかサポートしていないのでは、と
推測してるのですがどうなんでしょうか。
IKsControlを使うべきなのかと思い試してますが、こっちはnot supportedのえらーコードが返ります。
DirectShowは最初わかんないことだらけだったな。
今でもわかんないこと多いけど。
サンプルと手助けがないとつらいね。
>>232 勘で書いてるんだけど、IKsTopologyInfo:, CreateNodeInstanceでノードを作って、
ノードの方から IKsProperty を QueryInterface で取得して、IKsPropertySet::Setで
プロパティをセットするんじゃないだろうか。
>>233 DirectShowは設計がマズイと思う。
フィルタグラフマネージャは自前でスレッドをもってユーザスレッドストリームスレッドとの切り離しをすべきだ。
いつの間にかメインスレッドから呼び出されていたりしてデッドロックとか多い。
>>235 ほんとそのとおりだね。
IBasedPin::Reciver内で別スレッド立ててアロケータ確保すると
うまくやらないとアボーンする。。
237 :
215:2007/03/03(土) 23:03:00
>>231 ありがとうございます。
そうしてみます。
C++の入門書を一通り読みましたが、新しいことがいっぱいで疲れました・・・。
次はMSDNのリファレンスを読みます。
早くキャプチャソフト作りたいです。
>>234 切り離すモードと切り離さないモードがある。
239 :
213:2007/03/05(月) 22:24:32
>>234 DDKやPlatformSDKの情報からみて、まさに指摘されてるようなことなんじゃないかと
思って試してみてますが、IKsTopologyInfo::CreateNodeInstance自体がエラーになるんですよね。
色々調べてみると、どうもWindowsXPでCreateNodeInstance自体が完全にサポート
されていない雰囲気がするのですよ。UVC extensionを調べててこんな情報がありました。
ttp://www.codecomments.com/archive421-2005-11-657282.html 自分のやり方が間違ってるかもとも思うんで、しばらく頭を冷やしてもう一度
試してみるつもりです。
現在、キャプチャカードからのプレビューをモニタするソフトを作っておりまして、
キャプチャ(640×480出力)→ビデオレンダラ
というふうに繋いでいます。
ビデオレンダラでフルスクリーンにすると、4:3のアスペクト比を守りながら拡大してくれるのは
うれしいのですが、16:9ソースの表示にも対応するために、フルスクリーンの状態で
16:9にしたいです。
しかし、どうしてもできません。
描画されるビデオウィンドウはウィンドウズアプリのメインウィンドウに貼り付けているカタチです。
ソースは640×480を保ったまま、16:9にリサイズしてフルスクリーンにしたいです。
ご助言、よろしくお願いします。
>>240 ビデオレンダラーから(フィルタグラフからでもいいのか?)
IVMRAspectRatioControl、IVMRAspectRatioControl9 や IVMRWindowlessControl を取得して、
SetAspectRatioModeでアスペクトレシオを無視するようにする。
レンダラのサイズは自前で16:9にしておく。
242 :
デフォルトの名無しさん:2007/03/05(月) 22:57:06
変換フィルタを作成しているのですが、再生中にいきなりビデオのサイズが変わるような場合に、
再接続することなく対応したいのですが、レンダラへ新しい縦横サイズは教えてやれたのですが、
バッファサイズを変更できませんでした。
マニュアルには現在より大きなバッファサイズが必要な場合は、ReceiveConnectionを使えとありますが、
フィルタのどこにどのようなコードを追加すればよいのか分かりません。
デタラメな文章ですが、アドバイスありますでしょうか。。
243 :
240:2007/03/06(火) 00:47:31
>>241 ありがとうございます!
まずウィンドウレスモードですが、試そうとしたところ、ビデオをウィンドウに転送するところで
強制再起動が掛かかるなど恐ろしいことになってしまったので、ちょっと置いておきます。
ウィンドウモードで作りこんでしまったこともあり、できればこのままで解決したいと思っております。
他の試みとして、IVMRAspectRatioControlをVMR7から呼び出してSetAspectRatioModeで
アスペクト比固定をしないよう設定したのですが、相変わらずアス比固定でフルスクリーン
になりました・・・。
GetAspectRatioModeで確認しましたが、ちゃんとVMR_ARMODE_NONEになっていました。
そこで、grapheditで調べましたところ、
ttp://vista.jeez.jp/img/vi7310912755.jpg 二つあるフルスクリーンボタンのうち、「Set Full Screen」のほうはアス比固定拡大、「Full Screen Window」
のほうは全体に引き伸ばして表示される、という結果になりました。
先に試したプログラムのほうでは、前者のほうになっているのではないかと考えられます。
後者の「Full Screen Window」ボタンを押すことと等価な処理としては何が考えられるでしょうか?
244 :
240:2007/03/06(火) 01:37:56
>>243 古来より DirectShow でフルスクリーン再生をする際には、
レンダラをフルスクリーンモードにするのではなく
単に全画面のウィンドウで再生する方が好しということになっています。
後者はそれでしょう。
246 :
240:2007/03/06(火) 16:27:28
ウィンドウレスモードで解決しました!
>>245 なるほど、そういうことですか。
二つのキャプチャデバイスが接続されているPC上で、ボタンをクリックする度に
IEnumMoniker::Next()を繰り返すことでキャプチャデバイスを切り替えるというプログラムを組んでいます。
デバイスが検出されなくなったら、IEnumMoniker::Reset()をして先頭から数えなおすように
しています。
一回の切り替えを細かく説明すると、
ストリームの停止→キャプチャフィルタの削除→上記メソッドで検出した新たなデバイスをグラフに追加
→ICaptureGraphBuilder2::RenderStream()でグラフをVMR9に直に接続→再生
という流れです。
これに問題がありまして、この切り替えを8回繰り返す(4順する)と必ず画面が最後のフレームを
表示したまま固まってしまいます。
考えられる原因や対処法がありましたら、ご教授お願いします。
どこがデッドロックしているか調べるといい
249 :
213:2007/03/08(木) 03:23:24
USB Video Classキャプチャデバイスのプロパティアクセスについて質問をしていた213です。
問題が度解決できました。この辺を触る人はあまりいなさそうですがご報告だけでも。
結論からいうと、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)で指定しないと駄目な模様です。
250 :
247:2007/03/08(木) 17:52:00
解決しました!
原因は二つ目のキャプチャデバイスをRenderStream()するときのみ、間に色空間変換フィルタが
挿入され、キャプチャフィルタを削除したときに色空間変換フィルタ、VMR9間のピンが持つ
アロケータにバッファがどんどん蓄積されていくためだったようです。
デバイスを切り替える度、VMR9との接続を切るようにすると、うまく動作するようになりました。
フィルタをビルドするためにstrmbasd.libとstrmbase.libが必要なのですが、それを作成するための
ビルドがどうしてもできません。
お持ちの方がおられましたらお譲りください。
お願いします。
アップローダ
ttp://www.rupan.net/uploader/ 環境
WindowsXP SP2
Platform SDK for Windows Server 2003 SP1
Visual Studio 2005 Express Edition
baseclasses.sln をダブルクリックして開いてビルドを実行するだけだろ。
253 :
251:2007/03/09(金) 03:08:44
さすがマイクロソフト
俺の所の 2006 9月版には、baseclasses.slnがあるけどな。
お前の最近は2年前か?
256 :
251:2007/03/09(金) 04:29:10
258 :
251:2007/03/09(金) 07:07:13
259 :
251:2007/03/09(金) 09:44:34
早速、いろいろなフィルタサンプルのビルドを試してみましたが、どれもPC内に存在しない
ライブラリファイルが無い、と言われどうしようもありません。
そういえば、VC2005EEでDirectShowフィルタを開発したという話を聞いたことがありません。
ちゃんとしたVCを買え、ということでFAでしょうか?
もしそうなら、観念して買いに行きます・・・
EEどうかは関係ない気がする、2005だといろいろ不便
いい加減最新のSDKダウンロードしろ。うざい。
>>259 初心者スレにでも行け
DirectShowスレで語るべき内容ではないだろ
どんな内容なら語ってもいいのですか?玄人の
>>262さん。
キャプチャフィルタ→変換フィルタ→色空間変換フィルタ→VMR9
という構成の中の変換フィルタで、キャプチャフィルタからサンプルが1枚くる度に
サンプルに対し処理Aを実行→出力→表示
サンプルに対し処理Bを実行→出力→表示
というように2回の処理、出力を行いたい(フレームレートを倍化したい)のですが、
どうすればよいでしょうか?
なお、キャプチャ出力のフレームレートは上限に設定しています。
タイムスタンプをいじるだけではうまくいきませんでした。
IMemInputPin::Receiveを使うにしても、それを呼び出す頻度をどのようにすれば
合わせられるかが分からずできません。
出力ピンのメディアタイプのレートを2倍に設定して、サンプルを1つ受け取ったら2つ出力すればいいのでは
タイムスタンプは修正してやらないと駄目だろう。
仮にキャプチャフィルタが30f/secで投げてくるなら0.033...秒間隔のスタンプが設定されているだろうから
自分でつくる変換フィルタは2枚目に0.033.../2秒のタイムスタンプを足して設定してやる。
んで自分が出力ピンからDeliverするときに、自分で送りたい2枚分、下段の入力ピンReceiveを呼ぶ。
2回送信完了してから、上段にDeliverの結果を返す。
サイズチェックくらいしろ。
24bit以上のソースなら、BITMAPINFOHEADERだな。
270 :
268:2007/03/10(土) 18:21:52
>>269 つまり、サイズが足りないということでしょうか?
271 :
268:2007/03/10(土) 19:24:59
サンプルファイルを出力したところ、24bitであることは確認しました。
どこが悪いんでしょう?
>>268 これか、
CopyMemory( &BitmapInfo.bmiHeader, &(pVideoHeader->bmiHeader),
sizeof(BITMAPINFOHEADER));
探すの面倒だから直リンして欲しいな。
http://pc11.2ch.net/test/read.cgi/tech/1168354839/658 コピー先と、コピーするサイズとか確認してみれば。
&BitmapInfo.bmiHeader が有効なメモリを指してる?
&(pVideoHeader->bmiHeader) が有効なメモリを指してる?
sizeof(BITMAPINFOHEADER) これはあっていると思うけどさ。
273 :
268:2007/03/10(土) 19:37:59
&BitmapInfo.bmiHeader:1000E380
&(pVideoHeader->bmiHeader):30
むう?
274 :
268:2007/03/10(土) 19:41:33
Bitmapinfoをローカルにすると
&BitmapInfo.bmiHeader:12F044
&(pVideoHeader->bmiHeader):30
&BitmapInfo.bmiHeaderが怪しいですね。
275 :
268:2007/03/10(土) 19:42:42
で、怪しいのはわかったんですが対処方法がわかりませんorz
何かおかしいときはリビルドすると直ったりするんだよ
ヘッダに書いただけで動かなくなるとは思えないしさ!
>>276 もう8回くらいリビルドしてますorz
手動でbmiHeaderを初期化したりしてもダメでした。
初心者スレに戻りなはれ
280 :
268:2007/03/10(土) 20:09:10
そうします。orz
281 :
265:2007/03/10(土) 23:31:42
>>266 その方法を試すために、まず出力ピンのメディアタイプを取得しようとしたのですが、
原因不明のエラーが出ます。
何がまずいのでしょうか?
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 ); ←上と同じエラー
・・・
}
282 :
265:2007/03/10(土) 23:36:19
トランスフォームフィルタのソースがベースクラスとして公開されてるんだから勉強するといいよ
CTransformFilter、CTransformInputPin、CTransformOutputPinね
入力サンプルがどう入ってきてどこで変換してどうやって出て行くのか
更にしたのベースクラスの知識も必要になるだろうけどさ
既に下段に接続してる相手のメディアタイプが欲しいなら
出力ピンのCurrentMediaTypeでいいだろ
>>282 m_pOutput->Deliver するだけでOK
285 :
265:2007/03/11(日) 03:49:55
>>283 ありがとうございます。
m_pOutput->CurrentMediaTypeでメディアタイプを取得し、pbFormat(VIDEOINFOHEADER)内の
AvgTimePerFrameを変更してやることでフレームレートの変更を試みてみました。
しかし、今まで通りの10000000/29.97[100ns]であれば下流のフィルタ(色空間変換フィルタ)に
繋がるのですが、倍の10000000/59.94[100ns]では接続できませんでした。
残念ながら対応していないようです。
286 :
265:2007/03/11(日) 03:50:22
>>284 ありがとうございます。
一枚のサンプルに対し二度出力できるようになりました。
しかし、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 );
>>266 でも書かれているが、GetMediaType時にAvgTimePerFrameの時間を半分にして接続を完了させればいいんでね?
部分的コードなのでわからないが、サンプル使いまわしたりはしていないよね?
288 :
265:2007/03/11(日) 09:37:13
>>287 試しに
AvgTimePerFrame /= 2;
としてみましたが、やはり受け付けませんでした。
AvgTimePerFrame /= 1;
だったら大丈夫です。
>サンプル使いまわしたりはしていないよね?
他の方が作られたサンプルを使いまわししてます。
ですが、Transformメソッドをいじるだけくらいのシンプルな変換フィルタでして、その処理部分に関しては
すべて書き換えています。
タイムスタンプの変更は問題ないです。EndTimeが0で来る場合もあるのでチェックして下さい。
> Transformメソッドをいじるだけくらい
CTransformFilter::Receive内でもDeliverしてるからな。その辺り大丈夫だよね?
文面から察するに
OutputPin::CurrentMediaTypeでメディアタイプ取得できるってことはピンが繋がっている状態なのだが
一旦Pin接続解除した後にフレームレート倍のメディアタイプを色変換に提示(OutputPin::GetMediaTypeで設定)して
再接続を試みてるんだよね?
290 :
265:2007/03/11(日) 11:56:35
>>289 >EndTimeが0で来る場合もあるのでチェックして下さい。
チェックしてみましたが、EndTimeが0で来る様子は見られませんでした。
>CTransformFilter::Receive内でもDeliverしてるからな。その辺り大丈夫だよね?
どうなんでしょう・・・影響があるかは判断しかねます・・・
メディアタイプ変更の件ですが、グラフエディタ上で接続が断たれた状態からピンを繋ごうとしたとき、
キャプチャフィルタのメディアタイプから変更しなかった場合は成功し、変更すると失敗する、というかんじです。
フレームレートの不安定ですが、もしかしたら処理負荷が大きいためかもしれません。
表示ウィンドウのサイズを大きくする(ネイティブサイズは同じ)とフレームレートが落ちていきます。
CPUの使用率は60〜70%ですが、VMR9側の問題でこのようなことになっているのかもしれません。
この負荷の原因として、変換フィルタとVMR9との間に挟まっている色空間変換フィルタが挙げられます。
キャプチャフィルタから直接VMR9に繋ぐときは介在せず、CPU負荷も小さいです。
ところが、同じメディアタイプを設定しているにも関わらず、変換フィルタを挟むと、その後に色空間変換フィルタ入ってきます。
キャプチャから直接VMR9の場合はシステムメモリは介さず、直接ビデオRAMに移す、というようなことでもしているから
こんなことになるのでしょうか?
もし変換フィルタから直接VMR9に繋げられるような方法がありましたら教えてください。
291 :
268:2007/03/11(日) 16:50:34
別のソースを元にいろいろいじってたんですよ。
(そっちのソースはCopyMemoryで落ちないので)
で、そっちのBitmapInfoのbmiHeaderを調べてみたところ、他の値は想定の範囲内なんですが
BitmapInfo.bmiHeader.biCompression = 1685288548
とdでもない値が入っていて、どうやらこいつが原因だと判明。
これって何なんでしょ?
ぐぐったらdvsdとか出てきたんですがよくわかりません。
292 :
268:2007/03/11(日) 16:54:12
ちなみに
BitmapInfo.bmiHeader.biCompression=BI_RGB;
なんてことをやると一応動くようにはなりました。
ただ取得できる値がおかしいので正確に動いてる感じではありませんが。
293 :
268:2007/03/11(日) 17:04:27
取得部分は以下のような感じです。
void Cam::getImage()
{
HRESULT hr;
// ビットマップ ヘッダーから DIB を作成し、バッファへのポインタを獲得する。
hBitmap = CreateDIBSection(0, &BitmapInfo, DIB_RGB_COLORS, (void **)&buffer, NULL, 0);
firstDIB = FALSE;
// イメージをバッファにコピーする。
DIBBuffer = (long *)GlobalAlloc(GPTR,bufsize);
hr = pGrab->GetCurrentBuffer(DIBBuffer,NULL);
hr = pGrab->GetCurrentBuffer(DIBBuffer,(long *)buffer);
}
AVIを無理やりBITMAPにしているから無理が生じているような予感がちらほら。
帰れといっただろ
>>290 レンダラに直接接続したければ、すべてのフォーマットを出力で対応する必要がある。
まあでも32bitでだいたいの環境はいける。
接続できなければレンダラが対応していないのだろう。正しい接続の仕方ならばね・・・。
296 :
268:2007/03/11(日) 20:31:37
>>294 向こうで聞くべき質問じゃないと思ったので・・・。orz
FilterのサンプルにNullInplaceフィルタってのがあるんだけどさ
それをキャプチャデバイスとレンダラの間に入れてみてくれ。
やっぱり色空間変換フィルタが必要とされるか?されないか?
dvsdはDVのSD形式。それがわかんねーなら帰れw
299 :
265:2007/03/11(日) 21:09:48
>>297 自前のWindowsSDKにないのでDirectXのExtrasをダウンロードし、その中からNullInplaceフィルタを見つけたのですが、
ビルドすると、PC内に存在しないatlbase.hが無いと言われてしまいます。
無念です・・・
> >CTransformFilter::Receive内でもDeliverしてるからな。その辺り大丈夫だよね?
> どうなんでしょう・・・影響があるかは判断しかねます・・・
どう実装してるかわからんけど、もしかしてTransformメソッドの中で2回Deliverしてる?
CTransformFilter::Receive良く読んで理解してるよね?
301 :
デフォルトの名無しさん:2007/03/12(月) 08:02:05
俺もフレームレート変換フィルタを作って断念した者ですが、
上流フィルタからの映像が来る来ないに関わらず非同期でフレームレートを作るフィルタが出来なかったんだよな。
今悩んでいる子がここまでやるのなら全力でサポートするよ
最近変換フィルタの話題がちょくちょく出ててうれしい。
303 :
265:2007/03/12(月) 08:07:00
>>300 そうです、Transformメソッドの中で2回Deliverしてます。
サンプルの流れがいまいち理解できないです。
そこで今行っている処理の流れを分かる範囲でまとめてみました。
[キャプチャフィルタ]-[変換フィルタ(自作)]-[色空間変換フィルタ]-[VMR9]
[色空間変換フィルタ]の入力ピンからの[変換フィルタ]への呼び出し
CTransformFilter::Receive (CTransformFilter::InitializeOutputSampleを呼び出す)
↓
CTransformFilter::InitializeOutputSample (新しいサンプルを[キャプチャフィルタ]の出力ピンから取得する)
↓
CTransformFilter::Transform
(サンプルの処理)
↓
CBaseOutputPin::Deliver (IMemInputPin::Receiveを呼び出す) ←これを
>>286のように2回呼び出しています
↓
IMemInputPin::Receive ([変換フィルタ]の出力サンプルを取得する)
↓
[色空間変換フィルタ]での処理
↓
[VMR9]が付与されたタイムスタンプに従って画面に表示
疑問点
・
>>289さんの言う、CTransformFilter::Receive内でもDeliverしている、という記述がMSDNで見つけられませんでした。
上記で言えばどの時点で発生するのでしょうか?
・最初のCTransformFilter::Receiveが呼び出されるタイミングが分かりません。
サンプルが変換フィルタで処理されるサイクルはどのようになっているのでしょうか?
304 :
265:2007/03/12(月) 10:06:54
この問題に関していろいろと試してみた結果を書いておきます。
・タイムスタンプがないプレビューピンからの映像に対して変換を行ったところ、同じうなり現象(
>>284)が起きた。
・一枚のサンプルに対して二度の処理を行うが、片方の絵を真っ黒にしてみると、フレームが倍化していないときは
二枚目の絵のみが表示される状態であることが分かった。
・二度目のDeliverを外したところ、フレーム倍化の時間が若干延び、倍化していない期間においても
一枚目の絵と二枚目の絵が交互に表示された。
このとき、キャプチャーピンからの映像では倍化していない期間で絵が0.5秒ほどストップすることが頻繁に起こった。
プレビューピンからの映像ではこのストップ現象は起きない。
305 :
265:2007/03/12(月) 10:08:49
306 :
268:2007/03/12(月) 13:35:12
>>298 SD形式はいいんですが、これって普通にBITMAPINMFO構造体として取り出せないんでしょうか?
307 :
265:2007/03/12(月) 17:31:09
特定の場合についてのみですが、フレームレートの倍化(30fps→60fps)ができました。
(同時にこの手法のダメさを裏付けるものでもありましたが・・・)
条件は
・キャプチャフィルタのプレビューピンに繋げる(よってタイムスタンプの設定は意味なし)
・二度目のDeliverを無くす(あるともたつきが起こる)
・画面表示をビデオのネイティブサイズである640×480に対し、約2倍以上にするとフレームレートのうなり現象が
無くなり約60fpsで一定となる。
このとき、CPUの使用率はサイズが大きくなるにつれて上がる。
これらの現象から導き出される結論として、
一度目のDeliverと二度目の(本来行われる)Deliverは連続ですぐに行われ、二度目のDeliverにより送信された
二枚目は一枚目で設定したタイムスタンプがあろうが無かろうが即座に描画される。
CPUの負荷が上がり、すぐに二度目のDeliverが処理できない場合、その間一枚目が表示されることとなり、この時間が
ちょうど1/60秒となるときキレイにフレームが倍化されることとなる。
描画サイズが小さいときはCPUに余裕がある期間が存在し、そのときは二枚目のみが表示される。(フレームが倍化されない)
ということが言えると思います。
よって、一度のTransformメソッドで二度のDeliverを用いる作戦はアウトということになりました・・・。
何度も書かれているけど、接続状態がその倍のレートでないと、レンダラはそのfpsで処理してくれないと思うよ。つまり余計に送られてきたサンプルは捨てる。
出力メディアタイプと違うサンプルを出力しても、期待した通りに動かないよね。
あと処理が間に合わない時も、どこかのフィルタが捨てると思う。
一度CPU負荷がほとんど発生しないプロトタイプを作って実験して、処理遅れなのかそれとも別の問題なのか調べて見ては?接続の問題も解決を。
リアルタイムで処理したいんだよね?
それとDirectShowで「サンプル」といえば、IMediaSample2などのデータの事をしめします。
>>287 は、一度ダウンストリームに送信したサンプルをまた再利用するなよってこと。
ビデオレンダラからの品質メッセージをNotifyで受け取ってQuality::Lateを見てみると良いよ。
これがマイナスだとレンダラに間に合って届いている。
プラスだと間に合ってないので到着したとたんにレンダリングされたりして
動きがギクシャクしたり捨てられてカクついたりする
休日の夜中になっても頑張ってるから応援したくなるよ あんまり教えすぎはよくないんだけど
>303 サンプルの流れについて
まず上流(キャプチャデバイス)の出力ピンが、変換フィルタの入力ピンCTransformInputPin::Recieveにサンプルを渡す。
入力ピンRecieveはCTranscormFilter::Receiveを呼ぶ。んでTransformメソッドでサンプルを変換した後、
出力ピンから下流(色変換フィルタ)のRecieveを呼び出す(サンプルを渡す) という流れ
>289で「Deliverしてる」って表現したのはマズかったかな。要は下流にサンプルを渡すってことなんだ。
下流の入力ピンのReceiveを呼び出す(サンプルを渡す)。コレがDeliverの正体。
CBaseOutputPin::Deliverメソッドのソースを見てみるといいよ(Baseclassesのamfilter.cppな)
んでTransformフィルタなんだけど、出力ピンのDeliverメソッドは呼んでいないんだ
どうやって送信してるかというと、CTransformFilter::Receiveの中に次のコードがある
hr = m_pOutput->m_pInputPin->Receive(pOutSample);
これ。ここで送信してる。直訳(?)すると、自分の出力ピンに繋がってる入力ピンのReceiveに
Transoformメソッドで変更を加えたサンプルを渡す ってこと。
長いので続く
303のカキコミについて説明していくよ
> CTransformFilter::InitializeOutputSample (新しいサンプルを[キャプチャフィルタ]の出力ピンから取得する)
InitializeOutputSampleは出力するサンプルの準備をするメソッドなんだ。
ここでは送信するサンプルのバッファをサンプルと結びつける(バッファ自体は出力ピンが確保してる)
HRESULT hr = m_pOutput->m_pAllocator->GetBuffer(
その後で、上流から受け取ったサンプルのプロパティ(各種フラグと言ったほうがわかりやすいか)や時間情報を
出力するサンプルに設定していく。これがInitializeOutputSampleの役割。
このことから、上流から受けたサンプルと、自分で送るサンプルは全くの別物であるということがわかる。
送信が済んだら、このサンプルをリリースすることでバッファの開放などが行われる
(CTransformFilter::Receiveの最後の方 pOutSample->Release(); )
ちなみに上流から受けたサンプルをダイレクトにそのまま下流に出力するのはCTransInPlaceFilterだ
つづく
早い話、君は2回送ってるつもりでも、3回送っていると思われる
しかも3回目のサンプルの時間情報は上流から受けた時間そのもの
Transformメソッドはサンプルの内容を変更するだけじゃないと ブー
そういう設計なんでこざいます だからここから送信したら ブーブー
TransformInputPin::Receiveをオーバーライドしないとアカンねん
まちがえた TransformFilter::Receiveな 酒のんでるからすまんの
サンプルのタイムスタンプ見てレンダラが表示のタイミングを待ったり、時には捨てたりするアルよ
サンプルの不連続性(Discontinuity)とか同期ポイント(SyncPoint)を示すフラグの扱いとか
注意してくれよ キレイなフィルタを作りましょう。んじゃ頑張れ
315 :
265:2007/03/12(月) 23:33:31
>>308 了解です。
>それとDirectShowで「サンプル」といえば、IMediaSample2などのデータの事をしめします。
そういうことでしたか・・・
失礼しました。
>>309 ありがとうございます。
調べてみます。
>>310-314 とても丁寧にありがとうございます。
がんばります。
>>306 dvsdなんかではCreateDIBSectionに失敗しそうな気がするけど、それはないの?
あと、フィルタいじれるなら入力ピンのCheckMediaTypeでMEDIASUBTYPEの
RGB24かRGB32以外を弾くようにすれば、その辺不問にできるような気がするけど・・・。
すみません。
DVDをAVIにして保存したいんですが、YUYをRGBに変換するフィルタとAVIを書くフィルタは自前で作るのですか?
色々やってみてダメだったらヒントください。
ちょっと頑張ってくる。
318 :
268:2007/03/15(木) 14:03:14
>>316 はい、失敗します。orz
他の方法でやらなきゃいけないんでしょうか?
>>318 (1) 普通のDIBを用意して、そこにDrawDibDrawで描く
(2) 入力ピンのフォーマットをRGB24/RGB32に限定して、フィルタグラフ側で変換してもらう
(3) 自分でDVをでコードする
1,2は実質的にはaviのというかvfwのdvコーデックが使われる。
「やらなきゃいけない」かどうかは自分で決めればいい。
やりたくないならやらなくていいんじゃない?
320 :
268:2007/03/15(木) 16:40:18
>>319 うお、ありがとうございます!
ちょっくら試してみます!
321 :
268:2007/03/15(木) 18:38:43
322 :
268:2007/03/15(木) 18:52:30
ん、DrawDibOpen動いた。
あとはDrawDibDrawの引数だけだと思うので、ちょっくら追ってみます。
ICaptureGraphBuilderを利用してSetOutputFileNameやって、
DVD Navigaterのフィルタを取ってRenderStreamすればAVIにできると思ったのにダメでした。
DVDをAVIにして保存する方法って何かあるんでしょうか。
サンプルグラバつなげられれば保存できる気もするんだけどPINをつなげられない。
325 :
268:2007/03/16(金) 16:53:10
DrawDibBeginがfalseを返す・・・。orz
というわけで他の方法試してみます。
BeginとEndは実は要らない。
327 :
268:2007/03/16(金) 17:12:04
>>319 > (3) 自分でDVをでコードする
って、サンプルとかないですよね・・・。orz
328 :
326:2007/03/16(金) 17:19:30
>>326 ま、マジですか。
ちょっくら試してみます。
329 :
368:2007/03/16(金) 17:20:05
あせって名前間違えた。orz
>>328は自分です。
330 :
268:2007/03/16(金) 17:24:46
うーん、DrawDibDrawがやっぱりfalse。
何か記述が足りない気がしてきた。
サンプル探してるんですけど全然見つからないんですよね。orz
>>330 サンプルグラバ使ってるんですよね?
SetMediaTypeでMEDIASUBTYPE_RGB24指定して
dvsdで流れてこないようにしたらどうですか?
あなたのレスをすべて追っかけてるわけじゃないんで、外してるかもしれませんが。
散文だし小出しだし追いかける気になれない。
OverlayMixerの後ろにサンプルグラバはつながらないと思うよ。
OverlayMixerはレンダラとつながる。そしてオーバーレイで自分が描画している。
後ろにつながっているビデオレンダラはメディアサンプルを受け取っておらず、
ウインドマネージャを提供しているに過ぎない。
つまりたとえつながってもサンプルを取ることはできない。
はず。
>>333 はい。そうでした。全く繋がらなくて1日無駄にしました。
DVDをAVIにしなきゃ行けないんで作り方を模索中。
やるならOverlayの上流にあるDVD用デコーダフィルタですかね。
GraphEditでRendererとサウンドをぶった切ってASFライタを入れると
DVDをWMVにできたりします。
この方式で画質設定と開始位置と終了位置を設定して保存できればいいのかもしれない。
最後にWMVをAVIに変換して終了させるという最低の方法を選ぶ。
AVIMUXにつなぐ方法ありましたらヒントください。
最近のライブラリから外れたBaseClassのCtransなんたらで自作フィルタを作るしかないんですかねぇ。
それでYUYをRGB24とかに変換。
DVD Navigater -> 何かフィルタ -> Video Commplessor -> AVI MUX -> File Writer
という形で保存できればいいんですが。
335 :
268:2007/03/17(土) 21:42:01
動きますた!(・∀・)
原因は
>>316や
>>331あたりが正解だったようです。
ボスに言われてイチから書き直したらうまく動きました。
というわけで、本当にありがとうございました。
DirectShowと戦うことができたのはこのスレのおかげです。
>>335 おめっとさん、その二つはいずれも私ですがw
実はDirectorのXtraに興味があってちょっと追いかけてました。
Xtraの描画周りって何を参考にしました?
キャプチャした画像を直接Director上で表示するのでしょうか?
ちょいスレ違いスマソ
337 :
268:2007/03/18(日) 22:28:43
338 :
336:2007/03/19(月) 21:42:14
>>337 なるほどどうもっす。
DirectShowのフィルタ書いてお茶を濁そうと思っていたのですが、
クライアントの意向によりXtraを直接弄る必要があり、
ちょいとハマってたところでした。
DirectShowも情報ない方だけど、Xtraはもっと険しい道だなこりゃ・・・。
339 :
デフォルトの名無しさん:2007/03/21(水) 10:49:02
asfを再生しようとすると
DirectShow フィルタ グラフに存在しないピンに操作を実行しようとしました。
になって再生できません、対策はありませんか?
どうやって再生しようとしてんの?それじゃ意味わからんよ。
341 :
デフォルトの名無しさん:2007/03/21(水) 20:42:03
若いの オラが村では派遣労働の問題を口にしちゃなんねーだ
お前さんはまだわけぇから言いたいこともあるべぇ
だべな、派遣問題を口にするとバカにされたと思ってムキになって怒る者がおるでよぉ
てめぇでの責任で派遣やってる癖に派遣問題に触れると逆ギレするバカなんだけどよぉ
そんでもこの問題の指摘は駄目だっぺぇ
派遣のことは口にしちゃなんねぇ
この村みたいな民度ゼロの会社で現実忘れるためにはよ
北朝鮮とか宗教団体と一緒でよ、駄目なものを駄目と言ってはなんねえだべさ
タブーを口にしちゃいけねぇだ
342 :
デフォルトの名無しさん:2007/03/25(日) 16:03:45
変換フィルタを作っているんですが、そのフィルタのコンストラクタでmallocを使って
メモリを確保し、デコンストラクタでfree()で解放するようにしているのですが、
アプリ側でRemoveFilter()をしても、デコンストラクタが起こらないのかメモリが解放されません。
どうすればデコンストラクタを起こすことができるでしょうか?
343 :
342:2007/03/25(日) 16:05:53
↑すみません、デコンストラクタじゃなくてデストラクタです。
RemoveFilterってグラフからフィルタを切り離すだけだろ
そりゃデストラクタは呼ばないんじゃねーの?
345 :
342:2007/03/25(日) 18:09:19
>>344 そうみたいですね。
いろいろ考えたんですが、完全に削除できないのなら、そのまま残しておいて再利用しよう、という
方針で組んだところ、望む動作を実現できました。
いちいち削除する必要がなかっただけの話でした・・・。
ありがとうございました。
Releaseが完全に行われていないだけだろ。参照のチェック汁。
347 :
342:2007/03/25(日) 23:33:06
348 :
デフォルトの名無しさん:2007/03/26(月) 09:07:56
新規質問です。
ピン接続時のメディアタイプを調べたいのですが簡単に調べる方法がないため今回「メディアタイプチェックフィルタ」を作る事にしました。
質問1.調べるフィルタを誰か作ってませんか?
時間をかけず作りたい為、「TranceForm」をベースにしているのですが、このフィルタで入力ピンのみの構成のフィルタはできますか?(テンプレートのピン数を1本にしても2本になってしまいました何故…?)
いくら出す?
20円
351 :
デフォルトの名無しさん:2007/03/26(月) 12:14:35
>>349 自分なら作るのに3〜4時間位かかってしまいそうなので、
時給1000円×4hまでならなんとか。。
でも誰か作っていそうなんでそれを使いたいです。
>>348 Dumpフィルタベースじゃダメなんかいね?
あれは入力ピン1コだけど。
IBaseFilter::EnumPins
IPin::ConnectionMediaType
それともこっちか
IPin::EnumMediaTypes
簡単だろ?
とりあえず、リファレンスくらい読め。
TransformFilterならそのまんまCheckMediaTypeで全部拾えばよかばってん
355 :
デフォルトの名無しさん:2007/03/26(月) 23:39:39
>>354 考え同じ。せっかくだから上位フィルタに優先接続して欲しいタイプも入れられるようにしようかなと検討しとるですばい。
IBaseFilter::EnumPins
これはピンごとに管理したい時につかうメソッドだよ。ピン1つでは実装いらないよ
IPin::ConnectionMediaType
これは再生途中にタイプ変更したい時に実装したほがよさそ
突然思い出したんだけどsampleの中にnullnullフィルタだかなんだか
プロパティページで接続タイプ一式が表示されるやつがあったような ないよーな
何か違うと思って調べてみたらNullInPlaceだったわ ごめんな
nullprop.cppのNullIPProperties::OnApplyChangesみるといいアルよ
358 :
デフォルトの名無しさん:2007/03/27(火) 00:56:20
なるほどなるほど。
NullIPPropertiesはなかなか難しいことやってますねぇ。。。
理解しずらいや。。
取り敢えず。
上位フィルタとの接続された
フォーマットタイプ、
メディアタイプ、
メディアサブタイプ
をプロパティページで表示できる変換フィルタを作成できました。
フォーマットタイプが「VIDEO」だったら解像度とかフレームレートとか付加情報を
表示できるようにしてみるか。。
このフィルタ欲しい人いる?
まぁきっとだれかもっといいものを作っている人がいるかとは思うのですが
ノシ
360 :
デフォルトの名無しさん:2007/03/27(火) 01:30:21
ありがたいっす。マタリ待ちます。
362 :
デフォルトの名無しさん:2007/03/28(水) 07:41:45
自分が知らないメディアタイプが結構あるね。
メディアタイプ一覧がわかるサイトさがさなきゃ
接続メディアタイプチェックフィルタでは、最悪知らないGUIDが出てきたら
そのまま貼っとくか…
uuids.hでよかばってん
364 :
デフォルトの名無しさん:2007/03/28(水) 21:41:53
九州男児さんありがとう
AVIファイルの一部を切り出して 拡大縮小したAVIつくりたいんだけど
元AVI(640,480)でRECT(120,120,440,320)の範囲だけきりだして320x240のAVIにしたり
範囲を拡大して640x480にしたいんですが、サンプルグラバのコールバックつくって
中で処理しなきゃダメですかね?
366 :
デフォルトの名無しさん:2007/03/30(金) 08:24:20
「中」ってどこを指してる?
自分なら映像切り抜きフィルタを作って解決するけどフィルタグラフ側でもできるよ。
フィルタグラフ側でAVIの切り抜きを行った時のサンプルグラバの制御は凄く大変そう…ってか自分には無理なレベル
367 :
デフォルトの名無しさん:2007/03/30(金) 08:30:25
あ、切り抜きの手段としてグラバを使うのか。
グラバで取得した画像は元AVIと同じサイズなんね。なら出来…るかな?
だけどやっぱり、「切り抜き拡大縮小フィルタ」作るほうが簡単なのは間違いない。
>>367 TransformFilterで切り抜けばよかばってん。
んで後ろにAviMux、FileWritterとつなげればよかよ。
369 :
365:2007/03/30(金) 21:25:10
サンプルグラバのコールバック=「中」です。
TransformFilterって、ベースクラスのライブラリから自分で作るフィルタですか?
最初から用意されててAddFilterで追加できるなら使ってみたいかも。
> TransformFilterって、ベースクラスのライブラリから自分で作るフィルタですか?
んだよ自分で作るんだよ Transformメソッドで好きにいじってよし
んで後ろにAviMuxが繋がる時にね、ビデオの縦横サイズはオリジナルサイズじゃなくて
自分が変更するサイズを提示するったい Muxは提示されたサイズをヘッダ情報に
書いてた気がするばってん
IRenderEngine2とかで何とかなるんでしょうか。
DirectShowの編集サービスっての使えますか?
質問に答えてくれた皆様ありがとうございました。
ちょっくらトランスフォームフィルタつくってみます。
コンプレッサの前にトランスフォームでサイズ変える処理いれてみます。
CreateDIBSectionでHBITMAPつくってストレッチビルドして試してみます。
373 :
デフォルトの名無しさん:2007/03/31(土) 00:03:12
>>372 作り方は大正解◎。
コツを少々・・・
流す映像のサイズをかえちゃうと
設計が大変になるから
「切り出し」→「拡大」でもとのBMPサイズに合わせるようにすると
いいよ。
それとストレッチベルトを「CTransform::Transform」内でつかうんだけど
ストレッチベルトの関数1つで全体のCPU負荷が15%ぐらい上がってしまう。
もし気になるなら、画像処理ライブラリで置き換えするとよいよ
俺ここんとこ九州男児さんと考え方が似てる。。同じような職種&年齢なんだろうな。
おいどんは昔printfをプリンテフと読んで笑われた苦い経験があるばってん
一応つっこんでおくけど、「ブリット」ですたい。
StretchBlt ストレッチブリット BitBlt ビットブリット
375 :
デフォルトの名無しさん:2007/03/31(土) 00:37:23
>>374 ほへ〜。初めて知りました。
呼び方は「Blt」⇒「ベルト」と呼んでました。。
言い訳しまくると、自分組み込み系出身でwinアプリ作るの今年から初めた門で。
WinAPIを知らなさすぎる。。この機会に他の呼び方も覚えよう
今後直しますありり^^
そして、メディアタイプチェッカーも明日だらだらし終わったら修正に取り掛かるっす
376 :
デフォルトの名無しさん:2007/03/31(土) 00:42:28
>>373 なんか、映像のサイズ変えて保存したいって突然いわれたんで
変更しなきゃいかんのです。
切り出して切り出したサイズで保存なんですよ。
切り出して元の再隋拡大だったらサンプルグラバでおわったのに。
サンプルグラバでCreateDIBSectionかけてmediasampleからバッファとって
データ加工して代入。ここまでは出来てOKだった・・・
ストレッチビルトして正しく終わったのに・・orz...
ぶりっとっていう呼び方なんかアレだよね。アレ。
DirectX8からPresent()になったのはホント良かったと思うよ。
379 :
デフォルトの名無しさん:2007/03/31(土) 01:26:56
>>377 ごめん。。
内容的には以前自分が作った「解像度リサイズフィルタ」
これの仕組みがまんまメインになってくるんだが
教えてあげられない。。
自分で調べてくれ。
TransformFilterを使わずにビデオソースの拡大縮小と切り出しする方法って無いのかな。
切り出しと拡大縮小ぐらい用意されてるような気がして探し回ってた時期があった。
一口にビデオソースといってもRGBやらYUVやら色々あるけんね
拡大、縮小にも色々なアルゴリズムがあるったい 自分の好きなようにつくるのが一番よかよ
どうせつくるならそのへんプロパティページで色々指定できるとうれしいね
ここもネガティブさんが沸いてるよ。
自分で調べれって話なら書く必要ないじゃん。
教えて上げられないレス増えるからネガティブさん消えてくれwwwwwwwwwww
384 :
デフォルトの名無しさん:2007/03/31(土) 23:03:57
>>383 DirectShowやってる人の総人口が少ない。
そしてそれが理由なのかここのスレの回答側に立つ人も少ない。
このスレで役に立てばと思って結構回答をしているが、
何が難しいかわかるけど教えてあげられない状況だったので、
放置されるよりはいいと思って書き込みました。
(本スレ後半でageてるやつはほとんど自分)
>>383さんもそんなこと書き込んでないで回答側に回ってくれ
まあ内容はともかく、少しでも盛り上がってくれるのは嬉しいわな。
その昔サンプルグラバを知らなかった自分は自前のフィルタ作っちゃったし、
話の流れで知ることもそれなりに多い・・・。かな?
386 :
デフォルトの名無しさん:2007/04/01(日) 03:12:34
>>363 uuid.hではすべてのメディアタイプは乗ってない。
「MEDIASUBTYPE_I420」
が入っていなかった。
387 :
C++:2007/04/01(日) 08:46:54
C++は今最も優れているプログラミング言語だ。C++さえあればなんでも出来る。CGI一つにしたって、今はPerlなんて使わなくても全部C++で出来る。そんなC++を使わないでどうする。
「全て」のメディアタイプって概念をどう捉えるかだな
まずはDirectX SDKのindlude、DirectShowのBaseclasses ここのソースで定義されてるものを
押さえておけば良いんじゃないの?
極端な話、guidgen使って自分で独自のMediaType作れちゃうわけだし。
MEDIASUBTYPE_I420ってGUIDとしては存在するかもしれないけどどっかのメーカーが勝手に作っただけじゃないの?
DirectShowのオフィシャルな定義としてはMEDIASUBTYPE_IYUVじゃないのか。
そういや自分もmplayerの公開されているソースを見て
普通にMEDIASUBTYPE_I420という定義があるものと思い込み、
いざ実装してみたらものの見事に未定義だった、ということがあったなあ。
IYUVとI420は同じフォーマットのようなので、
私もMEDIASUBTYPE_IYUVを使ってますが・・・。
拡張可能なばっかりにかえって不毛になってるのか
やれやれ
ホントにDirectShowって資料少ないのね。VfW勉強した時も思ったけど
こういう動画処理インターフェースってプログラムとして人気ないのかな?
資料は少ないなりに充実してると思うけど・・・
漏れにはACLの方がワケワカメだよ。
動画処理に興味をもつほど自由に弄れる動画素材を持ってる人が少ない、
という事情もあるのではないか。
後は仕事になるかどうかとか。
+ 三ミヽ、⊂⊃
+ 三ミ |∧η∧
/⌒\ (,,・Д・)<ただいまんこ〜オレも便乗して質問だぞ。
+ 川川 l l/つ つ━☆ トランスフォーマーとかいうのをつかって
〜( / CTransformFilter::DecideBufferSizeここでメモリを確保する所までたどり着いたぞ。
(/"U 俺も拡大縮小をやりたくて書き込みするぞ。オマンコクロスだぞ。
C言語は7年目だぞ。切実だぞ。
396 :
デフォルトの名無しさん:2007/04/03(火) 22:27:40
>>395 俺は3年目だけど苦労したができたぞ。
で、何がしりたいんだぼけぇ
・質問のただしいしかた悪いしかた
【いい例】
ぽまえら!おしえやがれぃい。
QVGAをVGAにリサイズしようと思うんだがDecideBufferSizeというめそで
115200byteしかとれねええんじゃUZEEEEEE!!
これを230400byteとれるようにする方法を教えやがれ
【悪い例】
いつも大変このスレッドを読ませていただき参考にさせてもらっております。
今回拡大縮小をやりたいのですがどのようにしたらいいかわかりません。
C++、MFCはできます。
また自分は過去XXXということをやっておりました。
大変恐縮ですがなにとぞご指導をよろしくお願いいたします
まちがえた〜
×115200
○230400
×230400
○460800
用は質問の観点を絞り込んでくるかどうかの差だからな
⊂⊃
★ ∧η∧
\_(,,・Д・)<
>>396 ポンドルウォーリアを特殊召喚する方法がしりたいぞ。
ヽ |フ ナニがしたいのか忘れたぞ!
/_ _| AVIを半分の解像度にして保存したいんだぞ!これが目的だぞ。
逆もあるぞ。オパンツ丸見え!
>>397 うんこちんこまんこ?キョカカカ!あばーあばばー!
参考にさせてもらったぞ。面倒だから、ゴゾブログで質問に答えてくれればそれでいいぞ。
オマンコクロッサー!
・・・
>>397で極端に書いたのに意味を理解しとらんのでヌルーする
401 :
デフォルトの名無しさん:2007/04/04(水) 01:28:29
メディアタイプチェックフィルタ
作ったぞ
実は裏で機能をいろいろ盛り込んでみたが、
普通の使い方だけしてくれ。
http://zetubou.mine.nu/itoshiki/upload.cgi っ【 [zetubou6474.bin] メディアチェックフィルタ 96 application/octet-stream 2007年04/04(水)01:25
これをリネーム
⇒0Mediachk.ax
それをregsvr32で登録
ここはム板だ
ゴゾブログのプロフ欄の写真の子カワイイ。
写真と引き換えならオニーサンがAVI半分にするフィルタ作ろう。(ただしソースはやれないがな)
>>404 このムーンライトフィルタってさ、カメラがI420の時は接続すらしてくれないんだね。
解像度もメディアタイプも変更してくれるいいフィルタだと思ったんだけど残念
406 :
359:2007/04/04(水) 17:35:35
>>401(
>>360の人?)
ありがとう、ダウンロードしてみました。
個人的には結構重宝しそうな感じです。
>>360=
>>401 です。
ちゃんと動きましたか?
バグを見つけたら速やかに報告よろ。
時間見つけ次第ちゃんとウェブページに反映しとくです。
感謝されるのに生き甲斐を感じた。ありり
CBaseVideoRendererでフィルタを作っていて、一時停止中に画面の再描画を
行うためGetCurrentSample()でサンプルを得ています。
サンプルの取得は成功しているのですが、このあとに再生するとDoRenderSample()が
呼ばれなくなって固まってしまいます。
どうしてでしょうか?
⊂⊃
★ ∧η∧
\_(,,・Д・)<ただいまんこ〜拡大縮小できたぞ。BokkingFilterの完成だぞ。
ヽ |フ ビデオのサイズが変わらなかったのはフィルタ接続後にサイズ変えてたからだぞ。
/_ _|
CheckTransformでサイズを変更したぞ。
変更したサイズからRGB24で必要なバッファサイズを計算して保存だぞ。
ストレエッチDIBitmapだぞ。それに対してソースからストレッチDIBitsして
完成したぞ。
そして完成した後に次の問題が出たぞ。
時間指定して3分の動画で1分目から2分目を抽出したいんだが
ControlStreamにS_OK帰ってきてもダメポだぞ。
AVI再圧縮で時間指定して抜き出すテクを知ってたら教えて欲しいぞ。オマンコクロスだぞ。切実だぞ。
⊂⊃
★ ∧η∧
\_(,,・Д・)<あと、AVI MuxフィルタをキャプチャグラバからFindInterフェラして
ヽ |フ IAMStreamControlを生み出してStartAtとStopAtする方法を作ったんだが
/_ _| ム圧縮AVIなら何とか成功してWMVとかコーデック使うと画像が表示されんぞ。
あと、保存してない間も無駄に待たされて酷い目にあったぞ。
誰かオレがナニをすべきか教えて欲しいぞ。
ControlStream(&PIN_CATEGORY_CAPTURE,ぬるぽ,ぬるぽ,開始時間,終了時間、0,0);
⊂⊃
★ ∧η∧
\_(,,・Д・)<キャプチャビルダのコントロールストリームはこんな具合になってるぞ。
ヽ |フ オマンコクロスだぞ。ソースを持って変えれないので具体的に説明できんぞ。
/_ _|
413 :
408:2007/04/04(水) 22:46:10
ありがとうございます。
まさにそれでした。SDKのヘルプに書いてありましたね
415 :
414:2007/04/04(水) 23:23:49
⊂⊃
★ ∧η∧
\_(,,・Д・)<
>>415 それも考えたんだぞ。大人の都合ってヤツでダメなんだぞ。
ヽ |フ くやしいぞ。オマンコクロスファイヤーハリケーンだぞ。
/_ _| 明日、ためしに作ってみるぞ。
417 :
デフォルトの名無しさん:2007/04/04(水) 23:45:11
いいから↑はほっといてやれ。
418 :
359:2007/04/04(水) 23:57:28
>>407 今のところ問題なさそうですよ。
ただ、スレの流れを見ると私以外で使ってみた人いないのかな?w
もう少し使ってみて気がついたことがあったら報告しますね。
>>418 >私以外使ってる人いない…
(´・ω・`)ショボーン
420 :
デフォルトの名無しさん:2007/04/05(木) 21:34:17
おまえら便利なフィルタの一覧サイト作ろうぜ!
あと、××の製品かうと着いてくるフィルタは…とか語ろう
>>421=
>>359さん??
質問は
>>419に聞いてるのかな?
だったら応えます。
上流フィルタがカメラとかの入力デバイスの場合は「フィルタのピンプロパティ」から出力タイプを変更できるものがほとんどです。
仮に「動画」などのファイルであれば変換フィルタを噛ます事で変更は出来ますが新たに付けてやることは出来ません。
新規にフィルタを作成すればメディアタイプを付加しる物を作れるよ。
他の方法はわかりません
>>422 >
>>421=
>>359さん??
うわー、なんで分かるの?w
> 新規にフィルタを作成すればメディアタイプを付加しる物を作れるよ。
> 他の方法はわかりません
やっぱりそれしかなさそうですね。
AsyncRdrサンプル辺りをベースに1つ作ってみます。
⊂⊃
★ ∧η∧
\_(,,・Д・)<無圧縮タイプのAVIなら時間切り出しできたぞ。
ヽ |フ ただ、無駄に時間がかかるぞ。切り出すまでフィルタにデータが流れて処理してるんだぞ。
/_ _| ポンドルウォーリア特殊召喚だぞ!ゴルァ!
>レンダラは知らないけど、画面の上側にプレーヤを持っていくと少し(体感しないけど)
>速くなるらしい。なんかPresent(?)の戻りが早くなるとか言ってた。
これ本当?
427 :
デフォルトの名無しさん:2007/04/08(日) 17:03:02
Presentの戻りって何?
プリロールかな?としても意味通じないし…
予測ツカナス
IDirect3DDevice9::Present()の話だな。
初心者です。SDKサンプルで分からない点があるのですが、お教え頂けないでしょうか。
プログラム動作としては、3つのmp3ファイルをタイマーで順繰りに再生するだけです。※1
この中でソースフィルタを変更してグラフを再構成する部分で分からない点があります。
流れ
1.新しいソースフィルタをグラフに追加する。
2.古いソースフィルタをグラフから削除する。
3.新しいソースフィルタの出力ピンからRenderする。
2の部分の詳細は以下のようになっています。
A.グラフ内のフィルタを列挙する。
B.列挙された全フィルタについて
a.一旦グラフから削除する
b.古いソースフィルタでなければグラフに追加する
疑問点
b.の部分がある意味がわかりません。自分としては、グラフ内の全フィルタを削除して、新しい
ソースフィルタを追加して、Renderすれば簡単に思えるんですが...
どうかよろしくお願いします。
※1 ソースはSDK_Path\Samples\C++\DirectShow\Players\BGMusicです。
SwapSourceFilterのメソッドのこと?
⊂⊃
★ ∧η∧
\_(,,・Д・)<
>>429 サウンドってのは、レンドルァすると全部のcodecを試すんだぞ。
ヽ |フ だから、全て消して再構築すると連続再生とかできんぞ。
/_ _| アイマスの魔法をかけて!から、とかちつくちての連続技の間に途切れるって事だぞ。
ありがとうございます。
なるほど、それで以前使ったフィルタは残してたんですねφ
ところでその時、つながっていないフィルタがグラフ上に散在している状態ですよね。
その状態でRenderしたら、全Codecを試さず、散在しているフィルタを繋げてくれるんですか?
それともRenderを使わず、ピンを繋ぐ方法が別にあるのでしょうか?
この板のレベルに達するまで勉強して、出直してきます。(時間かかりそう...)
⊂⊃
★ ∧η∧
\_(,,・Д・)<
>>434 朝勃ち中だが答えるぞ。
ヽ |フ レンダーすっと、フィルタが追加されている物から試すんだぞ。
/_ _| そのため、レンダーする前にvmr9のフィルタとかを入れておくとただのビデオレンダーじゃなくなったりするぞ。
だから、先に自分で作ったフィルタを入れておくと正しく繋がったりするぞ。
もちろん、Renderを使わずにグラフビルダのほうでConnectすることができるぞ。
IPinってのをフィルタから抜き出して接続できるみたいなんだぞ。
使った事無いからうまんちんまんだぞ。
⊂⊃
★ ∧η∧
\_(,,・Д・)<なんか、間違ってるかもしれんが許してほしいマンコ!んじゃ為替予想書いてくるぞ。
ヽ |フ
/_ _|
すみません、質問いいですか?
今、DirectShowでUSBカメラからサンプルグラバでBMPをキャプチャするプログラムを作っています。
コールバックを使用してキャプチャをしようとしているのですが、
SetOneShotを使って1フレームだけキャプチャすることは出来ないのでしょうか?
ためしにSetOneShot(TRUE)としてみても、コールバックされ続けてしまいます。
438 :
デフォルトの名無しさん:2007/04/10(火) 17:56:39
出力ピンがオーディオとビデオの2つある、Splitterフィルタを作成しています。
フィルタのGetMediaTypeでは、ピンによって2通りの設定が必要と思っています。
(オーディオの方の出力ピンからGetMediaTypeが呼ばれた場合はオーディオの値をセット、
ビデオの出力ピンからGetMediaTypeが呼ばれた場合はビデオの値をセットというように。)
しかし、GetMediaTypeでは、現在どちらの出力ピンから呼ばれているのか判別できないのですが、
どうしたら良いでしょうか。
出力ピンのクラスは同じものを使っているのですが、オーディオ用のピンクラス、ビデオ用の
ピンクラスと別に作成しなければならないのでしょうか?
>>438 自分がどっちのピンかを区別して処理を変えればいいじゃん。
⊂⊃
★ ∧η∧
\_(,,・Д・)<
>>437 ただいまんこー!ドピュンコしたあとに、コールバックを外せばOKだぞ。
ヽ |フ コールバックをセットしたままだと永遠にデータが流れるぞ。
/_ _| オレだったらSampleCBのあるクラスに BOOL m_Ochinpoいれて
データを流したくない時はfalseいれて SampleCBのなかでreturn S_OKしちゃうぞ。
オマンコクロッサー!
⊂⊃
★ ∧η∧
\_(,,・Д・)<
>>438 IPin淫乱フェラにあるQueryPinInfoで解決できる気もするぞ。
ヽ |フ 俺も調べないと分らんぞ。スマソだぞ。力になれんぞ。
/_ _|
VBプログラマにVisual C++を教えるスレ★ Part25
>>441タソ
フィルタ内部の話だからQueryはちがうとおもうぞ。
自分も
>>439の意見に賛成です。
@純粋仮想メソッドGetPinを実装してピン番号を取得
AGetMediaTypeにてまず@を呼び出す。
Bピン番号が「1」ならビデオだから・・・メディアタイプ「Video」を要求
Cピン番号が「2」ならAudioだから・・・・メディアタイプ「PCMAudio」を要求
iPositionにて要求するものをそれぞれ数個書いてやればいいかな。。
⊂⊃
★ ∧η∧
\_(,,・Д・)<
>>443 オレはトランスフォーマーフィルタで1対1の戦いしかやったこと無かったぞ。
ヽ |フ これでピンが複数あるフィルタも手だせそうだぞ。
/_ _|
446 :
438: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はフィルタ作成時に作られます。
どうしたらよいですかね…
>>446 if (pOutputAudio == this) {
//オーディオピンの処理
} else {
//それ以外
}
448 :
448:2007/04/11(水) 17:09:38
>>447 参考にします。
フィルタの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を見て、
オーディオ、ビデオの設定をするようにしました。
一応接続はこれで上手くいきました。何かとても簡単な質問をしてしまった気がしますが…
1500円の2割引はいくら?
時速80km/hで走る車が1時間何キロ走る?
・・・ポカーン
⊂⊃
★ ∧η∧
\_(,,・Д・)<1500円の2割引きは計算不能だぞ。俺の脳が再起不能(リタイア)したぞ。
ヽ |フ 時速80kmでオレは走れないので1時間も車を見張れないぞ!
/_ _| 果てしなく遠くが答えだぞ。
451 :
デフォルトの名無しさん:2007/04/19(木) 06:23:08
都合でDirectshowを使い始めることになりました初心者です。
Webカメラで取った映像を扱いたいので、SDKにあるAMCapを参考に機能を探しているのですが
キャプチャした動画をaviではなくmpeg1等で圧縮して吐き出したいのですが
フィルタを何処の関数で挟めばよいのでしょう。
あと、映像のガンマや彩度等がプロパティで調整できてしまいますが、これはなんのフィルタを使用しているのでしょうか?
初心者質問すいません。
>>451 プロパティはソース見りゃわかるんじゃない。
以下推測
色調節のフィルタが存在するのではなくて
キャプチャデバイスやそのピンのプロパティじゃないのか。
Webカメラのデバイスドライバが変わればその機能も変わる。
MPEG-1エンコーダって標準装備か?
俺持ってない。存在しないフィルターは使えんよな。
453 :
デフォルトの名無しさん:2007/04/19(木) 07:54:41
沖縄県の方へ(命に関わる注意事項です)
沖縄県での選挙ですが、どうか民主党だけは避けてください。県民の生命に関わる可能性があります。
民主党の最大の公約は一国二制度(※)ですが、一度「一国二制度 沖縄」等で検索をお願いします。
この際、民主党のHPで調べても良いです。以下の注釈↓と矛盾することは書いてないはずですから…
※一国二制度
簡単に言えば沖縄を中国と日本の共有物にし、そこに3000万人の中国人を入植させます。
(つまり沖縄人口の 96% を中国人にして、実質、沖縄を中国人の居住地とします。)
さらに「自主」の名の下、沖縄で有事が起きても自衛隊は干渉できません。
3000万人の中国人が、少数派となった130万人の日本人に何をしても、です。
そして中国人の反日感情の強さは、ほとんどの日本人の理解を超えるものです。
今回の選挙で民主党が勝った場合、「自主」「発展」を連呼しつつ段階的に進めていくことになります。
自主と言っても、自主を認めるのが「住人の96%が中国人となった」後だということに気をつけてください。
発展と言っても、新沖縄の少数派となった「少数民族日本人」の発展ではないことに気をつけてください。
454 :
451:2007/04/19(木) 14:09:38
>>452 えっと、回答ありがとうございます。
トライ&エラーしながら死んでおります。
>色調節のフィルタが存在するのではなくて
>キャプチャデバイスやそのピンのプロパティじゃないのか。
...確かに、自宅で違うWebカメラで試したときは、設定ダイアログの内容がぜんぜん違っていましたね。
>MPEG-1エンコーダって標準装備か?
もう一度探しなおしたデコーダーだけで、エンコーダーはありませんでした。死んできます。
aviだと保存するにも重いから、実用的なサイズに直して自動保存しておいてって言われたんですが、asfかモーションJPEGかDVか、しか使えないのかな?
まぁ、いくらか頑張ってみます。
TMPEGEnc買っちゃいなYO!
456 :
デフォルトの名無しさん:2007/04/19(木) 23:22:24
>>455 GRAPHEDTがあれば買わなくてもいいな俺は。
>>454 MPEG4のコーディック2なら標準装備であるよ。
GraphEdtで↓な構成を書いてみるよろし
「WebCam」→「MPG4Codec2」→「AUXMix」→「FileWriter」
んで「WebCam」のPinプロパティを開いてみる
自分の思った通りに出来る場合
⇒そのままコーディング
自分の思った通り出来ない場合
⇒出来る方法を模索
をやっといた方がはやい
457 :
454:2007/04/20(金) 10:39:55
どうもです、回答ありがとうございます。
一応あの後がんばった結果、DV形式とモーションjpegでは圧縮に成功しました
「うーん、なんかサイズ大きいね。asfで圧縮できない?」
といわれたわけで、メディアフォーマットSDKを読んで泣いています。
小さければ文句言われないのでmpeg4の方が楽かもしれません。
なんか進歩日記みたいになってすいませんが...。
458 :
デフォルトの名無しさん:2007/04/20(金) 20:55:50
>>457 御礼を言うのは大変素晴らしいが、どこまで書いたことを理解できたのか
解るように(回答が的外れでなかったか知りたい)
内容についても一言触れて欲しかったな
と、会社では立場が最下層回答者の愚痴。
最後志貴の方、速度で無い中、対戦お疲れ様でした。
飯食うので、この辺で。
460 :
デフォルトの名無しさん: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での圧縮を模索したのですが、なかなか動くコードにならないで今日が過ぎていきました
461 :
デフォルトの名無しさん:2007/04/20(金) 22:51:49
>>460 ふむ。成る程。
GraphEdtでのフィルタ登録の操作の仕方なのかそれをコーティングするときの方法なのかわからんです。
Clsid(クラスIDの事ね)がわからないと言ってるから↓↓がわからんのでは??
>自分の思った通りに出来る場合 ⇒そのままコーディング
ClsidはGraphedtでフィルタ登録する時に表示されてるよ。
それとも「Graphedt.exe」のアプリを「フィルタグラフ」(コーティング上の概念)と勘違いしてるのかなぁ…
asfはWM ASF ライターを登録して入力ピンにつないでやるだけだから
圧縮コーデックの列挙が必要なavi再圧縮に比べたらよっぽど簡単だよ。
463 :
460: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の、 {ランダムな文字} の間の部分って事ですね。
多分理解しました。
MEDIASUBTYPE_Aviだからじゃねーの?
466 :
460: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つのフィルタがちょっと見たりませんので上の様に逃げています(汗
探し方が足りないのかな?
とりあえず、相手に見せてみます。ありがとうございました。
まだ格闘しなければいけないところがあるので、ほとほと困ったらまた来るかもしれません。
467 :
デフォルトの名無しさん:2007/04/25(水) 16:01:46
以前に出力ピンが2つある場合の出力ピンの区別のことで質問させてもらったのですが、
スプリッタの2つの出力ピンからデータを出力するようにしました。
が、再生すると何も表示されません(音も映像も)。
一方の出力ピンだけ接続し、もう一方の出力ピンは未接続の状態にすると再生はできます。
しかし、オーディオ、ビデオ両方を同時に再生しようとすると、どちらも
再生されなくなります。
原因は何が考えられるでしょうか。
それはただのバグっぽいぞ・・・
各ピン(のインタフェイス)は別々のスレッドから呼ばれる可能性があることを
ちゃんと考慮した作りになっているか、デッドロック等はないか、など考えてみるべき。
あと「再生されません」ではなく、グラフのステートが再生状態になるのかならないのか、
なる場合には停止で止まるのか止まらないのかなど、プログラマらしい情報の出し方を
469 :
467:2007/04/25(水) 19:34:56
>468
もともと1つの出力ピンのソースに、無理やりもう1つの出力ピンを
追加したのが問題かもしれません。
基本的にm_pOutput(元々あった出力ピン)が出てくるところに、
もう1つのピンの処理を追加したような感じです。
>あと「再生されません」ではなく、グラフのステートが再生状態になるのかならないのか、
>なる場合には停止で止まるのか止まらないのかなど、プログラマらしい情報の出し方を
すみません、情報不足でした。GraphEditで確認しているのですが、
再生ボタンを押した後、再生状態にはなっているようです。
しかし、停止ボタンを押すとフリーズし,
The graph was unable to complete pause within 10 seconds.〜
という警告がでる状況です。
deliver で送るプッシュ型のピンですよね。
2つある場合はそれぞれ別のスレッドで動く必要がありますが、
そのあたりは問題ありませんか?
471 :
467:2007/04/25(水) 20:27:13
>>470 deliverは使ってませんが、内容は一緒です。
プッシュ型です。
具体的にはフィルタの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つのスレッドで動かしているような気がします。
スレッドを別々に持つとは、オーディオピンがストップしたとしても、
ビデオピンは関係なく出力できる、みたいな感じですよね。
どう実装すればいいのか…
ビデオレンダラにつながっているピンのReceiveが時間調整のためにブロックすると、
オーディオレンダラにつながっているピンにもデータが来なくなるので、
時間が進まなくなって永遠にブロックするという動作。
出力ピンをCSourceStream から派生させて実装するのが base classes 的には常道。
パースしたビデオ、オーディオのデータをそれぞれのピンの中の Queue (自分で作ること)
に入れておいて、FillBuffer で Queue にあるデータをもとにメディアサンプルを作る。
個人的にはスプリッタを作るなら、ソースフィルタのサンプルコードをもとにして
出力ピンと入力ピンを追加するのが簡単だと思う。
質問です、Direct3Dで、ゲーム中のテクスチャに動画ファイルの映像の
ビットマップを入れ、音声もゲームのカメラ位置に従って右の方にあれば
右寄りの位置から聞こえてくるようにしたいのですが、
とりあえず入門にあるようなSampleGrabberを使う方法ではなく
RendererFilterを継承するのが正解なのだろう、というところまでは
わかったのですが、フィルタを継承して自前で書くのにstreams.hとやらが
ありませんでした。Windows2000ではWindowsSDKがインストールできないので
迂回策を探しています(ちょっと前のPlatformSDKには入ってませんでした・・)。
Windows2000上でフィルタを継承するようなコードを書いてる方は、
どのようにやっているのでしょうか?
他にも「別にRendererFilterを継承しなくてももっといいやり方がある」とか
ツッコミがあればお願いします。
474 :
473:2007/05/08(火) 16:25:19
すみません、間違えてさげてしまったΣ
ついでに訂正・・・
×streams.hとやらがありませんでした。
○streams.hとやらが必要みたいですが、ありませんでした。
何がやりたいかわかりやすく書くと、
ゲームの中のテレビに任意の動画を流したい、ということです。
>>473 D3Dのテクスチャに動画をレンダリングするのは、
SDKのサンプルにそのものずばりのがある。
DirectShow 関連のSDK が利用できないのであれば、
動画ファイルをWMVなりAVIで用意して、AVI関連APIや
Windows Media Format SDKでデコードすれば良いと思う。
476 :
473:2007/05/08(火) 18:42:40
回答ありがとうございます!
>WMVなりAVIで用意して、AVI関連APIやWindows Media Format SDKでデコード
なるほど!動画関連のAPIに詳しくなかったので盲点でした。
その辺はこれから調べようと思うんですが、一つ質問させてください。
>SDKのサンプルにそのものずばりのがある。
これなんですが、WindowsSDKのことでしょうか?
最初DirectXSDKのサンプルかと思ったのですが見当たらなかったので・・・
478 :
デフォルトの名無しさん:2007/05/10(木) 01:38:59
DirectShowに足突っ込んで間もないのですが、質問です。
VMR9を使って動画の再生を行おうとしているのですが、動画の
元サイズとアスペクト比を取得しようと
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を使わざるを得ないのですが・・・
479 :
デフォルトの名無しさん:2007/05/16(水) 14:14:00
どうもすいません。
Webカメラから取った動画を保存できるようにプログラムを書いたのですが、そこまで完成したのを見せたところ。
「こんどはコレ再生して、再生時間を表示できるようにできないかな?」
と言われてしまいましたが、正直何を使って実現すれば良いかどうかから思い当たるところがありません。
そのインターフェースを使えばよいかどうかだけでも、教えていただけないでしょうか…。
IAMDroppedFramesあたりかな、とも思ったのですがいまいち思ったように動いてくれていません。
480 :
479:2007/05/16(水) 14:43:41
すいません。
先ほど、話をしなおしたのですが。私の勘違いがあって。
「Webカメラから取った動画」に「現在の時間」を残せないか?という要求でした。
具体的には動画の何処かの隅っこに、現在時間を画像として書き込んでしまうようなものを想像していたみたいです。
質問するのではなく、自前でフィルタを書くべきみたいですね。すいませんでした。
でも正確なキャプチャ時刻を得るのは難しいよな。
誤差が33ms以内とか
482 :
デフォルトの名無しさん:2007/05/17(木) 00:56:53
あぁ。僕もそんな要望きたからやった。
単に秒まで出すだけならたやすい。
インプレイスフィルタが1番楽。次点は資料がたくさんあるトランスフォームフィルタ。
1・TranceFormメソッドをオーバーライド
2・IMediaSampleからDIBポインタをとる
3・DIB→デバイスコンテキストに変換
4・WinAPIのTextOutで文字書く
5・デバイスコンテキスト→DIB変換
たったこれだけでおk
483 :
460:2007/05/20(日) 19:49:18
ごめんなさい。弱音を吐きます。
結構頑張ったけど、2,3のステップの所のコードが作れません。
時間でいいなら、必要な文字の画像を準備して、合成するだけでいいんじゃね?
厳密なアルファブレンドだと処理が重いから、切り抜き程度でいいと思う。
CreateDIBSectionとかググれ
>>483 客の要求仕様に基づいてプログラムを作ってるならしようがないけど、もしかすると
「
>>460 が作業する工数 >>>>>>> 撮影時に時計を一緒に写す手間」じゃないか?
もしそうなら道楽で予算を無駄遣いしてることになるから、正直適当なとこでやめて
本業に精を出した方がいいような気がする・・・
487 :
483:2007/05/21(月) 17:40:41
みなさん、ありがとうございます。
>>484 うん、最初にそんな感じのことを思いついて、ドット絵の様な汚い文字を無理やり表示させてみました。
どうしても気持ち悪いので、なんとかしたいですが、後回しかも…。
>>484 ヒントありがとうございます。
後日完成を目指すです。
488 :
デフォルトの名無しさん:2007/05/21(月) 21:30:57
フィルタを作成しているのですが、リリースモードでビルドした場合に、そのフ
ィルタを使用すると強制終了が起こってしまいます。
コンパイルエラーは出ません。
デバッグモードでビルドした場合は、問題は起こりません。
強制終了が起こる場所は、おそらくmallocをしているところだと思います。
正確にはmallocを使用している関数で落ちるのですが、その関数の内部は見えま
せん。
デバッグとリリースで、mallocが使えないことってあるのでしょうか。
>デバッグとリリースで、mallocが使えないことってあるのでしょうか。
ありません。
GrapEditをホストにして普通にデバッガで追ってみれば?
491 :
488:2007/05/23(水) 00:27:49
何かよくわかりませんが、msvcrt.libをリンクしないようにしたら上手く行きました。
どうもありがとうございました。
492 :
デフォルトの名無しさん:2007/05/23(水) 08:32:54
>>460よ
フィルタを作るのが最善の解決方法かどうかまだ悩んでいるようだけど自分はそれが1番楽な方法だと思う。
俺はヒントというかフィルタの作り方手順を書いたものだが、手順2、3のどこがわからんのか明確化してくれ。
手順3については
>>485で調べられると思うけど
493 :
483:2007/05/24(木) 10:22:39
>>492 どうも、お手間をおかけして申し訳ありません。
インプレイスフィルタということで、SDKサンプルのEZrgb24を基本に作っておりました。
フィルタのTansform関数で、引数としてIMediaSampleを受けりますが
これを
・DIB形式に変換
・それをデバイスコンテキストの代入
のところで躓いておりました。
一応やっつけ実装で納得はしてもらったのですが、自分で恥ずかしいので、後で直したいというのが正直なところです。
若輩者で申し訳ありません。
494 :
デフォルトの名無しさん:2007/05/24(木) 21:37:23
いや、俺も若輩ものだから…。楽なのはソースを渡して解析して貰う事なんだがな
それすら今は体力的に自信ない
ちょっといいことを教えてあげよう。
EZrgb24ってさインプレイスフィルタじゃないお( ・ω・)∩
違いはね。何のフィルタクラスを継承してるかで決まるんだ
ちなみに「EZrgb24」は「CTransformFilter」を継承してるお
WinAPIのDIBってボトムアップ形式のみでなかった?
497 :
デフォルトの名無しさん:2007/05/25(金) 08:12:46
ボトルアップってどういう意味?
座標原点の話しかな。DIBは他画像形式に比べると上下逆さまだけど、変換時にY座標をマイナス値を指定すればどうとでもなる
ボトムアップなら単語そのままの意味だが
ボトルアップは飲み終わったボトルを投げ上げるという意味だな
499 :
デフォルトの名無しさん:2007/05/25(金) 18:04:09
なるほど〜私はてっきりボトルを飲み干す事かとおもたよぉ〜
で、、意地悪しないでDIBのボトムアップを教えてくれ
>>497でほざいていることがまさにボトムアップ
つーかキーワードがこれだけでてんのに自力で検索くらいしようとは思わんのかね
ただ単にBITMAPの話じゃん 画像いじるなら基礎の基礎
502 :
デフォルトの名無しさん:2007/05/26(土) 12:58:18
自作ソースフィルタってどうやってフィルタグラフに追加するんですか?
IGraphBuilder::AddSourceFilterを使ってもデフォルトのソースフィルタが呼ばれるし、
普通のフィルタ同様に、
CoCreateInstance&AddFilterすると、ソースフィルタに読み込むファイル名が指定できません。
>>500 >>496の聞きたいことの意味がわからんかっただけで
俺は知ってるからおk。
今日はPCだからしらべてみたけど、ボトムアップという表現
はあんまり使われてないぞ??
■Google調べ 「DIB ボトムアップ」検索結果
っミ【114件】
ありがとう。本家MSDNが使ってる言葉なのか
今後使っていくよ。
まぁBITMAPの仕様の話であって
あんまりDirectShowとは関係ないとこで使うことになりそうだけど
>>502 ごめんボトムアップに気を取られていた
自作フィルタを登録する方法はコマンドラインから
「regsvr32 ぱす&自作フィルタ.ax」でレジストリ登録が必要です。
その後「Graphedt」でフィルタグラフに登録できることを確認するんだよ
それでもできなかったらまた質問しましょう
507 :
502:2007/05/27(日) 02:21:11
>>506 すいません、説明不足でしたが、レジストリ登録、GraphEditでの確認は出来ています。
ただアプリケーションから自作ソースフィルタを使ってファイルを読み込む方法がわかりません。
GraphEditで追加したときは、読み込むファイルを聞いてくるのですが、アプリからソースフィルタを追加しても、ファイルを聞いてこないのです。
なるほど。
窓枠の提供はどこがやるの?って事だと認識しました。
自作ソースフィルタを「GraphEdit」で開いた場合、
ファイル選択ウィンドウはディスクトップ画面のド真ん中に出ますか?
もし真ん中に出ない場合、「hWnd」をデスクトップから取っていないことになります。
アプリケーションから渡してやる(=ファイル選択ウィンドウを作って選択結果をフィルタに渡すような設計)
にしてやる必要があるかと思います。
自作ソースフィルタのファイル選択ダイアログを出す部分のソースを晒せば解決できると思いますよ
ソースフィルタはIFileSourceFilterインターフェースを持ってるでしょ。
AddFilterした後でそれを呼び出して(QueryInterface)、Loadメソッドを
実行してやるんだよ。
でも、そんな基本的な所でつまずいてるのにソースフィルタ自作とかよく出来たな。
手っ取り早くソース晒せといいたい
511 :
502:2007/05/28(月) 12:17:00
>>508,509,510
回答ありがとうございます。
>>509 まさにそれでした!ありがとうございました。
無知ですいません。
512 :
デフォルトの名無しさん:2007/05/28(月) 18:24:46
簡易動画編集のようなことをやるために、複数の動画ファイルを連結して1つのファイルにエンコードしようとしています。
いまのところ、ファイルごとに構築した再生用のフィルタグラフから静止画を取り込みまくって
録画用のフィルタグラフに流し込むやり方を考えているのですが、
こういうバカっぽいやりかたでなく、もっとエレガントな方法はないもんでしょうか。
513 :
デフォルトの名無しさん:2007/05/28(月) 23:44:50
この辺を使ってビデオ再生やってます。
IGraphBuilder
IMediaControl
IMediaEventEx
IVideoWindow
IBasicVideo
ビデオ再生自体は問題ないのですが、サウンドデバイスが複数
あった場合に、音声の出力先を指定するにはどうしたら良いで
しょうか?
現状、Windowsの標準のサウンドデバイスのみ音が出ます。
よろしくお願い致します。
DirectShowを使わない
515 :
デフォルトの名無しさん:2007/05/29(火) 03:07:01
ええええええ
まじっすかあああ?
DirectShowって使えねーなぁ!!
ゴミじゃん。M$てめえやる気あんのか?殺すぞ
>>515
真偽の程が全く不明な一文にそこまで熱くなれるのもすげえな
517 :
473:2007/05/29(火) 14:57:28
518 :
デフォルトの名無しさん:2007/06/01(金) 16:33:46
test
DirectShow編集サービスでWMV9のAVIファイル作ろうとしてるんだけど、
エンコードパラメータの設定がうまくできません。
IAMVfwCompressDialogsで出したダイアログだと、変更が反映されないし。
かといってWMV9フィルタの出力ピンからIAMStreamConfigをqueryしてGetFormatするとエラーになります。
AviUtilだとうまくやっているみたいなんですが、やり方が間違ってるんでしょうか・・・
520 :
デフォルトの名無しさん:2007/06/10(日) 04:56:19
__
/:::::::::::::`ヽ_ _
n /::::::::::::::::::::::::::l l L_
,─' ヽ_ _|::::::::::::::::::::::::/) / _彡__
三_ ヽ、 l/::::::::::::::::::::::::ヽ / ∠, - 、:::::::\
`丶、 `/::::ノT` ^ 'l´l:::::|´ /(・|・)) |::::::::::::ヽ
`ヽW ̄  ̄W /ヽ、_●_/ \::::::::l
`1 l ヽ /'´`\_|__三、ヽ::::|
l / / | __ | l:::l
l |__\( ヽ-'"´) //:/
/ , |::::::::::ヽニ二二ニ_∠_'/__
| l /つ 、/(〒) ヽ::::::::::::::::::
ビデオウインドの親ウインドでWM_ERASEBKGNDをDefaultWindowProcに渡さない。
まさかだが、
>>520 は DirectShow にかけたネタなのか?
どらえもんだとおもいます
直見せというか、モロダシ?
527 :
デフォルトの名無しさん:2007/06/12(火) 07:31:58
ドラえもんShoWです。
スマンむしゃくしゃしてやった。
今は反省してる
静ちゃん・・・
静ちゃんは原作名だよね。
原作も途中からアニメに合わせて「しずかちゃん」になってる。
最近にふにふ動画やようつべを見てるんだけどフレームレート変更フィルタ作れば「速聞」みたいなサービス作れるかな
最近ようつべてw
いつの人間だよ
531 :
デフォルトの名無しさん: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)━━━━┥ |___|
Platform SDK インストールしたけど、GraphEdit入ってなかった
>>532 C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Bin\graphedt.exe
カメラって暗くなると露光を変化させるためにフレームレートがころころかわるやん?
フレームレートを一定にするフィルタを作った人いる?
>>533 あ、あった。さんきゅー
スタートメニューにショートカット作ってよねー
フレームレートがころころ変わる??
>>536 うん。そのカメラの最低露光付近で以下を調べる
「カメラ」-「レンダラ」
の接続で「レンダラ」のプロパティ「品質」タブ
平均フレーム率が明るさで変化するのがわかるよ
操作説明する前に何の設定をしている場面なのかを言ってくれ
我々はエスパーじゃないんでね
確かにそういうカメラもあったような気がする。
っていうか安物のカメラは結構フレームレートいい加減だったりする
つかカメラやらタブやら、話が唐突すぎるし悪文だしで理解不能
プロパティ「品質」タブってグラフエディットでの話か?
だとしたらあれはソースそのもののフレームレートではないよ?
俺ならよくわからん糞カメラだけのためのフィルタなど作る気にはなれないな
543 :
デフォルトの名無しさん:2007/06/17(日) 16:58:49
まあ作ってやってもいいが、ここから先はビジネスになるよ
たぶんグラフエディットのことだろうね。
ところでソースそのもののフレームレートじゃないっていうのはどういうこと?
レンダラが捨てるって事?
>>543 まじで?たのむ っI
>>544 ソースフィルタが一定間隔に絵を出してこなくなるということだよ
レンダラが捨てるわけではないみたい
>>545 >ソースフィルタが一定間隔に絵を出してこなくなるということだよ
>レンダラが捨てるわけではないみたい
つまりソースフィルタが実際に出力しているフレームレートだよね。
それが明るさで変動するね、って話だったと思うんだけど。
>>546 うん。その話です。
私は「フレームレートを一定にするフィルタを作った人はいますか?」
という質問をした者なんですが、
暗いときに光を映す場合、フィルムに光を取り込む時間を長めに
取ってやる必要があります。ちゃんとした画像を取り込むのと
シャッタースピードはトレードオフ関係になるのかと思います。
一般的なカメラは上記を自動で行っているので周囲の明るさが変化すると
フレームレートがころころ変わっていく・・・と思っています。
これを時系列処理が必要なフィルタに通した場合問題がおきるので、
フレームレートを一定にするフィルタが必要なのでは?と考えています
どなたか作成した人はいらっしゃいませんか?
>>544 メディアタイプとしてののフレームレートってことだとおもう。
レンダラのレートはレンダラが表示できてるレートってことじゃね?
デコーダがうんこだったりPCすぺっくがうんこだと激低かと
カメラって何だ?デジカメ?かむコーダ?
記録するフォーマットは何よ?グラフ構成は?DirectShow経験有り?
出すべき情報が出てない感じ。
>>549 カメラ・・・USBカメラ(Qcam)を想定していただければいいです
記録フォーマット・・・なし。記録してもしなくてもよし。
グラフ構成・・・ソースフィルタのみ。
ただ、見るために「ソース」-「レンダラ」でお願いします
Directshow経験・・・およそ3ヶ月。画像関係の変換フィルタ作成ならわかるくらい
>>548 PCスペックが悪くてフレーム落ちすることはこの際無いという前提でお願いします
>>538-
>>548 「ソースフィルタのフレームレートが外光によって変化すること」
に話の争点がいっていますが、できれば
「フレームレートを一定にする変換フィルタ」についての事を話したいです。
そのカメラが本当に正しい絵を取るために露光時間を調節しているのかどうかは不明だが
本来なら正しいレートでがんばって出すべきだと思う(この辺はMSがどう設計しているのかによるが。)
で、そのメーカのソースフィルタがそう実装されてないから後ろでなんとかしましょう、ってことですね?
(Qcamって路地クールのやつでしょ。あれはなんかキャプチャした絵を解析しているっぽいから感光待ちじゃないような希ガス)
どっちかっていうとそのカメラのソースフィルタの性能の問題、あるいはバグに近いので
そもそも、それを正しくするフィルタの需要って無い気がする
自分もそういうフィルタはしらない。
でも一般化して「レートを一定にする中間フィルタ」という意味では需要もあるかもしれないね。
タイムスタンプチェックしてバッファしておいた前回映像を投げてやれば良いような気もするが
グラフ構成ソースフィルタのみ??ダウンストリームが無いのに変換フィルタ??
うーん 何がしたいのかますますわかんねーな…
[ソース]-[レンダラ]はダイレクトで繋がるの?メディアタイプはRGB?
本来期待されるべきフレームレートはいくつですか?
ソースが吐き出すタイムスタンプ確認してみた?てんでバラバラの間隔だったのかな
>>552 ご回答ありがとうございます。
「タイムスタンプにて・・・の件」
DirectShowのフィルタ同士の動きはイベントドリブンです。
なので、スレッドを立てて別レートで処理するシステムを考えました
>「ソースフィルタ」-ここ6fps-「レート安定フィルタ」-ここ15fps-〜
私のコーディング技術の問題でレート安定フィルタ以降のアロケータを6fps以上で
使うとロックしてしまいうまくいきません。
>[ソース]-[レンダラ]はダイレクトで繋がるの?
繋がりますが私の想定する使い方とは若干違います。
カメラのフレームレートを争点にしていたのでこれを出しました。
本来使いたいのは
「ソース」-「時系列処理が必要なフィルタ」-「レンダラ」
です。
>メディアタイプはRGB?
なんでもいいです。私の作ったフィルタは「RGB24」「RGB555」「RGB565」「IYUV」
「I420」のいづれかを想定して設計しております。
>本来期待されるべきフレームレートはいくつですか?
固定されていれば何でも。あえて決めるとすれば15fpsでよいです
6fpsのカメラであれば同じ画像を2.5回程度下流ストリームに投げるものでいいです
>ソースが吐き出すタイムスタンプ確認してみた?てんでバラバラの間隔だったのかな
う〜ん。どのカメラでやったか定かではないのですがQcamかbuffaloのカメラでは
バラバラでした。自分でも少々不確定なので試していないということでお願いします
ちょっと前のFPS倍化の話と同じじゃん。
つーか、サンプルのレートばらばらでも動くように作れよ。
555 :
デフォルトの名無しさん:2007/06/18(月) 22:19:44
VMR9でのデインターレースについて調べてるんですが、デインターレース
について何も設定しなければ、デフォルトの設定でデインターレースが有効
なってるんでしょうか?
テストプログラムで調べてるんですが、VIDEOINFOHEADER2のdwInterlaceFlags
が必ず0になってるんで、デインターレースの設定のしようがないんですが・・・
>>555 >VIDEOINFOHEADER2 の dwInterlaceFlags が必ず0になってるんで
「なってるんで」ってのは意味不明だな。0 ならインターレース解除は行われない。
まともな MPEG2 デコーダーでインターレース物のファイルをデコードすれば
適当な値が入るはず。
557 :
555:2007/06/19(火) 16:38:40
>>556 そのメディアが確実にインターレースであると確認する方法がないんですよ。
(見た目ではインターレース縞は確認できるけど)
今、手元にあるDVD数種からVOBをそのままコピーして拡張子をmpgに変えて
テストしてるんですが、InterVideo、Mainconcept、ffdshowどれも0でセット
されてますね。InterVideoはデコーダがインターレース解除じているように
見えますけど。
ffmpeg でのビデオの設定で、インターレース解除はオフに(チェックを外す)、
出力で「オーバーレイミキサーを使用する」「ハードウェアインターレース解除」をオンに、と設定してみて。
559 :
555:2007/06/19(火) 18:07:20
>>558 ありがとうございます。ffdshowでそのような設定にしたところ、
dwInterlaceFlagsに0以外が設定され、VMR9初期状態のデインターレスモード
がGUID_NULLから変化しました。何も設定しなくても、インターレース
ストリームが繋がればデインターレースが有効になっていることが確認でき
ました。「ハードウェアインターレース解除」をオンにするっていうのは
レンダラーにインターレースストリームであることを通知するって意味
だったのね。(わかりにくい)
ハードウエアインターレース解除をONってのは
ハードウエアでデインタレースするって意味だが。
あとオーバーレイミキサを使用したらVMR9はつながらないということはない?
561 :
555:2007/06/20(水) 00:51:24
>>560 VMR9に繋がってますねぇ。まあ、ffdshowのその設定のとこのバルーンヘルプを
見ると、VIDEOINFOHEADER2ヘッダを使用するかどうかって設定らしいので、
VMRと繋がるかどうかは関係ないんじゃないかな。
あと、ハードウエアインターレース解除をONにしないとdwInterlaceFlagsに0
を入れてくるので、VMRにハードウェアデインターレースさせるって意味みたいね。
562 :
デフォルトの名無しさん:2007/06/20(水) 01:44:55
フリーMLの方にも同じ質問してない?あっちにも途中経過報告よろ。
563 :
555:2007/06/20(水) 02:45:26
>>562 あい、あっちにも報告します。
その後、ひとつ確認ミスがあったので、報告を。
InterVideoは自前でデインターレースしているのではなく、VMR9のデインター
レースを有効にしているようです。InterVideoはなぜかデバッグモードでアプリ
を起動すると、接続を拒否するようです。(デバッグトレースを見られるのが
いやなのかな)それで、InterVideoが繋がってるつもりで、実はMaincncept
が繋がっていたという落ちでした(^_^;)
qedit.hとvmr9.hは同居できないかもな。
vmr7.hとvmr9.hは同居できない。なぜなら前者はDirectX7に基づいていて、後者はDirectX9にもとづく。
そしてDirectX7と9は定義の一部が被るので一緒に使えない。
qeditもおそらく同じだろ。
と、さりげなくレスしてみる。
>>564 vmr9.h (+その他もろもろ)がインクルードされた後に、
#define _D3DRMOBJ_H_
#define __D3DRM_H__
#include <Qedit.h>
でOK。
カメラで画像を取り込みながら、画像処理をしたいのですが、
これはDirectShowを使えば可能なのでしょうか?
具体的にいうとカメラから取り込んだ画像は、リアルタイムで画面に描画しながら、
ある間隔でその画像を取得して画像処理を行いたいです。
また、サンプルなどがあれば教えていただきたいです。
可能だYO!サンプルはたくさんあるYO!調べろYO!
568 :
デフォルトの名無しさん:2007/06/25(月) 12:04:22
まず、GraphEditで
カメラ−画像変換フィルタ−VideoRenderer
と繋いであげるといいと思うよ。
画像変換のフィルタは標準では入っていないので、SDK付属のサンプルをビルドしてOSに登録してあげてください。
個人的にはEZrgb24フィルタがお勧め。
VideoRendererはDirectShowフィルタとして標準で入っているので、探してください。
569 :
デフォルトの名無しさん:2007/06/25(月) 22:59:28
フィルタを開発するのに、ある時間の映像を静止画として、メモリに保存しておいて
その画像と現在の画像の差分を出力したいのですが、メモリ上にコピーを保存するコードが分からないのですが
似た様な事を昔やった方や、やり方分かる方いらっしゃらないでしょうか?
単に必要な分だけバッファ確保すればいいんちゃうの?
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 を作成しているんですが,ここが間違っているんでしょうか?
すいません,どうやら非常に恥ずかしい間違いをしていたようです….
このやり方が標準的なのかは分かりませんが,以下のコードで無事表示できました.
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 );
}
573 :
デフォルトの名無しさん:2007/06/26(火) 19:11:56
Transform(IMediaSample *pMediaSample)
で
pMediaSample->GetSize();
と
pMediaSample->GetActualDataLength();
を実行して、メディアのデータサイズを取ったら、どちらも0が返ってきたのですが
これって、何かの使用ですか?
DirectShow のサンプルをみてると JIF, LIF マクロがよく使用されてますが,
機能や使用目的はわかるんですが,これは何の略なんですか?
どうにも気になるんで御教示下さい.
Jump If Failed
Leave If Failed
576 :
デフォルトの名無しさん:2007/06/28(木) 16:02:20
577 :
574:2007/06/28(木) 17:09:12
>>575 有難う御座います.一応ググってみたら LIF の方は Log-If-Failed のようですね.
何はともあれ助かりました.
578 :
デフォルトの名無しさん:2007/06/28(木) 17:11:13
>>577 なら書き込む前にググれよ・・・
それってすげーたち悪いぞ
代わりにググってくれ、という書き込みだったのに
ググってくれなかったから、しかたなく自分でググリました、とさ
( ´_ゝ`)フーン
581 :
574:2007/06/28(木) 17:52:42
失礼,JIF, LIF macro でググっても関係無いページばかりヒットしてしまい,
わからなかったので質問しました.
失礼、すまんかった
Return-If-Failed、てのがあっても良いような
DirectShowのサンプルではこんなの使ってるな。
#define FAIL_RET(x) do { if( FAILED( hr = ( x ) ) ) \
return hr; } while(0)
>>584 やっぱりあるのか・・FAIL_RETか
つかそのマクロの使い方はあれだな、VC6の時のforみたいだな
586 :
デフォルトの名無しさん:2007/06/29(金) 11:51:22
DirectShowでBGMを、DirectSoundで効果音を出そうとしています。
DirectSound側で、IID_IDirectSoundNotifyを用いると、ターゲットのリンク時に
関数が重複しるぞ、ゴルァと言われてしまいます。
リンクしているのは以下のライブラリ
dsound.lib dxguid.lib uuid.lib strmiids.lib
dxguid.libを抜けば、IID_IDirectSoundNotifyのみ見つからないという状態に
なるので、これを使わないコードにすれば良いという話もあるのですが、うまく
共存させる方法はないでしょうか。ご教授お願いします。
CComPtr を std::vector に入れても大丈夫?
std::vector< CComPtr<IMoniker> > vtIMonikerArray;
というふうに使いたいんだけど,std::auto_ptr をいれるときのような問題はありますか?
>>587 少なくともauto_ptrのような問題が起きることはない
安心して突っ込みたまえ
589 :
587:2007/06/30(土) 21:11:13
590 :
デフォルトの名無しさん:2007/07/05(木) 09:35:54
再生レートを設定できるようスプリッタにIMediaSeekingを実装したのですが、
実際にアプリから使用してみると、SetRate(8.0)のように高いレートを設定すると
エラー0x8004025cが返ってきます。
スプリッタ内部のSetRateでは、レートの制限をつけていないのですが、
どうしてかわかりますでしょうか?
たぶんオーディオレンダラだな。
現在、プログラムを全画面モードで動作させ、そこからムービーを再生(全画面)しようと
しているんですが、なぜかムービーウィンドウがトップにならず、
プログラムウィンドウの裏にまわったりして、きちんと再生されません。
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);
593 :
590:2007/07/06(金) 09:52:06
>>591 オーディオレンダラをフィルタグラフから外すと成功しました。
ありがとうございました。
しかし、いちいち外したり、接続したりするのは面倒ですね。。
>>592 何再生してもそうなる?
ビデオデコーダにDivX本家使うと、再生開始時に何かにアクティブ
ウインドウ奪われちゃうって経験はあるけど。
595 :
594:2007/07/06(金) 12:35:38
>>592 それよく見たら、全画面表示するにはメインウインドウの子
じゃできないような。親をNULLにしたらいいんじゃない?
DirectShowで画像を回転させるフィルタでいいのない?
逆さ向けてビデオとってしまったんだorz
>>596 ワロタ
てかその修正をフィルタに任せるなよw
動画編集ソフトで回転させるとか
動画を反転回転できるプレイヤー使うとかあるだろ
598 :
592:2007/07/07(土) 18:37:34
>>549>>595 ご返事ありがとうございます。
>>594 再生しているmovieは特別なコーデックを必要としないので、違う原因かと思います。
>>595 親をNULLで再生すると、再生時にメインWIndowが最小化してしまい、全画面モードが
通常画面に戻ってしまいます。(movieは左上で再生)
もうすこし詳しく症状を説明すると、まったく再生しないわけではなくて
成功・失敗をランダムで繰り返します。
成功すれば、メイン画面の前にVideoWindowが出て、普通に再生。
失敗すると、メイン画面の裏にVideoWindowがいるようで、音だけ再生。
このような感じになります。
色々とネット検索したところ、VideoWindowを再描画することで回避可能と見つけたのですが、
組んだところうまくいきません。(症状は同じ)
HWND hChild = GetWindow(m_hwnd,GW_CHILD);
InvalidateRect(hChild,NULL,true);
うーん・・・
それは、親ウインドのバックグラウンド再描画で映像ウインドが消されてしまうからじゃないかな。
親ウインドのWM_ERASEBKGNDをDefaultWindowProcに渡さないようにして試してみな。
case WM_ERASEBKGND:
return 0;
でOK
>>599ご返事ありがとうございます。
入れてみましたが、現状変わらずです。
元々WaitForCompletionで処理を止めている状態ならウィンドウメッセージが
ムービー再生中に取れることも無いので、SetNotifyWindowでイベント登録
に切り替えてみましたが、やはり同じ状態です。
WaitForCompletionで再生しても裏に回った状態になるので、
WM_ERASEBKGNDを無視しても、同じ症状になるのだと思います。
再生中に定期的にInvalidateRectをVideoWindowに送ってもみましたが、
やはり裏の時は裏で再生されます。
うーむ、もう少し調べてみます。
親ウインドは何?
ダイアログ?それともダイアログに貼り付けたCStatic?
>>601 以下のスタイルで画面切り替え時にSetWindowLongしたものです。
WS_POPUP | WS_SYSMENU | WS_VISIBLE | WS_BORDER
WMPみたいな全画面をやりたいなら、普通にStayOnTopで画面いっぱいのサイズにするだけでおk。
>>602ご返事ありがとうございます。
以下のような方法でVideoWindowにTOPMOSTを指定しましたが、
どちらも結果は変わらず、表に出たり裏に回ったりします。
1.
pVideoWindow->put_WindowStyleEx(WS_EX_TOPMOST);
2.
HWND hChild = GetWindow(m_hwnd,GW_CHILD);
::SetWindowPos(m_hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
うーん。
ふとスレ見直したんだけど、ownerじゃなくてparentでないのか?
窓の設定が間違っている予感。
もうDirectShow関係なくね?
>>605ご返事ありがとうございます。
すいません、それは具体的にどのようにすればよいでしょうか?
Owner指定なしで、最大化はできんの?
>>608 Owner指定無しだと、元の全画面ウィンドウからVideoWindowに移る際に
全画面モードが解除されます。(Movieは左上で再生)
これは、put_FullScreenMode()を実行しでも同じような動作になります。
通常画面からput_FullScreenModeをつかえば全画面でムービー再生してくれるのですが、
全画面モードから使うと、逆に全画面が解除されるようです。
うーん。
610 :
599:2007/07/08(日) 22:11:45
ウインド関係がよくわからない。
ビデオウインドの親ウインドは何?
このウインドを仮にhParentとすると、
hParentウインドに親はいるのか?(or最初からWS_POPUP?)とか
hParentウインドのスタイルにWS_CLIPCHILDRENは設定されているのか?とか
hParentウインド自身は全画面サイズに引き伸ばされ、且つTopに表示されているの?とか
hParentウインドのWM_ERASEBKGNDをちゃんと無視しているの?とか
put_Ownerするタイミングとか
そういうことが知りたい。
611 :
592:2007/07/08(日) 22:36:34
>ビデオウインドの親ウインドは何?
CreateWindowしたWindowが親です。
>このウインドを仮にhParentとすると、
>hParentウインドに親はいるのか?(or最初からWS_POPUP?)とか
画面切り替え時にWS_POPUPとしています。
>hParentウインドのスタイルにWS_CLIPCHILDRENは設定されているのか?とか
指定していませんでしたが、元々メッセージ処理するつもりではなく、movie再生終了まで
処理停止するプログラムです。
pMediaEvent->WaitForCompletion(15000, &eventCode); // 15秒経過するかmovie再生が停止するまで待つ
また、入れてメッセージ処理をするようにしましたが改善されませんでした。
>hParentウインド自身は全画面サイズに引き伸ばされ、且つTopに表示されているの?とか
はい、全画面でTOPです。
>hParentウインドのWM_ERASEBKGNDをちゃんと無視しているの?とか
これも前に書きましたが入れても改善されませんでした。
>put_Ownerするタイミングとか
基本は
>>592のソースですが、put_Visibleの直前まで、1行ずつ移動させても改善しませんでした。
また、その前にはVideoWindowの取得になるので移動できません。
こんな感じてす。何か判りますでしょうか。
612 :
599:2007/07/08(日) 23:12:43
この手の問題は大抵は、ビデオレンダラが描画したあとに親ウインドが背景をリフレッシュすることで発生する。
タイミングによってはリフレッシュが先に発生し、あとからビデオレンダラの再描画が行われ、表示される場合もある。
したがって親ウインドがある場合、親ウインドのWM_PAINTの描画処理をクリップして、且つERASEBKGNDをさせなければならない。
WS_CLIPCHILDRENやWM_ERASEBKGNDの処理を確実にしなければ効果がない。
ビデオレンダラの親ウインドにWS_CLIPCHILDRENをいれてみたらどうなる?
もしダメならほかの理由かもね。
613 :
592:2007/07/08(日) 23:36:52
>>612 >したがって親ウインドがある場合、親ウインドのWM_PAINTの描画処理をクリップして、且つERASEBKGNDをさせなければならない。
>WS_CLIPCHILDRENやWM_ERASEBKGNDの処理を確実にしなければ効果がない。
WM_PAINTのクリップ、WM_ERASEBKGNDをDefに流さない、WS_CLIPCHILDRENを入れる。
全てやってみたんですが、やはりダメでした。
>ビデオレンダラの親ウインドにWS_CLIPCHILDRENをいれてみたらどうなる?
上でも描きましたが、入れてみても症状は変わらずです。
そもそもWaitForCompletionで、再生終了まで待つ処理でも症状がでるんですよね。
で、再生終了をイベント取得に切り替えて、PAINT処理を切ったりしてもやはり同じくだめでした。
うーん、タイミング問題だとは自分も思うんですが・・・。
もう少し調べてみます。
614 :
592:2007/07/09(月) 12:22:04
皆さん色々と助言をありがとうございます。
すこし原因らしきものが見えましたのでご報告します。
メインWindowの描画にDirect3Dを使用しているんですが、
全画面モードで
メイン画面の描画を一切やらない → 100%ムービー再生に成功
一度だけDirect3Dでサーフェイスのクリア → 表と裏のランダム再生
一度だけDirect3Dでメイン画面を描画 → 表と裏のランダム再生
どうやらDirect3Dのフロントバッファが問題を起こすようです。
引き続き対策を調べて見ます。
615 :
592:2007/07/09(月) 14:40:31
結局、スマートな方法が見つからず、ムービー再生時には
IDIRECT3DDEVICE9のリセットをおこなってから再生するようにした所
うまくいくようになりました。
おさわがせいたしました。
貴重なご意見をいただき、ありがとうございました。
なぜそんな重要なことを。。
Direct3Dということはゲームのムービーでしょうか?
聞いてどうすんの
#include <qedit.h>
と
#include <d3d9.h>
を一緒にするとエラーが出るんです。
順番変えてもエラーでます
対応策ってありますか?
環境とエラー内容は?
環境は、
VC2003で
Microsoft DirectX 9.0 SDK Update (December 2004)
だと思います。
#include <d3d9.h>
#include <d3dx9.h>
#include <dshow.h>
#include <qedit.h>
と書くと
c:\DXSDK\Include\d3drmobj.h(46): warning C4005: 'WIN_TYPES' : マクロが再定義されました。
c:\DXSDK\Include\d3drmobj.h(274): error C2061: 構文エラー : 識別子 'LPDIRECT3D'
・・・
等が出ます。
#include <dshow.h>
#include <qedit.h>
#include <d3d9.h>
#include <d3dx9.h>
と書くと
c:\DXSDK\Include\d3dx9math.inl(1924): error C2039: 'm' : 'D3DXMATRIX' のメンバではありません。
c:\DXSDK\Include\d3dx9math.h(310) : 'D3DXMATRIX' の宣言を確認してください。
c:\DXSDK\Include\d3dx9math.inl(769): error C2065: 'm' : 定義されていない識別子です。
c:\DXSDK\Include\d3dx9math.inl(775): error C3861: 'm': 識別子は、引数依存の照合を使用しても見つかりません。
・・・
等が出ます。
>>621 d3drm〜ってファイル名から明らかだが
qeditがDirectX7を使ってるからだろ?
一つのコンパイルパスにおいて複数のバージョンのDirectXは同居できない。
>>564-565 にズバリな事が書いているような気がするんだが、これは試したの?
ああ、違うバージョンのDirectX自体が同居できない訳ではないな。
ちょっと訂正
624 :
619:2007/07/10(火) 14:56:28
>>565 で通りました。
ありがとうございます><
現行スレを検索することくらい、答える側にやらせないで自分でやれよ…ったく
うわ
まいったねこりゃ
まぁいいじゃん。過去ログにまさかズバリがあるとは思わないだろう。
ここ過疎気味だし。
YUVの4:2:2→4:4:4補間するDShowフィルタってあるんでしょうか?
ない
631 :
629:2007/07/11(水) 07:35:29
632 :
デフォルトの名無しさん:2007/07/11(水) 23:00:21
YUV422→444作れ。簡単だ。それが嫌なら500円くれたらやる。
633 :
デフォルトの名無しさん:2007/07/12(木) 02:13:15
すいません、オーディオ、ビデオの2つの出力ピンのあるスプリッタを作成してるのですが、
2つの出力ピンともレンダラと繋いで、オーディオのみのファイルを再生すると、音声が流れません。
スプリッタのビデオ出力ピンを未接続にし、オーディオ出力ピンのみをレンダラと繋ぐと音声は再生されます。
ピンから出力データが無い場合に、そのピンを接続するのはいけないのでしょうか?
何とか、ビデオピンも繋いで、オーディオのみのファイルの再生をしたいのですが、
どうしたらよいでしょう?
PlatformSDK WindowsServer2003 R2をインストールしました
ドキュメントにはサンプルのTextOutがさもあるように書いてあるんですが
どこにあるかわかりません。
どこにあります?
そのほかのサンプルもなんか無いんですが。。
それは古いSDKをとってこないと無いはず(DXSDKまで遡らないと無いものもあり)。
あ、そうなんだ。ありがとう。
ちょっくら探してきます。
幼女と老婆を酷使する番組w
↑
間違えた。無視して
だが断る
640 :
デフォルトの名無しさん:2007/07/17(火) 18:48:32
DirectShowはょぅじょとばばぁを酷使しますね。
フィルタをシェアウエアで出したいんだがいいとこある?
どんなフィルタ?
642 :
デフォルトの名無しさん:2007/07/18(水) 12:24:38
たとえば
>>401の拡張したやつ
顔を検出するやつ
動物体を検知するやつ
あとはサンプルグラバのこったやつ
パターン認識のフィルタならどっかになかったっけ?フリーで。
javaで顔認識で心霊写真チェッカーみたいなのがあったけどね。
645 :
デフォルトの名無しさん:2007/07/18(水) 22:32:22
windows2000で最新のPlatformSDK入れたヤツ居る?
BaseClassesをnmakeしようとすると
makefile(53) : fatal error U1083: ターゲット マクロ '' が展開されません。
って出るんだけど・・・。
複数のBMPから、AVIを作りたいなーと思って調べていたのですが、
DirectShowのフィルタを自作しなければできないのでしょうか??
647 :
デフォルトの名無しさん:2007/07/19(木) 22:14:14
別にヘッダさえ付けてやればできる(俺はそうした)
使った方があとあとシステムにしやすいから作ったら??
648 :
デフォルトの名無しさん:2007/07/19(木) 22:19:26
ちなみに自分ならBMPファイルを連続で読み出しメディアサンプルに乗せるだけのソースフィルタを作る。
2週間程度時間があればね〜☆
時間なければヘッダを直にバイナリにかく。
今ビデオ見てて気づいたけどさ
ド、ド、ドリフの大爆笑〜♪ というところ
ダ、ダ、ダイレク、ダイレクトショウ〜♪ に聞こえるよな
650 :
デフォルトの名無しさん:2007/07/19(木) 23:12:20
いや、それはない
ありがとうございます!勉強してみます!
652 :
デフォルトの名無しさん:2007/07/20(金) 22:24:49
がんがれ〜RIFFチャンクは先頭に付けてLISTチャンクはBMPの生画像の間に付けるんだぞ〜。
後動画によっては上下さかさまに気をつけて〜。(たぶん問題ないけど)
>>649 クソワロタ.うん聞こえる。ダ、ダ、ダイレク、ダイレクショウ〜♪
ないない
すいません。質問です。
動画を一律30FPSにするDirectShowのフィルターってどう作ればいいですか?
方法が思い浮かばないので・・・ヒント教えてください
タイムスタンプいじるとか
657 :
デフォルトの名無しさん:2007/07/22(日) 19:41:18
作れたら私にも使わせてください
質問です。
2つの映像入力を何らかの形で合成し
1つの出力として吐き出すフィルタを作成しています。
最終的に、出力ピンに繋がった入力ピンのReceive()に
合成結果であるIMediaSampleを渡せば良いというのはわかるのですが、
映像の同期がうまくとれません。
(同期というかそれぞれの入力から1フレームずつ取得して出力したい)
どのようにすればよいでしょうか?
【派遣ネガティブ根性チェック】
3つ以上、チェックがつけばアナタの性格はひん曲がっており、
ネガティブ負け組派遣人生を歩んでいます。
□派遣先正社員の作った糞開発ツールはたとえ腐っててもマンセーして使う
□派遣先の人事権のある社員の意見はたとえ間違っていてもマンセーする
□仕様とは正社員から口伝されるものだ
□耳で聞いた仕様を正確に覚えていないのは自分の責任だ
□昼食は必ず派遣先の社員と行くべきだ
□自分の仕事で問題が発生しても解決するのは派遣の仕事ではない
□派遣先から「いつまでもここで仕事してくださいね(安い金でw)」と言われて嬉しい
□自社で仕事なんてできるわけがない
□派遣労働の問題点の話題が出ると感情剥き出しにして反論する
□派遣労働の問題を指摘する人は嫌いだ
□派遣先には仕事だけでなくプライベートについてもグイグイ引っ張って欲しい
□奢ってくれる派遣先正社員を尊敬する
□自分の月額金額を知らないのは当然だ、単金を聞いてはいけない
□派遣先正社員より自分の生涯収入が低いのは当然だ
□チビは派遣先にかわいがってもらいやすいから派遣には有利だ
>>658 入力Aと入力B、両方受信を確認してから合成、出力すればいいだけの話じゃないの?
入力ソースがライブ(プッシュ)だったりする?
661 :
658:2007/07/24(火) 10:24:31
>>660 AddSourceFilterでハードディスク上のムービーファイルを扱う場合って
どっちになるんですかね?
プッシュモデルにするかプルモデルにするかは
やっぱりソースフィルタに依存します?
>>661 ハードディスク上のムービーファイルなら通常プルモデル。
パーサー(スプリッタ)がデータを引っ張り出して後ろに流します。
んで入力2系統あるらしいけど、両方ともハードディスク上のムービーファイルなの?
ファイル形式はなんですかね?
キャプチャピンのIAMStreamConfig で設定する。
Connect する前にね。
665 :
663:2007/07/25(水) 21:56:05
>>664 有難う御座います.おかげさまで以下のようにして取得と変更が出来ました.
CComPtr<IAMStreamConfig> pAMStreamConfig;
hr = pCaptureGraphBuilder2->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
pVideoDeviceFilter, IID_IAMStreamConfig,
(void **)&pAMStreamConfig);
if( SUCCEEDED(hr) )
{
AM_MEDIA_TYPE* pMediaType;
pAMStreamConfig->GetFormat( &pMediaType ); // 現在の設定を取得
pMediaType->subtype = MEDIASUBTYPE_YUY2;// YUY2 に変更
VIDEOINFOHEADER* pVideoInfoHeader = (VIDEOINFOHEADER*)pMediaType->pbFormat;
pVideoInfoHeader->bmiHeader.biWidth = 640; // 640 wide
pVideoInfoHeader->bmiHeader.biHeight = 480; // 480 height に変更
pAMStreamConfig->SetFormat( pMediaType );//設定を反映
DeleteMediaType( pMediaType );
}
列挙も pAMStreamConfig->GetNumberOfCapabilities() と GetStreamCaps() で実現できそうです.
有難う御座いました.
666 :
658:2007/07/27(金) 15:52:03
>>662 >両方ともハードディスク上のムービーファイルなの?
>ファイル形式はなんですかね?
とりあえずは両方ともハードディスク上のもので
ファイル形式はAVIでやってます。
668 :
667:2007/07/31(火) 15:46:23
補足です。
DivXファイルだとISampleGrabberCBでのコールバックの指定も無視されてしまうようです。
キャプチャされないように何かロックされてる?
まずフィルタグラフ全体がどうなっているか調べると良い。
あとpbFormat以外のメジャータイプとサブタイプを見たほうがいい。
もしかするとDivX6はパーサーとデコーダがセットで使用されていて、
パーサーとデコーダは互いを知っているのでpbFormatなんか使わないっていう実装かもしれん。
そこにサンプルグラバがパーサーとデコーダの間に挟まれば、ありうる。
670 :
667:2007/07/31(火) 17:32:37
>>669 ありがとうございます。
さらに調べてみたら、どうもDivXはRGB24への自動変換をサポートしていなかったり結構中途半端な模様。
で、レンダラまで自前実装してやるとキャプチャできる(SDK付属サンプルのWindowlessなら動く)ようなので、
そっちをベースにした実装にしたいと思います。
フィルタの中でビットマップをリサイズするようにしたらすごく遅くなった
コマ落ちばっかりです
なんか早くする方法はありませんか?
リサイズ処理を見直す
どうやってリサイズしてるんだ?
普通にCで書いて間に合わないんなら、SIMD命令使え。
それでも間に合わないんならPCをパワーアップ。
ロジックが悪い。
すいません。質問です。
CTransformFilterの中で今の時間を取得することはできますでしょうか?
シークするとTransformに渡ってくるIMediaSampleのGetTimeやGetMediaTimeの時間が0に戻ってしまって、今の時間がわからなくなってしまいます・・・
それからCTransformFilterから動画の長さ(再生時間の合計)を知る方法ってありますか
今の時間・・・?エスパーすると聞きたいことは「動画スタートしてからの時間」だとは思いますが、現在時刻の取得は下記のようにできます。
SYSTEMTIME st;
GetLocalTime( &st );
こんな感じ。
CTransformFilterから動画の長さをとることはできますが、フィルタ設計上
カメラもつなげる想定で作るべきっぽいから書いていいんだろうか
動画スタートしてからの時間でした。すいません
教えてください〜
動画であれば投げてきたフレーム枚数をカウントしてやって
それをfpsで割るのが「動画スタートからの時間」を得るのには最適だと
思うよ。変にタイマを使ったりすると動画のレートが変わった時点で
使えなくなっちゃうから。わからんならコードをどっかにうpするよ
んで動画の長さを得るのは、ソースフィルタから変換フィルタに渡してやるような
つくりにするのはどうでしょうか?
679 :
デフォルトの名無しさん:2007/08/03(金) 19:35:31
DirectX SDKのドキュメント探したけど
"シーク可能ストリームでは、メディア タイムは常にストリームの開始タイムから相対的になる。"
とあるからGetMediaTimeはシークしても時間は0にならないみたい。
さっき試してみたけどそうなっていました。
IAMCameraControl::GetRange()でCameraControl_Exposureの範囲を調べたのですが、
手持ちのWebカメラでは0〜100や0〜130といった値が返ってきました。
http://msdn2.microsoft.com/en-us/library/ms779747.aspx によると、2^0 = 1sec〜2^130secといった、大きな値に相当してしまいますが、
単位はあてにできないのでしょうか?
せめて+1する毎にexposure timeが二倍になってほしいのですが、
何か方法があったら教えてほしいです。
Webカメラに露光時間なんて設定可能なの?
露光時間って、写真の撮影で、弱い光でも感光版が感光できるようにシャッタースピードを遅くするとかのあれだよな?
キャプチャをするのに
pCaptureGraphBuilder2->SetOutputFileName( &MEDIASUBTYPE_Avi , L"test.avi" , &pFileOut , &pSink );
pCaptureGraphBuilder2->RenderStream( &PIN_CATEGORY_CAPTURE , NULL , pDeviceFilter , NULL , pFileOut );
というようなグラフ構築を行ったのですが、何回かテストしてtest.aviを上書きするとき、
上書き前の容量より小さいと、ファイルのプロパティに表示される容量が上書き前のまま
になります。(上書き前より大きいと更新されます)
再生してみると、正しくキャプチャされているのですが、この容量表示の問題はどのように
すれば解消できるでしょうか?
(表示上だけでなく、実際に無駄な容量が付加されているのかも?)
685 :
683:2007/08/07(火) 21:00:18
>>684 上書きは基本的にしないようにするもの、ということですね。
ありがとうございました。
領域確保しとくとキャプチャの時パフォーマンスが良くなる効能があると言っておこう。
削除の場合は実際にエントリが書き換えられるので、サイズを0にするのも有り。
RIFF解析して自前でサイズ調整するのも意外と簡単だよ。一番外側のチャンクだけ計算するだけで済むしな。
687 :
683:2007/08/09(木) 00:58:47
>>686 そういう方法もあるんですね。
ありがとうございます。
3:2プルダウンを行うDirectShowフィルタってあるんでしょうか?
サンプル元に作っちゃえば早くね?
>>688 世界中のソフトハウス探せばどっかにあると思う。
691 :
688:2007/08/09(木) 23:30:48
なるほど。
簡単に手に入れられるなら作る必要もないと思ったのですが、作る価値はありそうですね。
やってみます。
ありがとうございました。
Nullレンダラが作れなくて困っています。
GraphEditではあるのですが、アプリでインスタンスを作成できません。
CoCreateInstance( CLSID_NullRenderer , NULL , CLSCTX_INPROC_SERVER , IID_IBaseFilter , ( void** )&pNull );
このように書いたところ、ビルド時にCLSID_NullRendererが定義されていない、と言われます。
調べてみると、qedit.hにあるようなので、includeしたところ、今後はdxtrans.hがないと言われました。
でも、このヘッダファイルはPC内にはありませんでした。
どのようにすれば作成できるでしょうか?
>>692 そのファイル名で検索すると幾つか情報が見つかるんだが・・・
俺のPCにはDirectX SDKの中に普通に入ってた。
つかDirectXSDKとPlatformSDKはいつのを使ってるかくらいは書いたほうがいいと思うぞ。
694 :
692:2007/08/11(土) 14:06:01
>>693 Windows SDKのバージョンは最新だと思います。
DirectX SDKはインストールしていませんでした。
最新版のJune 2007を入れたら、それに入っていました。
VC++でインクルードパスを指定したのですが、それでもコンパイルはエラーになります。
エラーの内容は、DirectX SDKのIncludeフォルダにあるd3drmobj.hというファイル内に
構文エラーがある、というものがたくさん。
あと、
To compile qedit.h you must install the DirectX 9 SDK, to obtain the dxtrans.h header.
というエラーメッセージも。
FLVファイルのシークでIMediaSeeking::SetPositions()を使うとフリーズしてしまいます。
必ず発生するというわけではないのですが、高確率で発生します。
スプリッタにflvsplit.dllを使用した時のみこの現象がおきます。
WMPやMPCでは普通にシークできているので、コーディングの問題だと思うのですが...
思い当たる点として、WMPやMPCと違う部分はISampleGrabberを咬ませていることぐらいです。
(シーク時にSetBufferSamples(FALSE)を指定しても変化無しでした)
原因が分かる方はいませんでしょうか。
697 :
695:2007/08/11(土) 14:34:19
>>695に追加
フリーズと言ってもCPU使用率が0%なので、処理をしているわけでは無いみたいです。
698 :
692:2007/08/11(土) 15:47:32
>>696 すみません、そのレスは見てませんでした。
早速、試しましたけど、ダメでした。
>>698 GUID CLSID_NullRenderer = {0xc1f400a4, 0x3f08, 0x11d3, {0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37}};
>>698 レスがそうさくしてめんどいのであまり読んでないが、
NULLレンダラのCLSIDが定義されているヘッダを読み込んだら
こんどはDirectXのヘッダが見つからないって言われたんだろ?
最新のPlatformSDKでDirectShowを使うには同時にDirectXSDKをインストールする必要がある。
もう試した?
>>700 のようにソースにじかに定義しても動くだろうが、PlatformSDKとDirectXSDKをインストールするのが正しい解決方法。
702 :
デフォルトの名無しさん:2007/08/11(土) 17:41:03
>>701 >>693 >>694読めよ・・・ 指摘されてどっちもインストールした、って書いてんだろ
あと「レスがそうさく」、って何? 「錯綜」(さくそう)って言いたいのかな?
レス読まずに余計なレスすると余計にレスがそうさくするよ?
まずは日本語を勉強して、レスをちゃんと読むことから訓練しましょう。
703 :
デフォルトの名無しさん:2007/08/11(土) 18:26:35
まぁまて。間違った情報で答えてる訳でもなし、がんがって回答してくれようとしてる
>>701さんせめちゃらめぇぇ。
質問者はスレを全く検索せずに質問
回答者はレスを全く読まずに回答、しかも日本語が不自由
これはひどい
',::::j ==ュ r== 〈::::::j
fヾ}.., __ i i..__ l:イ めんどい!
lと', ゚ ̄ ,l l  ゚̄ ,リぅ!
ヽ-ヘ .,_ ,ィ''。_。ヽ、_,. /_ン' レスがそうさくしてめんどい!
', / _ } ,'
l、{ |__〉 /!
フィルタの作成と開放についてなんですが、
基本的には
CoCreateInstance( ・・・ );
pGraphBuilder->AddFilter( ・・・ );
・・・
pCaptureGraphBuilder2->RemoveFilter( ・・・ );
pFilter->Release();
という流れですが、以下のようにリリース前に再度作成、追加するのはマズいでしょうか?
CoCreateInstance( ・・・ );
pGraphBuilder->AddFilter( ・・・ );
・・・
pCaptureGraphBuilder2->RemoveFilter( ・・・ );
・・・
CoCreateInstance( ・・・ );
pGraphBuilder->AddFilter( ・・・ );
・・・
pCaptureGraphBuilder2->RemoveFilter( ・・・ );
pFilter->Release();
707 :
デフォルトの名無しさん:2007/08/12(日) 21:50:14
pFilterってフィルタグラフの事じゃないの?
だとしたら基本的に下なんじゃない?
ソースフィルタだけを入れ変えたい時など、わざわざフィルタグラフごと新規で作り直したりはしないよ。
708 :
706:2007/08/12(日) 22:10:24
>>707 すみません、pFilterというのはIBaseFilter型DirectShowフィルタの例です。
おっしゃる通り、キャプチャデバイスフィルタなどを入れ替えるときに下の手順を踏んでいます。
問題ないようであれば良かったです。
ありがとうございました。
CComPtr 使ってみれ
710 :
706:2007/08/13(月) 11:15:01
>>709 これは便利ですね。
ありがとうございます。
SetOutputFileName()メソッドとRenderStream()でキャプチャデバイスからの映像データを
AVIファイルに保存するようにしました。
キャプタを実行 → グラフ停止 → ファイルライタに繋がるピンを切断
と進めるた時点では保存したAVIファイルは再生できるのですが、上記流れの後、グラフを再生
すると、AVIファイルが使用中となり再生できなくなります。
アプリを閉じれば再生は可能ですが、アプリ使用中においても再生できるようにするには
どのようにすればよいでしょうか?
なお、ファイルライタはRelease()で参照カウントのデクリメントを行っています。
よろしくお願いします。
712 :
692:2007/08/16(木) 08:08:47
>>700 これでできました。
ありがとうございました!
Webカメラの映像を録画する単純なプログラムを作っているのですが
・キー入力があるまでプレビューを表示
・キー入力があると録画を開始
上記を行うために、録画前にStop()→キャプチャピンを繋ぐ→Run()としてるですが
Webカメラの露光やホワイトバランスなどの自動設定が初期化されるので
プレビューの状態からStop()せずに録画を行う方法はありますか?
714 :
デフォルトの名無しさん:2007/08/21(火) 11:40:44
コンポジット入力から映像を取得したいんだけど
DirectShowで取得できるハード知らない?
io dataのGV-MVP/TZが手元にあるんだけど、なんか無理そうなんだ
>>713 キャプチャピンの先にFileWriterか何かつないでるんかな。
SampleGrabberやTeeを挟んで自前で横取りするようにしてみては。
>>714 GV-VCP3R/PCI はダメ?
これでアプリ書いてるけど普通に
S-Video×1、コンポジット×2の
キャプチャデバイスとして見えてる。
もっとも玄人志向のTVチューナ付きに比べると
かなり高いのが難点やなあ。
718 :
デフォルトの名無しさん:2007/08/24(金) 16:03:37
すみませーん、DirectShowとか初めて使うんですけど、仕事の書類に
「DirectShow.dllにアクセスして・・・云々」って書いてあるんです
けど、PlatformSDKインスコしてもDirectX9.0cインスコしても、そん
なのどこにもないんですよー。DirectShow.dllって自前で作るんです
か?どうやって?
その書類、DirectShow と DLL の間のピリオドはほんとにあったのか?
自社製の共通DLLナンジャネ?
.NETでそんな名前のDLLを見たような気がする
間違えてzipで固めたmp3ファイルをDirectShowに流し込んだら再生された
すげえな
zipを展開して再生してるわけじゃないぞ
たぶん
Stored(非圧縮)で格納されてるならmp3データの先頭まで検索してそこから再生する
Inflateで格納されてたらNG
あっち方面ではmp3をアルバム単位なんかで無圧縮zipで固めたものが良くある。
関連付けの都合なんかで.zip.mp3なんて拡張子が付けられていることも当たり前。
726 :
デフォルトの名無しさん:2007/09/03(月) 00:13:21
Meida Playerのレンダリングプラグインが作りたくて
Media Plyaer SDKと戦っているんですが、
どっかわかりやすいwebページありませんか?
散々ぐぐったけど日本語で書いてあるのはGoogleキャッシュにのこってた
1サイトしかありませんでした。
http://72.14.235.104/search?q=cache:msvxh08gfA0J:developer.mine.nu/ wiki/index.php%3FWMPSDK%252FDSP%25A5%25D7%25A5%25E9%25A5%2
5B0%25A5%25A4%25A5%25F3%25B2%25F2%25C0%25E2+%E3%81%82%E3%8
1%84%E3%81%9D%E3%81%B3%E3%80%80%E9%96%8B%E7%99%BA+Meida+Player+SDK&hl=ja&ct=clnk&cd=4&gl=jp
727 :
デフォルトの名無しさん:2007/09/06(木) 04:28:02
CTransformFilterを継承してフィルタを作成すると
それを読み込んだアプリケーションの終了時にメモリリークが出る
最初は解放の手順が間違っているのかなと思ったんだけど
Grapheditでそのフィルタを読み込んだときも、終了時にエラーがでる。
CTransformFilterを継承しているインプレイスフィルタでも同じ
考える限りSDKにうついているCTransformFilter自体に根本的なバグが隠れている気がするんだが…
アレだよ、アレ。COM。
729 :
デフォルトの名無しさん:2007/09/07(金) 17:17:21
フィルタのピン接続について
一度接続したフィルタの画像サイズを変更することは可能でしょうか?
実際にやりたいこと
320*240で描画していたところを途中から640*240サイズのストリームを
描画する方法があれば教えてください。
CBaseOutputPinで作成しております。
フォーマットチェンジたい
731 :
デフォルトの名無しさん:2007/09/10(月) 19:08:17
>>730 フォーマットチェンジはどのようにすればいいですか?
(追記)
CTransformFilterからの派生でGetMediaTypeを使用して出力ピンの情報を取得
し、変更をこころみたんですがだめでした。
732 :
デフォルトの名無しさん:2007/09/11(火) 23:13:08
フィルタグラフは再生したまま?停止してピンの再接続はだめ?
あと、入力、出力両方のメディアタイプをかえたいの?
733 :
デフォルトの名無しさん:2007/09/12(水) 15:59:31
>>732 停止してピンの再接続はOKです。
(停止せずに出来るのであればベターです)
変更は出力のみの変更です。
サンプルのフラグを立てるたい
ダウンストリームが受け入れるかどうかはフィルタ次第ばい
735 :
デフォルトの名無しさん:2007/09/13(木) 11:02:14
>>734 サンプルのフラグを立てるとはどのようにすればいいですか?
YV12などのグラフィックボード依存のフォーマットでなくRGBで接続しているので
サイズ変更で受け入れが出来ないことは考慮してないです。
CBaseInputPin::Receiveあたりをチェックするとよかばってん
受け取る相手が何をするのか書いてあるからチェックチェック
737 :
デフォルトの名無しさん:2007/09/14(金) 11:32:34
>>736 Receive関数の引数IMediaSample *pで出力先のピン情報は取得
出来るのですが書き換える(更新する)方法がわからないです。
SetMediaTypeで新規情報(サイズ変更)を設定しても初期設定の
情報は書き換わってないです。
メディアタイプを大きく変えるってことはサンプルバッファのサイズも変えるんだろ?
SetMediaType なんかじゃ済まず、アロケートし直しが必要になってくるような気がする。
739 :
デフォルトの名無しさん:2007/09/14(金) 15:34:32
>>783 サンプルバッファのサイズは変更しません。
初期値で必要な最大サイズを設定しています。
メディアタイプでの変更はサイズのみです。
VIDEOINFOHEADERで設定するbiWidth,biHeightの値のみの変更です。
740 :
デフォルトの名無しさん:2007/09/14(金) 15:36:05
Media Foundationのスレがないみたいだから、ここで質問させてください。
Vistaで、bcdedit /debug onを実行すると、MPEGのDecodeが動作しなくなります。
Q1 これはProtected Media Pathのせいなんでしょうか?それとも、Vistaに付属しているMPEG Decoderの仕様なんでしょうか?
Q2 MPEG Decoderの仕様だとしたら、Kernel Debugできる環境で動く他のMPEG Decoderはありますか?
VMR9で最大3つの動画ファイルを透過率を任意に変更しながら
表示を切り替えるプログラムを作成しています。
SDK内のサンプルプログラムBlenderでは、
2つのファイルの同時再生/透過率変更は行えるようですが、
個々のファイルに対し、再生/停止/シークといった制御が
行えません。(再生時には2つ同時に再生されてしまう)
このようなプログラムを開発する場合、何か参考になる
情報がありましたらお教え下さい。
あのうVMRのインタフェースIBasicVideo2のGetPreferredAspectRatio以外から
ムービーのアスペクト比を取得するにはどうしたらいいでしょうか?
アスペクト比が設定されているのですがIBasicVideo2が使えない状況に
ありまして困っております。
>>741 Q1. (DVD再生時以外は)おおむねベンダ独自の耐タンパの仕組みのせい。
Q2. ffdshow
ffdshowでMPEGを有効にすると色々と不安定になるんだが…
749 :
デフォルトの名無しさん:2007/09/22(土) 06:17:44
こんなスレで質問していないで、早く試行錯誤でバグ回避策を見つける仕事に戻るんだ!
何?やる気がありません?なら辞めろや、他の派遣雇うからw
はいはい
GraphEditを使って目的のフィルタグラフを構築できることを確認したんですが、
これをプログラムとして記述する際、困ったことが起きました。
フィルタを生成するのにCoCreateInstance関数を使いますが、このとき必要なGUIDが
分からないフィルタがあるんです。
Microsoftから標準で提供されているフィルタはMSDNを調べればGUIDが分かりますが、
そうでないフィルタは分かりません。
どうすればそのフィルタのGUIDを知ることができるでしょうか?
ご助言、よろしくお願いします。
GraphEditでわかると思ったけど。
753 :
751:2007/09/24(月) 21:32:35
>>752 すみません、どこを見ればよいんでしょうか?
例えば、NullレンダラーのGUIDは
{0xc1f400a4, 0x3f08, 0x11d3, {0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37}}
ですが、
GraphEditを見てもこの記述があるところが見つけられません。
久しぶりにGraphEdit立ち上げてみたよw
メニューの[Graph]-[Insert Filter] から ダイアログ立ち上げたら
DirectShow Filter -> NULL Renderer 選んでください。んで、展開すると Display Name の後に
@device:sw:{083863F1-70DE-11D0-BD40-00A0C911CE86}\{C1F400A4-3F0B-006008039E37}
ってあるよね。
後半の { } を見てくれ。これってGUIDじゃない?
君に幸あれ
やべー11D3-9F0B が抜けてたw 手打ちだったからゴメンな けどまあわかるよね。
最悪、フィルタ名でレジストリ検索したりとか、まあ頑張ってください
手打ちかYO!
Guidにしては何か微妙に短いと思ったw
757 :
751:2007/09/25(火) 00:07:16
>>754 うわー!気付きませんでした!w
ほんとうにありがとうございました!! 。゜(゜´∀`゜)゜。
手打ちだYO!よく頑張りましたで賞くれYO!
困ったらまたおいでお嬢さん
とてとていつ転ぶか心配な歩き方をする
>>751(幼女)と
有識者だけどおっちょこちょいの
>>752(褒め言葉)で盛り上がるスレはここですか。
はいはい
direct showで二ヶ国語の音声ストリームを切り替えて再生するには
どのようにコーディングしたら良いでしょうか。
かたっぽのボリューム0にしとけばいいんじゃねーの?
Compact FrameworkからDirectShowを呼び出そうとしています。
QuartzTypeLib.dllに参照設定して
RenderFile()→各種設定→Play()
とすると(初回だけ)再生出来るのですが、もう一度別のファイルを
RenderFile()したあと、IVideoWindowを再取得して
スタイルを設定しようとしたところで0x80004002が発生します。
MSDNによると再度RenderFile()するためにはフィルタを全削除しろと
あるのですが、QuartzにはEnumFilters()やRemoveFilter()がないので
やむなくいったんFilgraphManagerを解放→GC.collect()してから
RenderFile()しても、結局上記と同じ場所で例外が起きてしまいます。
アドバイスよろしくお願いします。
>>761 自作の変換フィルタ間に入れてデータがLRとなっているのをLLかRRにすればいいんじゃないの?
数秒のAVIを数十個連結して再生させたいのですが、
単純にどんどんファイルを読んで再生とかやると継ぎ目に真白なフレームがはさまったり汚くなってしまいます
音なしのAVIなのでそこまでシビアにつなげられなくてもいいのですが
映像として奇麗につなげるには
グラフ内でソースをどんどん切り替えていく、って形になるんでしょうか?
767 :
763:2007/10/02(火) 22:41:48
>>764 やはりそんなところですかね…。
ただ一応、開発ターゲットの端末に添付の再生アプリでは
ふつうに別のファイルを再生できるので、回避策はあるのかも知れません。
フィルタを削除するさいにやっておく後始末とかって
何かあるんでしょうか。
768 :
763:2007/10/03(水) 02:39:01
ちょっと待て…解決(?)したかも知れません。
試しに思い切ってQuartzTypeLib.dllを参照する方法を止め、
[ComImport, Guid(...), ...] interface IGraphBuilder ... { ... }
と手動で定義する方法(DirectShowNetで採用してるもの)にしたら
ちゃんと動くようになりました。
typelibでラップする方法の不具合かな? CE限定なのかは謎。
ちなみにその端末だとやっぱりIEnumFiltersは取得できても
Next()で未実装エラーが戻りました。とにかくCE要注意。
>>766 再生リスト(.wpl)使えば順番に再生してくれる
>>766 音なしのAVI程度なら avi 関連 API と DrawDibDraw で・・
772 :
768:2007/10/04(木) 05:29:28
>>770 や、これまで再現率100%だったのがこの改良で全く出なくなったので、
対処方法としてはこれで間違いなさそうです。
COM相互運用(マネージドとCOMのやり取り)はけっこう高度な
トピックらしいですね。するとCEは関係ないかも。
一度QuartzTypeLib.dll(tlbimpというツールに自動生成させる)を
解析したものと、DirectShowNet方式の手動定義を比較して、
ちゃんとした原因を突き止めてみたいです。
DirectX初心者質問スレから誘導されてきました。
DirectShowで再生してる動画の上にテキストを置きたいんですけど(ニコニコ動画みたいな感じに)
普通に再生している動画をSetWindowPositionでウィンドウに表示させて、そのウィンドウの子ウィンドウとして
スタティックコントロールを動画の上に置こうとすると、動画の下に隠れてしまいます。
WS_EX_TOPMOSTを指定しても隠れてしまいました。
そこで、SetWindowPositionでウィンドウに動画を表示させるのをやめて
グラバフィルタでフレームを取得して、フレームを取得するごとに呼ばれる
コールバック関数内で取得したフレームをウィンドウに再描画するという形にしたところ
スタティックコントロールが上手く見えるようになりました。
しかし、今度は動画の再生が進むうちに動作が重くなってしまい、コマ飛びが起きるようになってしまいました。
コマ飛びが起きないような方法はないでしょうか。
サンプルのVMRとかVMR9にある奴じゃダメなの?
775 :
773:2007/10/07(日) 19:08:58
>>774 ありがとうございます。
VMRについて少し調べてみたんですが、確かに動画とテキストを合成して
表示するような形にすれば出来そうです。
ただ、773に書いたような方法ではテキストは表示せずに動画を再生しているだけで
重くなってしまいます。
VMRを用いて、動画とテキストを合成して再生する方法だと、動画再生自体が重くなる
ようなことはなくなるでしょうか。
サンプルを試せばいいと思うお
適切に書けば重くならないし、阿呆なことをすれば
>>773のような阿呆な動作になる。
自分の書いたプログラムが悪いのに、他に原因があるように思っている時点で、
どうやって処理させても結果は同じ。
ttp://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/directshow.html#stillcap2_abst をもとに、ISampleGrabberCBインタフェースの実装を試みているのですが、
『error C2512: 'CUnknown' : クラス、構造体、共用体に既定のコンストラクタがありません。』
『error C2614: 'mySampleGrabber' : イニシャライズ リスト内のクラス 'Cunknown' が基本クラスでもメンバでもありません。』
の2つのエラーが出てしまいます。ヘッダファイルやリンクの問題は解決したと思うんですけど
C++に慣れていないのでここからどう直せばいいかが分かりません。
以下、ソースです(行数の関係で詰めているので見にくいと思いますが…)
class CGrabCB: public CUnknown, public ISampleGrabberCB{
public:
DECLARE_IUNKNOWN;
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv) {
if( riid == IID_ISampleGrabberCB ){
return GetInterface((ISampleGrabberCB*)this, ppv);
}
return CUnknown::NonDelegatingQueryInterface(riid, ppv);
}
// ISampleGrabberCB のメソッド
STDMETHODIMP SampleCB(double SampleTime, IMediaSample *pSample){
return E_NOTIMPL;
}
STDMETHODIMP BufferCB(double SampleTime, BYTE *pBuffer, long BufferLen){
cerr << "Sample time: " << SampleTime << "\t";
cerr << "BufferLen: " << BufferLen;
cerr << endl;
SaveOneImage("C:\\tmp.yuv", pBuffer, BufferLen); // 後に定義する
return S_OK;
}
// コンストラクタ
CGrabCB( ) : CUnknown("SGCB", NULL){ }
};
CUnknownコンストラクタのパラメータが実は3つってことはないよね?
780 :
778:2007/10/09(火) 21:49:39
すみません。strmbase.libを作ってリンクさせたらコンパイルは通ったんですけど
今度は部分DECLARE_IUNKNOWNマクロで実装されているAddRef()周りが原因で
プログラムを起動した瞬間強制終了してしまいます。
DECLARE_IUNKNOWN部分を自分で実装して、AddRef()のみ実装しないようにしたところ
一応動作はするようになりました。
AddRef()を実装するために、他に実装する何かがあるのでしょうか。
以下のように AviMux → ファイルライタ を準備してファイルへのキャプチャを行っているのですが、
pCaptureGraphBuilder2->SetOutputFileName( &MEDIASUBTYPE_Avi , キャプチャファイルのパス , &pFileOut , &pSink );
pFileOut : AviMux( IBaseFilter型 )
pSink : ファイルライタのインターフェイス( IFileSinkFilter型 )
キャプチャ終了後、AviMuxのピンを切り離し、プレビュー用のグラフ再生を行うと、ファイルライタが
グラフ内に残っているため、それによって作成したファイルが使用中となって再生できません。
キャプチャが終了したファイルはすぐに再生して確認できるようにしたいのですが、
(現状はグラフ停止中かアプリを終了しないと再生できません)
どのようにすればよいでしょうか?
上記のような便利なユーティリティ関数を使わず、地道にファイルライタ( IBaseFilter型 )の
インスタンスを作成して、ファイル名の設定、フィルタグラフの構築、と進め、キャプチャ終了後、
ファイル名を変えるかファイルライタを削除するかなりをしないといけないでしょうか?
CBaseVideoRendererを継承したレンダーを作成したいのですが、DoRenderSampleの実装の部分で詰まっています。
HRESULT CGrabRenderer::DoRenderSample(IMediaSample *pMediaSample) {
HRESULT hr=S_OK;
CAutoLock mylock(&m_CritSec);
LPBYTE pbSrc=NULL;
const long lActualSize=pMediaSample->GetActualDataLength();
pMediaSample->GetPointer(&pbSrc);
// 表示ウィンドウからデバイスコンテキストを取得して描画
if(IsWindow(m_hwnd)==TRUE) {
BITMAPINFO bi={m_Vih.bmiHeader};
const HDC hdc=GetDC(m_hwnd);
RECT rect;
GetClientRect(m_hwnd,&rect);
StretchDIBits(hdc,0,0,rect.right-rect.left,rect.bottom-rect.top
,0,0,m_Vih.bmiHeader.biWidth , m_Vih.bmiHeader.biHeight
,pbSrc,&bi,DIB_RGB_COLORS, SRCCOPY);
ReleaseDC(m_hwnd,hdc);
}
return hr;
}
この実装方法をインターネット上のソース等を参考に試したのですが、音声だけが再生され、画像が表示されません。
pMediaSample->GetPointer(&pbSrc);でpbSrcにビットマップを読み込んでいると思っていたのですが、MSDNを参照したところ
GetPointer()は引数のバッファへのポインタを返すだけなようです。そうすると、直前で宣言、しかもNULLを代入しているpbSrcへの
ポインタを取得したところでビットマップを読み込めていないのではないかと考えたのですが、IMediaSampleでの画像の読み込み方法が
分かりません。
長文ですみません。
DoRenderSampleはどのように実装したら良いのでしょうか。
なんでエラー値をチェックしないの?
http://www.geekpage.jp/programming/directshow/renderfile-url.php を元に、DirectShowで擬似ストリーミングを行おうと思ったのですが
ネットワークからダウンロード中はプログラムが固まってしまい
ダウンロードが全て完了したら再生出来るような形になってしまいます。
単にファイル名をネットワーク上のファイルにするだけでは駄目ということでしょうか。
これだとローカルにファイルを落として、そのローカル内のファイルを
再生するのと変わらないので意味がないのですが、DirectShowで
ストリーミングを行う場合、自作のソースフィルターを作らないといけないのでしょうか。
出来れば完全なストリーミング、難しければ擬似ストリーミングを考えています。
785 :
781:2007/10/12(金) 21:50:32
自己解決しました。
pSink->SetFileNameで名前を変更すれば録画ファイルは解放されました。
USBカメラからの画像をキャプチャして、jpg形式などで保存できるようなプログラム
を作成したいのですが、お勧めの書籍などありましたらご教授願えないでしょうか。
directxやdirectshowには触れたこともない初心者なのですが、これは無謀というも
のでしょうか?
自分で作らなくても誰かが作ってることも多い。
ライブラリでも何でも探してみるとよろしいかと
サンプルグラバで検索したらサンプルがたくさん出てくる
OpenCVでもいけるんじゃない?
たしかにOpenCVの方が向いてる気がする
OpenCV使用の場合、OpenCVのカメラ種類サポート内ならとても楽に実現可能
サポート外なら
DirectShowでカメラ画像取得→画像形式変換→OpenCVで処理
という手が使える・・・ちょっと面倒くさいが
SetRateで速度変えたときに音程を維持するにはどうすればいいでしょうか?
795 :
デフォルトの名無しさん:2007/10/28(日) 03:51:40
> 786
もしかして他スレで動画をフーリエ変換したいと質問されていた方かな?
そうだったらこんなところに誘導するような羽目になってすいません。
単にWebカメラから動画をキャプチャしたいというならdirectshow付属のgrapheditを使ってしまうのが楽だと思いますよ
grapheditから、フィルタを呼び出して
カメラとFilewriterフィルタを繋いで上げましょう。間に動画圧縮のフィルタを入れてもよいです。
あとは、aviutil等のツールから連番のbmpで吐き出してしまえばよいと思います。
(他のツールもあるかも)
directshow自体は、それなりにプログラム経験と能力のある人でも使い方覚えるだけで一月くらいはかかるので
大学の学部クラスで大学からプログラム覚えたとかなら苦労は避けられないかと・・・。
796 :
デフォルトの名無しさん:2007/11/01(木) 16:53:14
質問です。
DirectShowのデコーダフィルタ部で、オーディオのタグ情報(曲名など)は取得できないのでしょうか?
やりたい事は、MP3デコーダ(自作)でタグ情報を取得し、アプリに投げてやるという事です。
どうも上流のMPEG-1 Stream Splitterからは、タグのデータが流れてこない気がします。
例えば、先頭にタグの付いたMP3ファイルをDirectShowで再生すると、
デコーダにはタグ部のデータは渡されず、タグの後のフレームデータから渡されるようです。
入力ピンのWAVEFORMAT構造体の後ろにタグがあるかと考えましたが、そこにも無いようです。
どうかヒントをお願いします。
普通に考えるとタグ情報なんてデコーダもレンダラも要らないから流さないんじゃないの?
もしスプリッタがタグ情報を流してくれるとするならば、ヘルプにどのように格納して渡すのか記しているはず。
一般的にはアプリケーションがそのMP3をパースしてタグ情報を引っ張り出して表示するんじゃないかな。
それともどっかに「タグ情報流すよ」みたいな記述があったの?
798 :
796:2007/11/02(金) 01:28:50
>それともどっかに「タグ情報流すよ」みたいな記述があったの?
いや無いですが、そういう要望があったので、可能なのかと思って質問しました。
何かのビデオで入力ピンのAM_MEDIA_TYPEのVIDEOINFOHEADERの後ろに
ヘッダが格納されていることがあったので、同じようにどこかにあるかと思っていました。
となるとデコーダからタグ情報を得るのは難しそうですね…
799 :
796:2007/11/05(月) 19:06:27
上記についてですが、調べたところ、IAMMediaContentというインターフェイスを使えば良さそうです。
スプリッタがこのインターフェイスを実装していました。
ということで解決しました。ありがとうございました。
なるほど。
DirectShowを始めて間もない初心者です。
DVキャプチャしつつ同時に
プロキシファイルを作成しようと考えているのですが、
どんな方法が考えられるでしょうか。
MSDVからの出力をInfTeeでふたつに分けて
片方はDVAVIに落とし
もう片方はエンコード処理をしてプロキシファイルに落とす、というのは素人の考えでしょうか。
出来ればプロキシの方は5分単位で分割して複数ファイル作りたいです。
DirectX,Window SDKs共に最新のものをインストールしてあります。
ご教授宜しくお願いします。
>>801 それでもいいですけど、Inplace フィルタを作って、そ奴が間に入って素通ししつつ
プロキシファイルも作るって方が簡単だと思いますよ。
性能面で余裕があるなら、標準入力から DV ストリームを受け取って
プロキシファイルを作るexeを CreateProcess してパイプで流すとか
そんな構造にするとデバグも楽です。
>>802 ありがとうございます。
Inplaceフィルタと聞いてパッと浮かんでこないですが
イメージ的にFileWriterフィルタの機能を持たせつつOutPutで
入力されたストリームを流すということでしょうか
フィルタを作るというのが想像できなくて
素人が1から作れるものでしょうか。
作る上で802さんが参考になられたサイトとかありますでしょうか。
>>803 そんな感じです。
NullNull フィルタサンプルを改造してゆくのが一番簡単・・・
と思ったんですが、現行の SDK には含まれていないのかな。
だとすると tee で分けて Dump フィルタの改造版で書いてゆくのが
いいかも知れませんね。
マルチスレッドのプログラミングに慣れていれば(あるいは慣れる気があるなら)、
普通のフィルタを素人が1から作るのはそう難しくはありません。
(ソースフィルタやスプリッタ、パーサは別。これらは結構難しい)
参考になるサイトはありません。
>>804 ありがとうございます。
NullNullフィルタサンプルは見つかりませんでしたが
Dumpフィルタを改造してみます。
もうひとつ問題にあたってしまって
エンコードするほうの処理ですが
Splitter→(V)DVDecoder→ASFWriter(V)
→(A)→→→→→→ASFWritter(A)
とGraphEdit上で接続、ビデオのほうは繋がりましたが
オーディオの方が「中間に必要な…」というメッセージが出てしまい
繋ぐことが出来ません。
実はDVキャプチャといいましても
HD(TV局などで使う機器、出力解像度は1920*1080)で
音声の周波数が48kHzのようです。
一般的なDVのほうは上記のフィルタ構成で接続確認は出来ました。
こちらは32kHzらしくてAsfWriterが32kHz以上対応していないんじゃないかと思い
調査していましたが情報は手に入らず・・・。
何か知っていればご教授下さい。
SDKのサンプルとネット上の情報を頼りにフィルターを作っています。
ちょっとわからない事がありましたのでどなたか教えていただけないでしょうか。
プロパティページの OnReceiveMessage で、マウス関係のメッセージを拾ってくれません。
INT_PTR CHogeProperties::OnReceiveMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_MOUSEMOVE:
Point_x = LOWORD(lParam);
Point_y = HIWORD(lParam);
//ここにフィルターへマウス座標を通知するコードを書く
return (LRESULT) 1;
}
return CBasePropertyPage::OnReceiveMessage(hwnd,uMsg,wParam,lParam);
}
これじゃダメなんでしょうか。
WM_LBUTTONDOWN とか WM_LBUTTONUP なんかも拾ってくれないのですが・・。
こちらが提供すべき情報で、これ以外に何か必要なものがありましたら指摘していただけませんか。
807 :
デフォルトの名無しさん:2007/11/19(月) 21:07:55
pMediaSeek->SetPositions と pSampleGrabber->GetCurrentBuffer を使い
差分タイムを指定して、mpeg2動画のスクリーンショットを取得しようとしています。
@指定:100 100秒ごとに画像取得
A指定:1 1秒ごとに画像取得
しかし、プログラム動作がうまくいったと思っても、上記のような指定をした際に
@での100秒時の画像と Aでの100秒時の画像 が食い違う現象がおきてしまいます。
(違うといっても誤差1秒程度のもののようですが・・)
上記の関数を使って mpeg2から確実に指定位置の画像を取得する方法を知りたいのですが・・。
>>807 よく状況がわかんないけどAが間に合ってないの?
>>806ですがコントロールをサブクラス化したら上手くいきました
レスありがとうございます。
少々長くなりますが、詳細を書いてみます。
今現在は、このような形になっています。
n100TimePos //nsec時間
pSampleGrabber->SetOneShot(true); //サンプルが届く度にグラフを停止
pMediaSeek->SetPositions(&n100TimePos, AM_SEEKING_AbsolutePositioning, NULL, AM_SEEKING_NoPositioning); //指定位置へのシーク
pMediaControl->Run();
Sleep(3000); //必要はないです SetOneShot の動作確認のために入れたものです。
long param1, param2; loop = true;
while( loop ){
hr = pMediaEvent->GetEvent(&evCode, ¶m1, ¶m2, 100);
if( hr==S_OK ){
switch( evCode ){
case EC_COMPLETE : //イベント確認
printf("EC_COMPLETE\n");
pMediaControl->Stop();
loop = false;
break;
default:
printf("------\n");
break;
}
}
else{
printf("loop\n");
}
}
pSampleGrabber->GetCurrentBuffer(&nBufferSize, (long *)(rgbImg)); //イメージ取得
少し文字化けしてしまいました・・。
hr = pMediaEvent->GetEvent(&evCode, param1, param2, 100);
理解の仕方が間違えているとまずいので質問します。
上記のようにsleepを挟むと 指定時間からかなりずれた画像が取得されます。
SetOneShot(true);によって グラフの動作は停止するはずなので Sleepを入れても問題ないと思ったのですが
実際には サンプルが届いても停止していないのでしょうか?
また、下記でGetEventによりイベント取得をしていますが、
GetState関数で Running や Stopped を参照していた際は いつまでたってもRunningが来続けていました。
SetOneShot(true); はサンプルを行った際にグラフを停止するとの事だったので、Stop に切り替わるものと
考えていたのですが、考え方が違うのでしょうか・・。
多分、この辺りの理解が間違っているから、今のような状況に陥っているような気がするのですが・・。
他にも、StopWhenReady や WaitForCompletion など色々組み合わせてもうまくいかないので
ご教授願えるとありがたいです。
やりたい事は、最初に書いたとおり
pMediaSeek->SetPositions と pSampleGrabber->GetCurrentBuffer を使い
差分タイムを指定して、mpeg2動画のスクリーンショットを取得しようとしています。
です。
ちなみに、スリープを入れた場合、そのsleepで指定した時間分後ろにずれた感じになります。
こちらとしては、どんなに処理が重いときでも、
処理が間に合ったから取れたとかでなく、同じタイム指定を行ったときは同じ画像が得られることを期待したいのです。
コールバックを使ったやり方で こちらの思惑通りの動作が出来たような気がします
これからテストを重ねて検証してきます
お騒がせしました
805です。
とりあえず回避策として一度DVEncoderを使ってDVMuxで
映像と音声と同期させた後、もう一度DVSplitterで映像と音声を分けて
AsfWriterに繋ぐことができました。
またまた質問になってしまいますが
テープが録画可能状態かというの情報はどうしたら取得できるでしょうか。
GraphEdit上でMSDVのプロパティページを開くと
テープのつめの状態で書込み可能か書込み出来ないか出来ています。
IAMExtDeviceかIAMExtTransportが怪しいのですが
それらしいメソッドが見つかりませんでした。
IAMExtDeviceのED_DEVCAP_CAN_RECORDと思ったのですが
テープのつめを変えてもステータスの戻り値に変化ありませんでした。
DirectShowサンプルのDVCapにもそれらしい記述は見当たりません。
どうかもう一度ご教授下さい。宜しくお願いします。
Windows Media Format SDKの質問なんですが、専用スレがなかったためここで質問させてください。
現在ストリーミングサーバとしてWindos Media サービスを使い
Windows Media Format 11 SDKで作った動画プレイヤーで
MMSプロトコルのストリーミング再生を行っています。
但し、MMSプロトコルですとシークの度にバッファリングが起きてしまい
再生速度を変えるためにIWMReader::Start()を呼び出すと、その度に
バッファリングが起きてしまいます。
MMSプロトコル、Windows Media Format 11 SDKで、バッファリングを起こさずに
スムーズな再生速度変更を行う方法はないでしょうか。
ぜんぜん詳しくないんだけど、ヘルプ読む限りではは、Startメソッドだと必ずバッファリングがおきる、
バッファリングを起こさないためにはResumeメソッドを呼べ、って書いてるけど、これじゃだめなのかな?
(再生速度は変更できない、とか?)
Any call to Start while paused is treated as a seek through the file, and incurs a buffering penalty from
network files. This is true even for calls to Start with the WM_START_CURRENTPOSITION value.
To continue playing from the current paused position with no buffering penalty, call Resume.
817 :
815:2007/11/26(月) 23:17:56
>>816 ありがとうございます。
一旦Pauseして、Resumeすれば再生速度も1倍になるかもしれないと思ってやってみましたが、無理でした。
PauseしないでResumeすると、やはり何も起こりません。
再生速度のみ変更するような関数があればよかったのですが・・・。
何の経験も無い俺はぐぐって出てきたヘルプをコピペするしかできんかったごめん
DvAviファイルからAsfファイルに落とす構成を
GraphEditを使いながらいじってのですが
なぜか一度Video,Soundレンダラを通して
グラフを再生させないとAsfWriterのAuidoが繋がりません。
一度レンダラを使ってグラフを再生させると何が変わるのでしょうか。
Builderが賢くなったかTransform Filterの状態が変わったのかかどっちかかねえ
>>820 ありがとうございます。
原因を調べてみる必要がありますが、
とりあえず動いたみたいなのでこれで良しとします。
とりあえず動いてるから良し、ですか。
個人趣味ならいいけど仕事だと気持ち悪いよねぇ…
DirectShowを使うような、他社製の挙動の怪しいコンポーネントが
連動して動くアプリの場合はある程度しようがないよ。
Microsoftは遅かれ早かれDirectShowを見捨てそう
825 :
デフォルトの名無しさん:2007/12/02(日) 23:34:36
hResult = CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (LPVOID *)&g_pGrph );
WCHAR wszFileName[260];
MultiByteToWideChar( CP_ACP, 0, name, -1, wszFileName, 260 );
hResult = g_pGrph->RenderFile( wszFileName, NULL );
if( FAILED(hResult) )MessageBoxA(hWindow,"PlayShow()内 その名前のムービーはないです","PlayShow No2",MB_OK);
// フィルタ グラフの構築
hResult = g_pGrph->QueryInterface( IID_IMediaControl, (LPVOID *)&g_pMdaCtrl );
hResult = g_pGrph->QueryInterface( IID_IVideoWindow, (LPVOID *)&g_pVdoWin );
hResult = g_pGrph->QueryInterface( IID_IMediaEvent, (VOID **)&g_Event2 );
// ウィンドウ内で出力
RECT grc;
g_pVdoWin->put_Owner( (OAHWND)hWindow );
g_pVdoWin->put_WindowStyle( WS_CHILD | WS_CLIPSIBLINGS );
GetClientRect( hWindow,&grc );
g_pVdoWin->SetWindowPosition( 0,0,grc.right,grc.bottom );
// フィルタ グラフの開始
g_pMdaCtrl->Run();
// ムービーが終わるまでここから先へは進ませない
g_Event2->WaitForCompletion(INFINITE,&g);
if ( g == EC_COMPLETE ){
no.movie_end = 1;
UninitShow();
}
音だけしか出ません;;
なにかご指摘があるのならお願いします
// ウィンドウ内で出力
から
// フィルタ グラフの開始
までをいじくるとなんとかなりそう
デフォルトでvisibleだったような気がするものの、put_Visibleも付けたいような・・・
あとウィンドウ操作しといメッセージポンプ止めるなんて、Windows を舐めてるよ。
>>824 既にVistaでは、新しくMedia Foundationが出ていて、
これがDirectShow後継になっている。
829 :
デフォルトの名無しさん:2007/12/04(火) 00:54:25
>>829 827 のは
> // ムービーが終わるまでここから先へは進ませない
> g_Event2->WaitForCompletion(INFINITE,&g);
のせいでメインのメッセージループ止まってて描画命令飛んでないんじゃないのという
非常に的を射たエスパー回答だと思うぞ。
831 :
デフォルトの名無しさん:2007/12/14(金) 12:54:00
すみません、Directshowで、パソコンと
USBで接続されたビデオキャプチャ IO-DATAのGV-MVP/RZ3の
アナログビデオ入力(RGB)にカメラをつないで、
まずは、画像をプレビューしようかと考えています。
参考にしようと思ったプログラム、
http://www.geekpage.jp/programming/directshow/list-capture-device-3.php を、コンパイルすることはできたのですが、うまく動きませんでした。
(ライブラリのリンクはできました。)
デバイス選択のところで、製品名のRZ3は認識しているようなのですが、
HRESULTをチェックしていくと、
// Graphを生成する
pCaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_PREVIEW,
NULL, pDeviceFilter, NULL, NULL);
のところだけ、S_OKでなく、VFW_E_CANNOT_CONNECTが返ってきました。
&PIN_CATEGORY_PREVIEWのところを、
&PIN_CATEGORY_CAPTURE や &PIN_CATEGORY_VIDEOPORT
に変えてもエラーをはいてしまいます。
周りに相談できる方が折らず、困っています。
どなたか、ご助言いただけませんでしょうか?
OSはXP home SP2に
Windows Server 2003 SP1 SDK
DirectX SDK 2007
Microsoft Visual C++ 2005で開発しています。
お手数かけますが、どうかよろしくお願いいたします。
・そこのサンプルページのもうちょい前のサンプルの動作結果
・GraphEditでの動作結果
・デバイスの情報
(デバイスマネージャの出力とか同じとこのサンプルプログラムとかインターフェース問い合わせるとか)
とかがあると答えやすいかも
833 :
831:2007/12/17(月) 15:38:32
>>832 お手数かけまして申し訳ありません。ありがとうございます。
いくつかご指摘の点を実行してみましたので、
下記の通り、どうかよろしくお願いいたします。
少し前のサンプル結果としてmpgファイルの再生。
http://www.geekpage.jp/programming/directshow/renderfile.php は成功しました。
デバイス情報を表示するサンプルからは、
FriendlyName : Python2 USB WDM Encoder RZ3
Description : Python2 USB WDM Encoder RZ3
DevicePath : \\?\usb#vid_04bb&pid_0519#6&25ee13b8&0&2#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global
となりました。
graphedit使ってみたところ、
フィルターから
Python2 USB WDM Endoderが見つかりました。
入力は、RGB入力と(おそらくです。文字化けしていました)
Audio inが見つかっています。
出力は、Mpeg out,Audio Preview,Index,VBI,Video Previewが見つかりました。
このまま、video renderの入力にVideo Previewをつなげようとしたところ、
「接続に必要な中間フィルタの組み合わせが見つかりませんでした。
エラーコード、0x80040217」
が出力されました。Mpeg Outのほうを、直接つないだり、mpeg decoderなどにつないでも
同様に中間フィルタの組み合わせが見つかりませんでした。
との結果を得ました。
ここで、詰まってしまいました。
不勉強のために不十分かとは思いますが、どうかご教授いただければ幸いです。
>833
とりあえず、GraphEditでVideo Preview Pinのプロパティを見て、MEDIASUBTYPEと出力サイズを調べる。
そこが変じゃないのなら、Video RenderとしてVMR9やOverlayなども試してみる。
AviファイルからDirectShowのAsfWriter使ってエンコードしてるんですが
音量の変更の仕方をどなたか知ってる方いらっしゃいませんか?
プロファイルを指定して解像度なりビットレートは変えられています。
PCの音量を最大にしても人が喋ってる声とかがあまり聞こえないんです。
ちなみにAviの方ははっきり聞こえています。
現在、DirectShowを用いてウェブカメラの動画ストリームを
「半透明で」「最上面」に映し出すためのプログラムを書こうと思っています。
http://codezine.jp/a/article/aid/322.aspx のプログラムを下記の環境でデバッグしたのですが、
VS2005 Pro SP1
MS Platform SDK for Server 2003 SP1
MS Direct X SDK Nov 2007
下記のようなエラーがでてきてしまいます。
エラー 2 error C2504: 'IDXEffect' : 定義されていない基本クラスが宣言されています。 c:\program files\microsoft platform sdk\include\qedit.h 980
自分の経験・勉強不足は十分承知しております。
解決方法をご教授していただければ幸いです。
837 :
デフォルトの名無しさん:2008/01/01(火) 23:49:53
あげて行きます。
ニコニコ動画のXMLファイルを読み込んで
入力動画に表示するフィルタは需要ありますか?
エンコード一発で字幕付き動画作れるようになる
838 :
デフォルトの名無しさん:2008/01/02(水) 21:15:36
>837
てらほしいっす!
需要は1人か・・・。
てら微妙。
DirectShowフィルタ作ってももはやだめなのかな。
>>836 とりあえず「半透明で」はなく「最上面」とは限らないプログラムの動作状況がわからないと
なんともしようがない
>>837 ノシ
そんなの作ろうとしてDirectShow勉強しはじめた人間です
DirectShow 複雑怪奇な構造してるよな
魑魅魍魎な設計ここに極まれり
843 :
デフォルトの名無しさん:2008/01/04(金) 06:43:25
>>841 マジで?
DirectShow部分は簡単だから一緒に作ろうか?
メールのやり取りでもしながらさ。
とりあえず、文字を右から左に送るフィルタでも作ってプロジェクト一式渡そうか?
XMLのタグをどう扱うかで勉強しようかと思っていたが需要ないから諦めかけてた
>>836 エラーメッセージを見る限り、
デバッグ以前の問題でコンパイルが通ってない、
と思われるがその認識でよい?
手元の環境では IDXEffect は以下のファイルで宣言されている。
C:\Program Files\Microsoft DirectX SDK (August 2007)\Include\dxtrans.h
DirectX SDK Nov 2007 でも同様の場所にあると思われるので、
そこにインクルードパスが通っているかどうかを確認してみるべし。
845 :
841:2008/01/04(金) 18:00:44
>>843 Windowsプログラミングの経験が浅いので役に立つかは自信ないですが、、
とりあえずメアドさらしておきます
>>845 ほい。了解。
なら一日くらいかけて作るよ(とはいってもやる気出すのに半日使うだけだけど・・・)
ところでDirectShowのフィルタをビルドできる環境はあるかい?
847 :
841:2008/01/04(金) 21:05:16
848 :
デフォルトの名無しさん:2008/01/05(土) 07:42:07
はーい。了解。
環境あわせようとしたけどVC2005とDXSDK9.0は相性悪いな〜。
849 :
841:2008/01/05(土) 09:04:57
Win2Kだとその構成が限界なんですよね。。
別のXPプレインスコマシンがあるのでそこに環境作ってみます。
850 :
デフォルトの名無しさん:2008/01/05(土) 10:50:14
いや、よいですよ。
DX9.0c+VC6とVC2005+WindowsSDKこの2つの環境を作りました。
両方のプロジェクトファイルを付ければいいですね。
文字を画面に出すとこまで作ったけど環境作るのでへこたれた為、少しだれた
851 :
837:2008/01/05(土) 20:26:41
852 :
836:2008/01/07(月) 22:48:08
>844
レスありがとうございます
>>そこにインクルードパスが通っているかどうかを確認してみるべし。
といってもVC++自体初心者なのでインクルードパスの通し方がわかってないかもしれませんが…。
ツール>オプション>
プロジェクトおよびソリューション>VC++ディレクトリ
プラットフォーム:Win32
インクルードファイルのところに
C:\Program Files\Microsoft Platform SDK\Include
C:\Program Files\Microsoft DirectX SDK (November 2007)\Include\
と入れてあります。
これであってるでしょうか?
>>852 おkです。
あと、ライブラリのパス(ライブラリファイル)の方も同様に設定しておかないと
リンク時に見つからないと怒られます。
854 :
デフォルトの名無しさん:2008/01/09(水) 21:37:09
>>841 おーい。一緒に開発しよっせ。
こんなクソソースよめっかっとかでもなんでもいいからなんかないの?
( ´-`).。oO(戦うつもりだったけどスレとSDKサンプルみてもう白旗…)
856 :
デフォルトの名無しさん:2008/01/11(金) 21:47:02
がんばれ。サンプルコードの意味わからんとこは解説してやるから
千里の道もまずはGraphedtから
857 :
836:2008/01/11(金) 22:42:04
やっぱり、
C:\Program Files\Microsoft DirectX SDK (November 2007)\Include\
の中にdxtrans.hがありませんでした。消したつもりはないので、最初から入ってないような気がするのですけど、
dxtrans.hってNov 2007には入っていないのでしょうか?
( ´-`).。oO(SDKのサンプルBallと戦かってみた…)
( ´-`).。oO(といってもいろいろ削って雛型作っただけ…)
( ´-`).。oO(GraphEditでは四角の箱がとりあえずでた…)
小学生はまず学校の勉強を頑張れよ
×戦かってみた (たたかかってみた、いくさかってみた)
○戦ってみた (たたかってみた)
( ´-`).。oO(DirectShow学生です…)
( ´-`).。oO(こまかいことは気にしないでね…)
WMP(Windows Media Player) を動画再生を停止した状態で
DirectX+VMR9 を使ってムービーを再生させると WMP を
起動してないときに比べて滑らかに再生される...
timeBeginPeriod(1)やD3DPRESENT_INTERVAL_ONEは
指定してあるんだけどな何かあるのかなあ
オーバーレイか?
864 :
862:2008/01/12(土) 17:04:10
>>863 アロケータ・プレゼンタを使ってテクスチャに転送して
Direct3Dでポリゴン板に貼り付けて描画しています
一応それなりに再生できるのですが
少しカクカクするところがあって WMPで見ているようにはいかないですね
己の限界を思い知らされてますw orz
DirectShowで変換フィルタつくったのですが、フレームレートが高い動画のパフォーマンスが
視聴に耐えられないほど悪いのでマルチスレッド化して高速化したいのですが、
ffdshowも何故かシングルスレッドしか動いてないみたいなんですが、
DirectShowの デコード→変換フィルタで変換→レタリング の流れをマルチスレッド化する方法を知っていたら教えてください。どうかお願いします
俺は適当にデータを分割して並列処理しているけど、重い処理なら軽く作り直せ。
まさかデバッグ版が重いという落ちではないだろうな?
デバッグ版だとスタックチェック等でとんでもなく重くなるので本来のパフォーマンスはわからない。
あと、たいていはメモリの読み書きでもっとも時間を消費するので、少なくなるようコードを改良汁。
マルチスレッド化は、自分で別スレッドを作っておいてデータ処理の段階で、自スレッドと別スレッドで同時に処理を分散し
待機関数で別スレッドがすべて処理が終わるのを待って、処理を完了するってかんじ。シグナルはイベントを使うのが良い。
>>866 レスありがとうございます
プロジェクトの設定を確認しましたがデバッグ版ではなく、ちゃんとリリース版でビルドしています
マルチスレッド化の話はたいへん参考になりました。難しそうですが、やってみます
>>858 Novemver2007 では未確認でした…。スマンカッタデス。orz
リンク先のフォーラムの回答「August 2007 を使え」が泣けてくる。
この削除が MS による意図的なものとすると
→dxtrans.h をインクルードしている qedit.h が使えない
→qedit.h で定義されているクラスやインターフェース
(DirectShow 編集サービスや SampleGrabber など)が使えない
となる訳で、かなり影響があるんでは…。
ソースとレンダラだけ指定して間のスプリッタとかデコーダを勝手に生成して適切なフィルタグラフを生成してくれるAPIはどれですか?
870 :
デフォルトの名無しさん:2008/01/14(月) 23:16:38
>>869 そんなAPIは知らないけどフィルタグラフ作って最初にソースファイルとレンダラ繋げば
自動挿入されるけど…?
インテリジェンス接続ってやつ
>最初にソースファイルとレンダラ繋げば
って具体的に言うと
IBaseFilter* s = ソースフィルタ、 IBaseFilter* r = ヴィデオレンダラ
graph->AddFilter(s)、graph->AddFilter(r)
あとどうするの?
sとrのピンを直接繋ぐ?
>>871 そんなのどこの解説記事にも書いてある基本中の基本なんだからやってみればいいじゃん
873 :
デフォルトの名無しさん:2008/01/15(火) 00:14:46
870ですが、
このスレで何度も言っちゃってるんですが
Graphedtを使ってどうなるかシミュレーションしてからコード書いてください。
そしてコード直接貼っての質問は最終手段にしてくださいね
874 :
デフォルトの名無しさん:2008/01/15(火) 00:19:59
追記ですが
> sとrのピンを直接繋ぐ?
はい。そうです。
メディアタイプが非圧縮YUVならフィルタはさまないでつながるし、
圧縮されていてもMPEG4のV2ならコーディックも挟んでくれますよ。
後は試してないから知らない
>>874 どうもありがとう。ちょっとやってみる。
GraphEditではやってみたんだけどね、ダメだったから何か追加処理が必要だなと思って質問してみた
876 :
デフォルトの名無しさん:2008/01/15(火) 01:34:01
了解です。
下の文章も付けて質問した方が今後早い解決に繋がりそうですね。
コーデックに寄ってはフィルタの優先度を上げないと自動で繋いでくれないものもあります。
自分の環境だけでなくユーザーの使うような環境でもテストしてみましょう
>>868 そうですね。
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2617687&SiteID=1 ここにjiapeiさんが書かれている方法を元に編集したら若干警告はあるもののビルドできました。
SampleGrabber も使えました。
私の環境における編集内容は下記です。
//#include "dxtrans.h" ・・・ 495行目
IDxtCompositor //: public IDXEffect ・・・ 979行目
IDxtAlphaSetter //: public IDXEffect ・・・1484行目
IDxtJpeg //: public IDXEffect ・・・1725行目
IDxtKey //: public IDXEffect ・・・2400行目
878 :
デフォルトの名無しさん:2008/01/24(木) 11:34:22
・GraphEditで接続を確認
・RenderStreamの引数を明示的に指定
USB接続のウェブカメラから静止画を取得し、表示するプログラムを作りました。
しかし、実装が悪いようで非常に重たいプログラムになってしまいました。
現在はメッセージループでPeekMessage関数によってメッセージを取り出し、
アイドル時にキャプチャと表示を行う仕様になっています。
改善策をご教授ください。
ん?プレビュー表示じゃないの?
プレビュー表示というのは動画をそのまま表示することでしょうか?
キャプチャした画像に処理を加える必要があるので静止画をキャプチャしています。
重い部分を軽くすればいいじゃないか。何故調べない?
コールバックの制御は直ぐに返しなさい。
マルチスレッドにすべきだな
イヤだと言ったら?
マルチスレッドにするとしたらキャプチャは今までどおりで、
静止画に対する処理をスレッドでやればいいんでしょうか?
質問です。
flvからaviに変換するようなアプリを作ろうと思っているのですが、
PCにインストールされている映像のエンコードのコーデック(フィルター)の一覧を取得する方法ってどうやればよいのですか?
えーと、確か、enumなんとかw 酒が入っててよく思いだせねー
graphEditでもフィルタ一覧表示してるでしょ。大丈夫さ君ならやれるさファイトファイト
890 :
デフォルトの名無しさん:2008/01/27(日) 22:15:55
>>880 フィルタ構成は
「ソースフィルタ」-「サンプルグラバ」-「レンダラ」
にしてサンプルグラバから静止画を取得するようにします。
このように設計してやることでマルチスレッド必要なく軽いアプリができます
892 :
デフォルトの名無しさん:2008/01/28(月) 00:30:39
VC++2005でDirectX9を使っています。DirectShowが必要でbaseclassesをビルドして
dshowutil.cppやstreams.hを使っています。
このとき、error lnk1181 でc:\program.objが見つからないとのえらがーでます。
どうやったら解決するでしょうか?
'Program Files'が空白で区切られた予感。後はシラネ
894 :
デフォルトの名無しさん:2008/01/28(月) 01:16:43
_TIME_FORMAT_FRAMEなどが未解決というエラーがでます。小生プログラミング暦が短くデバッグすることができません。
お力かしてください。
895 :
デフォルトの名無しさん:2008/01/28(月) 01:25:22
>>892 VC2005でDirectShowがインストールできませんよ
といっているの?
私もvc2005でDX9をインストールに失敗した経験があります。
vc2005(有料版)では素直にwindowsSDKを使ったほうが簡単でしょう
>>894 あなたもインストールに困っているのでしょうか?
その問題は昔のDirectShowプログラムをビルドすると出てきます。
直し方は新しくプロジェクトを作ればよかったと思います。
が、その後別の問題があったような覚えがあります。
DirectShowのインストールをやりなおしましょう
プログラミングが難しいとか以前に、環境がサクっと作れないのは問題だよなー
↑MSに対する文句です
898 :
デフォルトの名無しさん:2008/01/29(火) 01:15:09
いや。インストール環境が作れていないのを変な質問にすり替える奴らが痛い。
英語のサイト見るとそのあたりの情報調べられるよ?
DirectShow人口増やしたいから答えるけどさ…
簡単になること自体には異議はないが
そんなに難しくないだろ・・
MSDNをみるとVMRの入力ピン メディア タイプは
「MEDIATYPE_Video メジャー タイプを持つあらゆるタイプ」
になっていますが、これはYV12なども接続可能ということでしょうか?
つなげてみると、うまく繋がらないのですが。。。
901 :
デフォルトの名無しさん:2008/01/30(水) 02:01:26
ソースフィルタを作成しているのですが、
CLSID_VideoInputDeviceCategoryに属するフィルタの作成が出来ません。
g_TemplatesでCLSID_VideoInputDeviceCategoryを指定しているのですが、
CreateClassEnumeratorで列挙しても検出してくれません。
デバイスを伴ったWDMフィルタでなければ作成できないのでしょうか?
なにかヒントでも良いので教えてください。
登録部分のソースコード読めばわかるよ。つーか読め。
ちなみに、Baseclassのコードでは結論から言うとデフォルトの CLSID_LegacyAmFilterCategory にしか登録されない素敵仕様。
一からコード書くのも面倒なんで、俺はDllSetup.cppを改造したものを使ってこの問題に対処した。
903 :
901:2008/01/31(木) 00:17:30
登録できました!ありがとうございます。
私も902さんに倣ってDllSetup.cppから必要な部分抜き出して、
登録部分を実装しました。
感謝感激でございます。
904 :
デフォルトの名無しさん:2008/01/31(木) 00:51:11
VB6でDirectX Software Development Kit(August 2006)の組み合わせで、
DirectShowを利用したプログラムを作成していました。
今度、VB2005で同じようにDirectShowを利用するプログラムを作成するの
ですが、やはり、DirectX Software Development Kit(August 2006)がよい
のでしょうか?
自分で試せよ!このゆとり!
906 :
デフォルトの名無しさん:2008/01/31(木) 08:25:47
どうしょうもない時以外はVBではなくCで作った方がいいですよ。
資料数と実装難易度の問題で。やっぱりメジャーな使い方が地雷を踏みにくくさせる
907 :
デフォルトの名無しさん:2008/02/02(土) 14:20:25
VFWのビットマップをAVIにする機能をフィルタで作りたいのですが、うまく行きません。
ビットマップを挿入するタイミングは非同期でないといけないので、
今回の場合はPushSourceフィルタでは駄目でした。
Asyncfltを改造すれば、要求にこたえる機能が実装できそうだと思い見ています。
IAsyncReaderのRequestでIMediaSampleを渡すところまでたどり着ければ何とかなりそうなのですが、
取っ掛かりがつかめません。
どなたか作ったことがある、又は分かる方居ませんか?
下流フィルタとのつながりのやり取りのフローだけでも参考になるものがほしいです。
ちょっと、難易度の高い質問で申し訳ないですが、分かる方お願いします。
909 :
デフォルトの名無しさん:2008/02/02(土) 15:40:48
ありがとうございます。
教えていただいたURLはすでに読んでいました。
MSDNのそれらしきところを読んで回った末に、
>IAsyncReaderのRequestでIMediaSampleを渡すところ
というのが出てきたところです。
フィルタが出力ピンを用意して、それがIAsyncReaderをインターフェイスに持っているということですよね。
たとえばpushsourceでは
フィルタ>出力ピン の順に作って、
その出力ピンに下流ピンがGetMediaTypeを呼んで、良ければ繋がって、
FillBufferが呼ばれてIMediaSampleに内容を渡す
という流れですよね。これはグラフが動いている間は常に要求されているので渡す時間は実時間と違います。
パソコンが早ければ1秒で1分のビデオが作れます。そして、渡すべき物が無く、戻り値にS_OKを返さない場合、終了します。
今の段階ではFillBufferがRequestにとって代わるような感じを持っています。
渡すべき内容が無い場合、グラフに待ってもらいたいのです。
サンプルのAsyncfltはキューとかIOとかで割とシンプルじゃ無いので取っ掛かりがつかめません。
理解している人に噛んで砕いて教えていただけたら手っ取り早いなというのが実のところです。
任意のビットマップが用意できたら下流に流し、次のビットマップが無ければリクエストに対し無いと言って次回。
次のが用意できるまでは下流はリクエストをタイミングごとに出し続けて待機というイメージです。
そのようなシンプルなサンプルがほしいと思っています。
よろしくおねがいします。
質問です。
DirectShowを使って、オーディオ入力デバイスに対してファイルストリームから入力を行う事は可能ですか?
やりたい事は、ファイルシステム上のwavファイル等をオーディオ入力にいれるというものです。
よろしくお願いします。
ソースフィルタ作ればなんでもできるだろ
912 :
910:2008/02/02(土) 20:36:02
>>911 その場合特殊なドライバが必要だったりしませんか?
CSourceでやってみれ。自分で好きなもの垂れ流し放題だぜ。
914 :
デフォルトの名無しさん:2008/02/02(土) 22:14:08
908/909です。
pushsourceで出来ました。
CSourceStream をちゃんとしらべれば簡単な話でした。
掲示板で質問すれば手っ取り早い、と思うのは自分勝手でした。
すみません。
しかし、MSDNに限らず、こういうのの説明文はさらっとしすぎで初めての人には理解に時間がかかる。
もう少しデータのナガレをきちんと載せてほしいとこです。
あと、恩返しではないですが、
Delphiでやってるので、質問があればお答えします。
>>913 レスありがとうございます。
ソースフィルタでストリームに処理を加えると、
自分以外のそのデバイスをlistenしてるアプリにも反映されるのでしょうか?
お前DirectShowの機能勘違いしているぞ
>>914 自分のやりたいことがPULLモデル/PUSHモデルどちらなのか
良くわかってなかったっつーことか。なんだかなー
報告と謝罪と文句と募集と1レスで書かれるとなんだかわからん
919 :
デフォルトの名無しさん:2008/02/04(月) 02:12:37
募集?
全レスのなかで私くらいしかしてないような…
ゴバクかいな
>>914 Pull でも FillBuffer で待たせておけばOK.
922 :
デフォルトの名無しさん:2008/02/11(月) 00:41:52
そろそろ新スレいっとくかい?
1週間で1レスしか進んでないのに、まだまだ大丈夫だろ
スレタイ変えるのもなんだけど
戦っちゃだめだよな
戦わざるを得ないような××な仕様
ロックするのが基本のダメ仕様。
927 :
デフォルトの名無しさん:2008/02/11(月) 18:58:20
FillBuffer について質問。
CSourceStream はどのタイミングで FillBuffer を呼ぶの?
CSourceStream::DoBufferProcessingLoop の説明には
毎回ループを通じてアロケータから空のメディア サンプルを取得する。
とあるので、スレッドループから常に呼び出されていると理解したけど?
タイミングは随時?それとも下流フィルタから呼ばれてるの?
要は、渡すべきサンプルが FillBuffer 呼び出しに間に合わなかった場合の処置だけど、
戻り値に S_FALSE を渡すと終了してしまうよね。
IMediaSample を更新しないで単に S_OK を渡してやれば次回にスキップできる?
今やってるのではうまく行かないんだよね。
ソースあるのになんでわからないの?
929 :
デフォルトの名無しさん:2008/02/11(月) 20:34:38
わかってんなら教えろよ。
ソース読めばいいじゃん
931 :
デフォルトの名無しさん:2008/02/11(月) 21:43:21
どのソースのどこにどんな風に書いてあるんだ?
知ったかぶりすんな。
DoBufferProcessingLoopのソースを読めっていう点では同意。
DirectShowの場合、説明だけに頼らずソースのある箇所は必ず読む方が良い。
>>927 サンプルを得られるまで返らない、とか?
昔作った時は、停止要求とかの処理で悩んだ挙句、
DoBufferProcessingLoop自体をオーバーライドしちゃった記憶が(汗
そーすっか
935 :
デフォルトの名無しさん:2008/02/12(火) 02:15:50
DoBufferProcessingLoopは可能な限りすばやくループするから、
タイムスタンプに関係なくFillBufferを呼び続けるんだな。
渡すべきサンプルが無くてもお構いなしだ。
FillBufferがS_OKを返すとサンプルはDeliver(Sample: IMediaSample): HRESULT;から
Receive(Sample);に回される。ここでS_FALSEならおしまい。
ここらはMSDNから読めるだろ?
このReceiveの動作がDoBufferProcessingLoopが受け取る戻り値になるんだよ。
これはピンの状態なんかもかかわってくる。
問題は(Sample);の中身が無い状態で、とりあえず渡してどうなるかってこと
必要な動作のヒントがほしいなら、Receiveのとこはソースを見て自分で判断するしかない。
渡されたサンプルを無視するように何とかすればいいかもね
DirectShow(Filter)がサポートしているファイルの拡張子を取得する方法ってある?
RenderFileで成功するか否か判断するしかない?
>>937 サポートしている拡張子は取得できない、ってことですか?
拡張子が例えば ts や mpg や avi だったとして、
そこからはコンテナのフォーマットが推測できるだけであって、
中の映像や音声がどんなコーデックで圧縮されているかは全く不明。
各フィルターがサポートしているメディアフォーマットならば取得可能かもしれません。
レンダラ、ライタまでたどり着けるかはシステムに拠りますね。
>>937,939,940
ありがとうございます。
あるフォルダの中から、DirectShowで表示できるファイルだけを列挙したいのですが、
できればDirectShowにRenderさせる前に、DirectShowでサポートされているか拡張子で判断したいのです。
理由は判断ロジックのパフォーマンス確保のためです。
(この時、拡張子がrmなのに中身はwmvだった、という例外は除外してOKです。)
ファイル数が500個あった場合に、DirectShowにRenderさせてS_OKだったら、
これはサポートファイルであるという判断は時間がかかります。
もしくは、サクッとDirectShowサポートファイルか判断する手段はありますでしょうか?
>>941 コンテナとコーデックの違いを理解しましょう
>>941 そこにDivXの映像入りのAVIがあったとする。
しかし、そのコンピュータにはDivX(やXvidその他)がインストールされていなかったとする。
どうしよう。
>>941 レジストリの HKEY_CLASSES_ROOT\Media Type と SDK のドキュメントの
「カスタム ファイル タイプの登録」を眺めるとひょっとしたら幸せに
なれるかも
# スプリッター/パーサーフィルタが対応してるファイルかどうかは判定できる
# ただし拡張子だけじゃなく、ファイル先頭のビットパターンまで見る必要が
# あるけど
>>942 はい。
>>943 列挙されたファイルをDirectShowで使用する場合、Renderのタイミングでエラーになりますので、
そのタイミングで該当ファイルをリストから除外します。
ファイルの列挙のタイミングでは、精度よりもパフォーマンスを確保したいのです。
私の理解が不十分ですので、出直してきます。
ありがとうござしました。
>>940,944
ヒントありがとうございます。
調べてみます。
947 :
デフォルトの名無しさん:2008/02/14(木) 17:00:20
現在CTransformFilterから派生した変換フィルタを作っていますが、入力から出力へコピーするだけのフィルタを作ってみても、
ffdshowと比べて負荷が高いような気がします。
※色空間は暫定で、一番最初にCheck〜関数へ飛んでくる色空間にしてます。
自作フィルタをGRFで見てみると、AVIDecompressorが出力ピンに付くんですよね・・・そのせいでしょうか?
一応ffdshowのソースを見てみましたが、私には難解すぎました・・・orz
どなた様かご教授よろしくお願いいたします。。
メディアサブタイプにPCMとWAVEが存在するのだが、これはどう違うの?
MEDIASUBTYPE_WAVEは、過去の遺産ということなのか?
MEDIASUBTYPE_PCM = MEDIASUBTYPE_WAVE
と考えていいのか?(いやまずいだろうとは感じているのだが)
WAVEはあくまでコンテナでしょ 中身がリニアPCMとは限らない。
>>951 そしたら、サブタイプがWAVEだった場合、
中身のフォーマットはどのようにして取得するの?
他スレッドからの誘導でここに来ました
質問です。
メモリ上のH.264とAACを含んだTSを再生したく、調べてみて、
ハードディスク等に保存されている動画を再生するには
IMediaControl->RenderFileを使用する事が分かったのですが、
自分でHeapAlloc等を使い、
メモリ上に展開した動画データを直接再生する方法が分かりません
何か方法はあるでしょうか?
宜しくお願いしますm(__)m
954 :
デフォルトの名無しさん:2008/02/16(土) 21:18:57
上げます
当たり前だがパーサー、デコーダも必要になるぞ
>>955 >>956 分かりました
それらのキーワードでぐぐってみます
レスありがとうございましたm(__)m
DirectShowとDirectSoundを用いてmp3を再生するクラスを作成しようと思っています。
開発環境はWinXP + VS2005 です。
DirectShowでmp3のデコードを行ってメモリ上にrawデータを展開し、
そのデータをDirectSoundで再生させようと考えているのですが、
なかなか参考になりそうなwebページや書物が見つかりません。
そもそもこのことは可能でしょうか?
もし可能であれば簡単に展開の仕方を教示していただきたいです。
また参考になるHP等ございましたらご提示願います。
>>958 DirectSoundでWAVEをストリーミングするサンプルを見つける
MP3をWAVEに変換するサンプルを見つける
それら2つのサンプルを組み合わせる
>>958 yaneSDK3rd で DirectShow 使って PCM に直す処理があったと思うので
気合でソース読め。
DirectSound 使わんで普通に再生フィルタにつなげばそれで良いと思うのだがな。
なんか見た目がカッコいいなw
964 :
デフォルトの名無しさん:2008/03/02(日) 16:58:32
再生速度をSetRateで変えたときに、動画が一瞬止まるのは何故でしょうか?
キーフレーム、バッファリングと関係があったりするのでしょうか。
また、再生レートを変更しても動画が一瞬止まらないようにするための解決法などありますか?
SetRateで速度上げると音と動画が同期しませんが
どうすれば同期しますか?
本家GraphEditっていまどこにあるの?
PSDK?
Windows SDK
最新の6.1(Windows Server 2008/.NET Framework 3.5まで対応)にも収録されている。
968 :
ddd:2008/03/06(木) 17:31:30
hhaahahhahaahahhahahahahah
970 :
デフォルトの名無しさん:2008/03/07(金) 19:09:03
どなたか
「USB Video Class Extension Units」と戦ったかた居ませんか?
ttp://msdn2.microsoft.com/en-us/library/ms803127.aspx サンプルどおりに.axのDLLを作成して、infで登録し、
デバイスマネージャのドライバリストには入ってるんですけど
実際にAPLから、
pKsTopologyInfo->get_NumNodes(&nNodesNum);
for( int i=0 ; i<nNodesNum ; i++ ){
GUID guid;
hr = pKsTopologyInfo->get_NodeType(i,&guid);
if (!SUCCEEDED(hr)){
printf("err\n");
}
}
ってやると、extension unitのnodeで
KSNODETYPE_DEV_SPECIFICが帰ってくるんですよ。
(他のnodeは正常なGUIDが取れる)
ここではextension unitのGUIDeが帰ってくると
思ってたんですけど。・・・?
ハードメーカー以外に居ない予感
個々のフィルタの設定をIPersistStreamで保存したいのですが、うまく行きません。
IPersistStream::Save()は成功するのですが、IPersistStream::Load()はいつどのフィルタで呼んでも「初期化は既に完了している」とエラーが出てしまいます。
そもそも、設定の保存にIPersistStreamを使うので合っているのでしょうか?
圧縮形式とデコーダのでき次第じゃね?
>>970 UVCのExtension関連の記憶は少しあやふやだけど、KSNODETYPE_DEV_SPECIFICで
良かった気がする。アクセス自体はその後Pinインタフェイスで行ったような。
ただ、UVC周辺は動作が怪しいんだよね…XPでの経験しかないんだけど、Extensionの
サンプルってそのままだと上手く動かなかった気がする。
あとXPだとUVCドライバの対応が中途半端なので、MSDNの説明通りにドライバが動かない
部分もあったり。Vistaだとそこらへん改善してるのかどうか少し気になる。
977 :
970:2008/03/11(火) 13:03:33
>>976 HINTありがとう。
Pinインタフェイスですか・・・。試してないので早速試してみます。
KSNODETYPE_DEV_SPECIFICのノードのPinですよね。
あと、VISTAでもやって見ますね。
978 :
970:2008/03/12(水) 19:58:39
>>976 VISTAでやったところ、get_NodeTypeはDEV_SPECIFICが返り、
やっぱり、CreateNodeInstanceは失敗したんですが、
IKsControlのKsPropertyでアクセスできました!やった。
ただ、XPは同様な方法ではダメでした。
(MSDNにもFilterではなくnodeからしか出来ないと書いてありますし・・)
で、Pinインタフェイスなのですが、IKsPinの事ですよね!?
インタフェイスは取得できたのですが、どう扱えばよいのか・・。
979 :
デフォルトの名無しさん:2008/03/13(木) 12:49:04
質問があります。
他のアプリがUSB接続のカメラの映像をプレビューしている状態で、
自分のアプリでそのカメラの映像をキャプチャーしたいんですけど、
それって、DirectShowのAPIで実現可能でしょうか?
Geekさんの、ビデオ入力デバイスからの映像をAVIに保存するサンプルコード
http://www.geekpage.jp/programming/directshow/video-capture-save-avi.php を使用させてもらい、試してみたのですが
pCaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_CAPTURE,
NULL, pDeviceFilter, NULL, pFileOut);
でE_INVALIDARGが返却され、映像を横取りキャプチャーすることはできませんでした。
X-LiteというSIPクライアントソフトはその横取りキャプチャー行為が可能で、
その真似がしたいのですが、どうやっているのかが分かりません…
X-Liteのキャプチャーを開始すると他のアプリのプレビュー映像は消えるので、
カメラに映像配信を停止するような?命令を出しているのかもしれません。
どなたかアドバイスください。
IBasicAudio::put_Volume だとOSのWAVE音量が変わってしまうようです。
DirectSoundのSetVolumeのように、OSの設定には影響を与えない
アプリ内でのみ有効な音量の変更は出来ないでしょうか?
(設定できるのはOSの音量設定以下での相対値で構いません)
よろしくお願い致します。
981 :
980:2008/03/14(金) 10:26:08
レス付かないですね…
Winampとかでムービー再生するとアプリ内の音量調整はOSのボリューム
コントロールに影響しないので、何かしら方法はあると思うのですけど。
WinampがDirectShowを使ってるかは分らないですが…。
失礼いたしました。
983 :
980:2008/03/14(金) 12:52:40
>>982 レスどうもです
>waveOutSetVolume
このAPIでは、WAVEボリュームどころかOSのマスターボリュームまで
変わってしまいました。やりたいのはOSのボリューム設定を動かさずに
DirectShowの音声出力だけを制御する(下げる)ことなんです。
詳しくないので違うかもしれないが、出力するサウンドデバイスに因ると思う
985 :
980:2008/03/14(金) 13:39:01
>>984 ヒントありがとうございます。手持ちのデバイスで試してみました。
OSデフォルト:WAVE変更無し
マザボのオンボードカード:WAVE変更あり
USB音源:WAVE変更無し
となりました。さらにモニカのGetDisplayNameに"DirectSound:"が含まれ
ない場合にWAVEボリューム変更ありという感じでした。
なら"DirectSound:"が含まれるデバイスを選択すれば大丈夫なのですが、
PCによってはこれだと音が出ない場合もあったりで、結構困りモノです。
なんとかユーザーに選択させる方向で考えたいと思います…。
DirectShowの何かがDirectSoundバッファにストリーミングさせてるから
そのバッファの音量変えればいいようにも思えるんだが違うのかな?
もともとの音関係のライブラリはデバイスに激しく依存していて
WAVE系APIで複数音を鳴らせることはできないのも多かった。
で、DirectSoundによってアプリごとの設定ができるようになった。
Winampの場合は出力するときに使うDLLに依存してて、
そのDLLが音量を調節する機能を盛っていたはず。
だから、自力で実装するかDirectSound使うか。
列挙についてはWindowsのガイドライン通りにやっても
うまくいかないことは多いので下手に作りこむとはまると思う。
音量変える変換フィルタをサクッと作って繋ぐってのはどうだろう?
フィルタはレジストリに登録しなくても使えるみたいだし。
988 :
980:2008/03/15(土) 10:41:01
>>986 >DirectShowの何かがDirectSoundバッファにストリーミングさせてるから
>そのバッファの音量変えればいいようにも思えるんだが違うのかな?
バッファがどこにあるのか(どう取得するのか)自分の知識範囲では
わかんないです。
>>987 その発想はありましたが、サクッと作れるなら苦労しないです^^;
画像だとサンプルグラバってのを参考にして出力画像を加工する
ってのはやったことあるんですが、音だとどこら辺参考にしたら
いいでしょうか?
デコード後の生データの流れにルーチンを割り込ませることが出来れば、
確かにボリューム調整は単なる乗算なので出来そうではありますが、
そこまでたどり着くので難儀してますね…。
PCMデータの加工なんぞWAVEの基礎だ。
理解に5分もかからないけどな。
今もあるかどうかわからんが、Inplace null フィルタサンプルにインタフェイス一個と
追加して掛け算するようにすれば簡単にできると思う。
コールバックを登録するインタフェイスを追加して、掛け算の代わりにコールバックを
呼ぶフィルタにすれば今後映像音声のいろんな加工やモニタリングに流用可能。