DirectShowと戦うスレ ..
140:デフォルトの名無しさん
08/12/15 23:56:01
URLリンク(www.shader.jp)
これをビルドしたいだけなんですが、リンクでよく分からないエラーが出ます。
まずatlbase.hが無いといわれたので、
ATLをWinDDKからとってきて、
Streams.hをサンプルからとってきて、
strmbase.libもビルドしてVC++ディレクトリに設定しました。
それでもまたエラーが出るので
/NODEFAULTLIB:libcmt.libを設定しました。
これから先どうすればいいんでしょか・・?これはググっても全然分かりません。
141:デフォルトの名無しさん
08/12/15 23:57:16
C/C++でプログラム書いたことあるのか???
142:デフォルトの名無しさん
08/12/15 23:58:03
>>135
mpeg2デコーダとDXVAの間に自作フィルタ入れたいんだよね?
サンプルでさ、NullNullフィルタだかNullInPlaceだか名前忘れたけど
何にもしないフィルタがあるんだわさ。
そいつを改造してmpeg2デコーダとDXVAに入れてみるといいよ。
改造内容はどのメディアタイプで繋がるのかログでも吐かせりゃいいべさ。
143:デフォルトの名無しさん
08/12/16 00:01:12
言い忘れた。
>mpeg2デコーダの出力ピンがDirectX Video Acceleration (DXVA)でビデオレンダラに接続されている状態で
一回接続させた後に接続解除して、Nullフィルタ繋ぐんだわさ
144:デフォルトの名無しさん
08/12/16 00:08:28
>>139
C++かVSスレで質問しろ。
145:デフォルトの名無しさん
08/12/16 01:55:37
>>139
Expressだとatlmfcがないから無理
146:130
08/12/16 15:07:14
>>144
そうすることにします・・
皆さん回答ありがとうございました。
147:デフォルトの名無しさん
08/12/18 23:37:26
フレーム単位でシークするのってどうやるの?
SetTimeFormatでTIME_FORMAT_FRAMEを指定したら
E_NOTIMPLが帰ってきて使えないんだが
148:デフォルトの名無しさん
08/12/18 23:56:16
自分でフレーム数をMediaTimeに変換してシークする。
かな。
149:147
08/12/22 22:57:00
>>148
遅れたがサンクス。
150:デフォルトの名無しさん
08/12/22 23:05:39
・再生処理に使う時間が充分あれば等速で再生し、
間に合わない場合は再生速度を遅くする
(つまり、一切フレームスキップをしないようにしたい)
・音声をリアルタイムに加工、出力する
この2つを実現するにはどうする?
151:デフォルトの名無しさん
08/12/22 23:06:15
かなり下がったし、age
152:デフォルトの名無しさん
08/12/22 23:49:58
C++で作ったフィルタをC#から使うのってどうやるの?
検索しても出ない
153:デフォルトの名無しさん
08/12/23 00:29:33
>>152
フィルタを使うじゃ抽象的過ぎてわからんよ。
154:デフォルトの名無しさん
08/12/23 00:43:57
手とり足とりということです
155:デフォルトの名無しさん
08/12/23 21:00:54
DShow.NETがあるやん。
156:デフォルトの名無しさん
08/12/23 21:33:31
もちろん、DirectShow自体COM Interopでもなんとかなるはず。
157:152
08/12/23 22:01:42
1.CBaseVideoRendererを派生させてOpenGLのテクスチャに
ムービーを書き込むクラスをC++で作る
2.C#でWindows FormsでGUIを作る
3.C#でDirectShow、OpenGLを初期化
DirectShowでグラフ構築時に1.で作ったフィルタを入れる
というようなことがしたい。のだがCOMに対応したDLLの作り方が
分からない。
C#でDirectShowを使うのにはDirectShow.NETを使うつもり。
158:デフォルトの名無しさん
08/12/23 22:24:21
COMに対応したDLLってのは1のことか?
SDKのサンプルの改造じゃだめなの?
159:152
08/12/23 22:46:59
・・・どのサンプル?
160:デフォルトの名無しさん
08/12/23 22:50:45
SampVidとかだけど。
161:デフォルトの名無しさん
08/12/24 22:33:25
"C# DirectShow"でgoogle検索すると山ほど見つかるわけだが。
何を迷ってる?
162:デフォルトの名無しさん
08/12/25 00:38:38
DirectShowに関係ないところで迷ってるぽい
163:デフォルトの名無しさん
08/12/25 01:33:09
質問なのですが、HDVをDirectShowでキャプチャすることはできますでしょうか?
164:152
08/12/27 22:12:10
>>160
やってみた
strmbase.lib(dllsetup.obj) : error LNK2001: 外部シンボル ""class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A)" は未解決です。
strmbase.lib(dllentry.obj) : error LNK2001: 外部シンボル ""class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A)" は未解決です。
strmbase.lib(dllsetup.obj) : error LNK2001: 外部シンボル ""int g_cTemplates" (?g_cTemplates@@3HA)" は未解決です。
strmbase.lib(dllentry.obj) : error LNK2001: 外部シンボル ""int g_cTemplates" (?g_cTemplates@@3HA)" は未解決です。
C:\Documents and Settings\ \My Documents\Visual Studio 2008\Projects\FilterDLL\Release\FilterDLL.dll : fatal error LNK1120: 外部参照 2 が未解決です。
必要そうなコードのをSampVid.cppからコピーしたけどビルドできん・・
165:デフォルトの名無しさん
09/01/02 21:25:16
1フレーム目を表示させてすぐ一時停止状態にするのって
どうやるの?
166:デフォルトの名無しさん
09/01/02 22:21:16
目と指と反射神経を鍛える
167:デフォルトの名無しさん
09/01/02 23:19:34
普通にImediaControl::Runするとビデオが進んでしまうので
そうさせない方法を
168:デフォルトの名無しさん
09/01/03 00:07:03
Pauseでええやん。
169:デフォルトの名無しさん
09/01/06 14:21:02
ライブストリーミングを保存するために
動画を再生しながらファイルにも出力しようと思っているのですが
SampleGrabberで可能なのでしょうか?
Web上のサンプルは静止画を切り抜くものばかりで使い方がよくわかりません・・・
170:デフォルトの名無しさん
09/01/06 14:40:49
指定フレームの画像を抽出しようと以下のようにすると
MediaSeeking->SetPositions( ¤t, AM_SEEKING_AbsolutePositioning, &stop, AM_SEEKING_AbsolutePositioning );
::Sleep( 50 ); // ←これないとフレーム移動する前の画像になる
SampleGrabber->GetCurrentBuffer( &DIBBufferSize, (long *)DIBBuffer );
間にSleepを入れないと指定フレームの画像にならなのですが
もっと早く取る方法あったら教えてください。
171:デフォルトの名無しさん
09/01/06 15:10:32
>>169
可能です。
ただ、ファイル出力処理で滞ると当然コマが飛びます。
再生優先かファイル出力優先かによってコールバック内の実装をよく考えるべし。
>>170
IMediaControl::GetState()で必要最低限のウェイトを入れられると思います。
デバッグ中ならとりあえずINFINITEを入れてもいいでしょう。
172:169
09/01/06 16:03:26
>>171
ありがとうございます
現在
URLリンク(www.geekpage.jp)
こちらのページを参考にしているのですが
BMPではなくそのままの動画ファイルにするには
どういった部分を変更すればよいのでしょうか?
173:デフォルトの名無しさん
09/01/06 16:38:33
>>172
あー、ごめん、別に自前のメモリにビットマップが欲しいわけなじゃないのね。
じゃあ、この辺りを参考にしてみてはどうでしょう?
VBで書いてあるけど、大体意味は分かるでしょう。
URLリンク(www.geocities.co.jp)
簡単に説明すると、入力データを Infinite Pin Tee Filter で分岐させて、
Video Renderer と AVI Mux につっこむ。
ピンのつなぎ方が分からなければ、またそのときに。
174:デフォルトの名無しさん
09/01/06 17:01:41
>>171
ありがとうございます。
IMediaControl::GetState()で最低限のウェイトにできました。
所でこれはやっぱりウェイトを入れないとダメなものなんですか?
175:デフォルトの名無しさん
09/01/06 17:51:04
>>174
フィルタグラフ自体は別のスレッドで動いているものなので、
スレッド間で同期をとることを考えると仕方のないことですね。
176:デフォルトの名無しさん
09/01/06 18:12:26
>>175
そうなんですか。
ちなみに、最初のフレームから最後のフレームまで
順番に画像を抽出したい場合は>>170以外の方法でもっと効率がいいやり方はありますか?
177:デフォルトの名無しさん
09/01/06 18:41:58
なんか知らんが、普通にエンコードする時の様にフィルタ繋げるだけでいいんでね?
178:デフォルトの名無しさん
09/01/06 18:50:35
やりたい事は、最初のフレームから最後のフレームまで順番に
画像を取り出すだけなんですけどね。特に動画を再生する必要はないんですが
179:デフォルトの名無しさん
09/01/06 18:55:56
>>176
毎フレームSetPositionsをするのは確かに効率が悪いです。
可能であればSampleGrabberのコールバックを使った方がいいでしょう。
自分は以下の記事を参考にしてコールバック処理を実装しました。
URLリンク(codezine.jp)
GetCurrentBufferに比べると結構面倒ですけどねw
しかし結局自分はSampleGrabberの実装を捨てることになってしまいましたorz
(まあどうでもいいことですが)
180:デフォルトの名無しさん
09/01/06 19:13:34
>>179
ありがとうございます。
参考にさせて頂きます〜
181:169
09/01/06 19:14:29
>>173
度々ありがとうございます
VBはいまいち理解できてないのですがVC++の場合ですと
URLリンク(www.geekpage.jp)
こちらのページの入力をビデオカメラから動画ファイルに変更するということでよろしいのでしょうか?
的外れな質問でしたらすみません
182:デフォルトの名無しさん
09/01/06 19:41:19
>>181
そこにはキャプチャデバイスからAVIファイルに直接保存する方法が書いてありますが、
169さんの場合対象が(ネットワーク上の)ファイルからの再生だとすると
あまり参考にならないと思います。
とりあえず>>173で挙げたページと同じようにGraphEditでフィルタを繋いでみて、
自分の意図している動作をさせられるか、を確認してはいかがでしょうか。
ほな。
183:デフォルトの名無しさん
09/01/06 21:14:22
こちらはDirectShowについては全く無知な素人です。
板違いな質問かもしれませんが、ことはDirectShowに関わる問題なようなので、お詳しい皆さんお助けください。
「Virtual PC」上で、NHKオンデマンドからDLしたWMVファイルをWMPで再生を試みたところ、「DirectShow フィルタ グラフに存在しないピンに操作を実行しようとしました」と表示され、再生できませんでした。
OSはXP、WMPのバージョンは10です。
解決法について、ご教示のほど願います。
184:167
09/01/06 22:10:41
>>168
RunしてすぐにPauseするという事?
URLリンク(www.shader.jp)
を参考にレンダラー作ったんだけど
RunしてすぐにPauseすると一回もレンダリングが行われないで
ポーズしてしまう・・・
185:169
09/01/06 22:23:50
>>182
ライブストリーミングの場合はアドレスが「URLリンク(IP):ポート番号」になるので
GraphEditではどうやってソースとして指定できるのかがわかりません
再生することはできたので
要は再生している動画を別ファイルに保存するというようなことをしたいのですが
簡単な方法などないでしょうか?
何度も質問ばかりで申し訳ありません
186:デフォルトの名無しさん
09/01/06 23:40:19
>>184
DoRenderSampleで初回のフレームが到着したかどうかチェックして
ポーズをかけてみたらどうでしょう?
(やり方としてマットウかどうかはよく分かりませんが)
>>185
File Source (URL) で・・・、と思ったけどこれで直接URL指定する方法が分かりませんね。
一応適当なテキストファイルにアドレスを書いて File Source (Async) で開くと
勝手に ASX File Parser が繋がってFile Source (URL) で開きなおしてくれるっぽい・・・。
こっち(↓)みてコード書いた方が早いかも。
URLリンク(www.geekpage.jp)
187:デフォルトの名無しさん
09/01/07 10:13:37
ちょいと質問なんですが。
DirectShowがまだ何かに統合する前に作ったソフトがあるのですが
これ今でもDirectX9にしても普通にコンパイルできて動画がみれるのですが
コンパイルできてるなら特にSDKとかなくてもいいんですよね?
188:デフォルトの名無しさん
09/01/07 10:30:51
VFWでコーディングされているのではないかとエスパー
試しにコードの一部でもうpしてみれ
189:デフォルトの名無しさん
09/01/07 10:50:36
>>188
あ、エスパー的な質問でしたか。
とりあえずファイルをオープンするところをうpります
bool Open( const char *chrFileName )
{
if( FAILED(CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&GraphBuilder )) ) return false;
if( FAILED(GraphBuilder->QueryInterface( IID_IMediaControl, (void **)&MediaControl )) ) return false;
if( FAILED(GraphBuilder->QueryInterface( IID_IMediaEventEx, (void **)&MediaEventEx )) ) return false;
if( FAILED(GraphBuilder->QueryInterface( IID_IMediaSeeking, (void **)&MediaSeeking )) ) return false;
if( FAILED(GraphBuilder->QueryInterface( IID_IVideoWindow, (void **)&VideoWindow )) ) return false;
if( FAILED(GraphBuilder->QueryInterface( IID_IBasicAudio, (void **)&BasicAudio )) ) return false;
if( FAILED(CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **)&BaseFilter )) ) return false;
if( FAILED(BaseFilter->QueryInterface( IID_ISampleGrabber, (void **)&SampleGrabber )) ) return false;
GraphBuilder->AddFilter( BaseFilter, L"Grabber" );
AM_MEDIA_TYPE mt;
ZeroMemory( &mt, sizeof( AM_MEDIA_TYPE ) );
mt.majortype = MEDIATYPE_Video;
mt.subtype = MEDIASUBTYPE_RGB24;
mt.formattype = FORMAT_VideoInfo;
if( SampleGrabber->SetMediaType( &mt ) != S_OK ) return false;
WCHAR buff[512];
::ZeroMemory( buff, sizeof( buff ) );
::MultiByteToWideChar( CP_ACP, 0, chrFileName, strlen(chrFileName), buff, sizeof(buff) );
if( FAILED(GraphBuilder->RenderFile( buff, NULL )) ) return false;
if( PlayWnd != NULL ){
VideoWindow->put_Owner( (OAHWND)PlayWnd );
VideoWindow->put_WindowStyle( WS_CHILD|WS_CLIPSIBLINGS );
if( FormWnd && MediaEventEx->SetNotifyWindow( (OAHWND)FormWnd, WM_GRAPHNOTIFY, 0 ) != S_OK ) return false;
}
190:デフォルトの名無しさん
09/01/07 10:51:27
if( SampleGrabber->GetConnectedMediaType( &mt ) == S_OK ){
pVideoHeader = (VIDEOINFOHEADER *)mt.pbFormat;
BITMAPINFO BitmapInfo;
ZeroMemory( &BitmapInfo, sizeof( BitmapInfo ) );
CopyMemory( &BitmapInfo.bmiHeader, &(pVideoHeader->bmiHeader), sizeof( BITMAPINFOHEADER ) );
hBitmap = CreateDIBSection( 0, &BitmapInfo, DIB_RGB_COLORS, &DIBBuffer, NULL, 0 );
DIBBufferSize = mt.lSampleSize;
SampleGrabber->SetBufferSamples( TRUE );
}
if( MediaSeeking->SetTimeFormat( &(TIME_FORMAT_FRAME) ) != S_OK ) return false;
return true;
}
こんな感じなのですが・・・
191:デフォルトの名無しさん
09/01/07 12:49:42
おおう、エスパー失敗w
普通にDirectShowね。
「まだ何かに統合する前」てActiveMovie時代のことを言ってるのかな?
当時はActiveMovie SDKのインストールが必要でしたね。
Visual Studio .NET 2003辺りならPlatform SDKのサブセットみたいなのが
同梱されていたと思うので、特にSDKを追加する必要はないはず。
2005以降だとEEであればPlatform SDKかWindows SDKのインストールは
必要になると思いますです、ハイ。
192:デフォルトの名無しさん
09/01/07 13:17:20
>>191
これDirectShow使うのに必要なのって
ヘッダファイル
DShow.h
QEdit.h
と
strmiids.lib
とDirectXがインスコされていればいいだけですよね?
193:デフォルトの名無しさん
09/01/07 13:34:24
>>192
プログラムとしてインクルード/リンクすべきファイルはそんなもんですが、
各ヘッダからやはり別のWindows(Platform) SDKに含まれるヘッダを
インクルードしている形跡もあるので、注意は必要かと思います。
まあ、コンパイルしてみれば分かることですけどね。
194:デフォルトの名無しさん
09/01/07 13:40:56
>>193
あ、そっか、そうですよね。
とりあえず今は普通にコンパイルが通るって事は
以前にインスコしたのがあるからなんですね。
195:デフォルトの名無しさん
09/01/09 18:04:57
Visual Studio 2008 Standard EditionってSDK入れないとダメですか?
何かExpressは同封されてるって書いてるんですが・・・
196:デフォルトの名無しさん
09/01/09 18:17:50
されてるって書いてあるのに何故インストしない?
BaseClassesの方ならStandardのSDKにすら入ってないよ。
いつもどうり別途Windows SDKが必要。
197:デフォルトの名無しさん
09/01/09 18:22:57
ExpressじゃなくてStandardだから。
Standardはどうなのか知りたかった
198:184
09/01/09 21:51:03
>>186
なるほど
DoRenderSample()
{
...
rendered = true;
...
}
movie->play();
while(!movie->isRendered())
{
}
こんな感じ?確かにあまりまっとうじゃない・・
URLリンク(www.geekpage.jp)
画像の取得はCBaseVideoRendererで、1フレーム目でとめるのには
SampleGrabberを使うということはできるのかな
199:デフォルトの名無しさん
09/01/09 22:34:33
>>184
そのままの意味だ。RunしないでPause。
200:デフォルトの名無しさん
09/01/09 22:37:33
URLリンク(msdn.microsoft.com)
つか、全部書いてあるだろ。ドキュメントくらい読め。
201:184
09/01/09 23:53:34
しかし なにもおこらない
Runして初めて表示される・・
202:デフォルトの名無しさん
09/01/10 00:58:38
oops!レンダラ自作してるのか。悪かった。
Pauseでポスターフレーム出す処理はレンダラが実装する必要があるんだわ。
void OnReceiveFirstSample(IMediaSample *pMediaSample) {
DoRenderSample(pMediaSample);
}
これ追加するとよかばってん
203:デフォルトの名無しさん
09/01/10 08:09:02
おー、OnReceiveFirstSampleってそうやって使うんか。
184じゃないけどthx
204:169
09/01/12 19:29:05
とりあえずGraphEditを使ってみた結果
URLリンク(sageuploader.if.land.to)
このようにすることでライブストリーミングが保存できました
あとはこれをプログラムで書くだけなのですがピンのつなぎ方がよくわかりません
再生の場合は
URLリンク(www.geekpage.jp)
にあるように
pMediaControl->RenderFile(URL);
pMediaControl->Run();
という風にすればよいというのはわかるのですがこの場合はどうすればよいのでしょう?
SetOutputFileNameとRenderStreamを使えばよいのかな?と考えてはいるのですが
サンプルがビデオキャプチャからの取得方法ばかりで
こういった場合にどのような記述をすればよいのかわかりません
205:デフォルトの名無しさん
09/01/12 22:51:43
これ使って作ったツールはWindows2000でも動くかな?
206:デフォルトの名無しさん
09/01/13 01:18:52
>>204
RenderFilleやっちゃいかん。
ソースフィルタ(URL)をフィルタグラフに登録したあと、
出力ピンを列挙してAVI Muxに1つずつ接続すればおk
たぶん。
あ、あとファイル出力も手動で指定してフィルタ繋いでね。
207:169
09/01/13 06:56:07
>>206
ありがとうございます
以下のようなプログラムを作ってみたのですが
URLリンク(uploaders.ddo.jp)
コンパイルすれば通るものの実行してもファイルが作成されません
これはピンのつなぎ方などが間違っているのでしょうか?
208:デフォルトの名無しさん
09/01/13 12:50:40
なんでエラー値をチェックしないの?
209:デフォルトの名無しさん
09/01/13 16:10:02
>>206さんのアドバイスが理解されていない・・・・
210:デフォルトの名無しさん
09/01/13 17:18:19
>>208
チェックしてみましたがどこもエラーは返ってきませんでした
>>209
すいません・・・
>>206と
URLリンク(msdn.microsoft.com)
の辺を参考にしてやってみたんですがどの辺がおかしかったでしょうか?
ソースフィルタ(URL)をフィルタグラフに登録、というのは
pGraph->AddSourceFilter(URL, L"Source Filter", &pSrc);
出力ピンを列挙してAVI Muxに1つずつ接続
というところはRenderStreamを2回行ってみたのですが
根本的に間違っていたりしたらすみません・・・
211:169
09/01/13 18:38:16
あー見返すとなんか滅茶苦茶ですね
一から書き直してきます
212:デフォルトの名無しさん
09/01/13 19:57:05
URLリンク(okwave.jp)
213:デフォルトの名無しさん
09/01/13 20:29:46
サンプルをビルドして動いたからと言って
安易に一歩踏み込むとすぐに樹海に迷い込むのがDirectShow。
214:169
09/01/13 22:44:13
以下のように作り直してみたのですが、
URLリンク(uploaders.ddo.jp)
AddFilterからどうしてもNULLポインタが返ってきたり
GetPinがコンパイルをとおらずPin同士の接続ができなかったりしますが
とりあえずそれらの部分を除外して実行した結果
URLリンク(localhost:7144)のようなファイルは保存に成功できました。
しかしライブストリーミングの場合は解像度と再生時間はきちんとできた動画が作成されたのですが
再生しようとしても再生されない動画ファイルでした
やはりAddFilterやPinの接続がきちんとできていないことが原因なのでしょうか?
GraphEditでは簡単にできても実際に作るのは難しいものなのですね
単に私が駄目なだけかもしれませんが
215:デフォルトの名無しさん
09/01/13 22:55:51
確かに、GraphEditの様子をそのままコードにしてくれるツールがあったら欲しいな。
216:デフォルトの名無しさん
09/01/13 23:37:12
>>214
MSDNの通りにプログラムが書けてない。
IGraphBuilderはCoCreateInstanceしない。
ICaptureGraphBuilder2からGetFiltergraphで取得する。
217:デフォルトの名無しさん
09/01/14 01:01:13
>>216
なるほど
hr=CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,
CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2, (void **)&pBuilder);
hr=pBuilder->GetFiltergraph(&pGraph);
こういうことですね
しかしこうやってもGetPinがコンパイルを通らないのは変わらず
そこをコメントアウトして実行すると
hr=pGraph->AddFilter(pAVIMux,L"AVI Mux");の部分で
例外が出て終了する様になりました
これもコメントアウトしたばあいは前回と変わらず解像度と再生時間のみ正しい
再生されない動画ファイルが作成されるだけでした・・・
218:デフォルトの名無しさん
09/01/14 01:21:22
なんだそのGetPinってのはどこからでてきた?自作メソッドなのか?
219:デフォルトの名無しさん
09/01/14 01:38:19
>>218
これ使ってピン同士を接続するのかなと思ってコピペしてきたら
ただの自作メソッドでした
早とちりしてすみません
削っても動かないことに変わりはないのですが・・・
220:デフォルトの名無しさん
09/01/14 01:42:46
>>219
もう少し頑張って勉強してからまたおいで。
エスパーじゃないから、そんなんでコンパイル通らないとか言われても困るわ。
221:デフォルトの名無しさん
09/01/15 15:41:50
VideoWindow->put_OwnerでVFW_E_NOT_CONNECTEDが返ってくるのですが・・・
if( FAILED(CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&GraphBuilder )) ) return false;
if( FAILED(GraphBuilder->QueryInterface( IID_IMediaControl, (void **)&MediaControl )) ) return false;
if( FAILED(GraphBuilder->RenderFile( buff, NULL )) ) return false;
if( FAILED(GraphBuilder->QueryInterface( IID_IVideoWindow, (void **)&VideoWindow )) ) return false;
if( VideoWindow->put_Owner( (OAHWND)PlayWnd ) == S_OK ){ ←ここでS_OKにならない
VideoWindow->put_WindowStyle( WS_CHILD|WS_CLIPSIBLINGS );
if( FormWnd && MediaEventEx->SetNotifyWindow( (OAHWND)FormWnd, WM_GRAPHNOTIFY, 0 ) != S_OK ) return false;
}
PlayWnd をNULLにしてもS_OKにはなりませんでした。
何が原因でしょうか?
222:221
09/01/15 19:18:33
対象コンピュータをx64にしてたらエラーがでてx86にすると正常に通りました><
ちなみに上記のコードの後に読み込みと同時に1フレーム目を表示されようと
MediaSeeking->SetPosition ←上のコードには書いてないですが今はQueryInterfaceしてます
MediaControl->StopWhenReady();
VideoWindow->Visible( OATRUE );
を入れたのですが、何故か1回目の読み込み時には表示されず
2回目以降に表示されるのですが、何が原因ですか?
223:デフォルトの名無しさん
09/01/15 22:57:20
C++で作ったフィルタをC#で使いたいんですが
作ったフィルタをregsvr32で登録しないで使う方法ってありますか?
登録するのは(ユーザーにとって)面倒だし
クラスの型がIBaseFilterにしか出来ないので
アプリケーション側からデータを渡したり出来ません。
224:デフォルトの名無しさん
09/01/15 23:06:15
その程度の事もわからないお前には無理だ。
C#のCOMのラッピングのメカニズムも理解できていないんだろ?
225:デフォルトの名無しさん
09/01/15 23:08:01
Wevdestサンプルで、RenderFileで作成したグラフを最後のDefault DirectSound Deviceだけ切り離して付け替える時
RemoveFilterに失敗します。処理は正常なのですが、RemoveFilterはなぜ失敗なんでしょうか?
この行をいれないとRunで失敗するので入れてるんですが、失敗してるのに意味があるんでしょうか?
CComPtr<IBaseFilter> DS_DefaultDirectSoundDevice;
hr = DS_graph->FindFilterByName(L"Default DirectSound Device", &DS_DefaultDirectSoundDevice);
hr = DS_DefaultDirectSoundDevice->FindPin(L"Audio Input pin (rendered)", &pin_DefaultDirectSoundDevice);
hr = pin_DefaultDirectSoundDevice->ConnectedTo(&pin_DefaultDSDeviceTo);
hr = pin_DefaultDSDeviceTo->Disconnect();
hr = DS_graph->RemoveFilter(DS_DefaultDirectSoundDevice);
hr = DS_graph->ConnectDirect(pin_DefaultDSDeviceTo, pin_WaveDest_In, NULL);
226:デフォルトの名無しさん
09/01/15 23:39:31
もはや時代はMediaFoundation
227:デフォルトの名無しさん
09/01/15 23:52:39
>>225
エラーコードは何ぞ?
試してないから外してるかもしれないけど、
pin_DefaultDSDeviceToをReleaseしてないから、ってなオチはない?
228:デフォルトの名無しさん
09/01/16 00:01:29
hr = pin_DefaultDSDeviceTo->Disconnect();
hr = pin_DefaultDirectSoundDevice->Disconnect();
229:デフォルトの名無しさん
09/01/16 00:43:07
エラーなくなりました。
フィルターを削除する時繋いであったピンを解除。
繋ぎ換えるのにも解除後接続ですね。覚えました
意外と融通きかないんですね・・・
ありがとうございました。
230:デフォルトの名無しさん
09/01/16 03:43:18
wmvが登場したとき wmvのコンテナに対応したソースフィルタを
書けと言われたときはくらくらと眩暈がした。
231:デフォルトの名無しさん
09/01/16 12:36:29
ふうん
232:デフォルトの名無しさん
09/01/16 13:31:35
1フレーム毎にイベントを取りたいのですが
イベント通知コードは何になるんですか?
233:221
09/01/16 15:57:23
>>222で最初のフレームが表示sれないって話なんですが
どうやら一瞬表示してるみたいで
VideoWindow->Visible( OATRUE );の下にSleep( 1000 );と入れると
1秒間最は初のフレームを表示して、1秒後に消えてしまいます。
そして2回目に>>221を走らせた時はずっと最初のフレームを表示した状態になります
何が原因でしょうか・・・
234:221
09/01/16 16:11:44
わかりました。
どうやらStatic Textに描画されてるのがまずかったみたいです。
Picture Controlにしたら消えなくなりますた。。。
なにこれ・・・
235:デフォルトの名無しさん
09/01/16 17:00:57
Windowsの描画の基本的な所を理解していないのが問題
236:デフォルトの名無しさん
09/01/16 17:10:21
>>235が基本を教えてくれるそうです。
では、どうぞw
237:デフォルトの名無しさん
09/01/17 01:24:29
他人が理解できる説明の仕方を意識しよう。あと、日本語を学べ。
238:デフォルトの名無しさん
09/01/19 09:02:44
ではまず国語辞典を勉強したらよろしいでしょうか?わかりません><
239:デフォルトの名無しさん
09/01/19 16:28:00
単語を覚えるだけでは言語を会得できないな。
日本語でも英語でもプログラミング言語でも。
240:デフォルトの名無しさん
09/01/19 17:49:44
GetConnectedMediaTypeでVFW_E_NOT_CONNECTEDが返って来るのですが原因は何でしょうか?
その前にやってるSetMediaTypeはちゃんとS_OKが返ってきてます。
241:デフォルトの名無しさん
09/01/19 18:22:51
VFW_E_NOT_CONNECTED だから
繋げろ!
242:デフォルトの名無しさん
09/01/19 18:30:15
>>241
言い忘れてましたが、VFW_E_NOT_CONNECTEDが出るのはGetConnectedMediaTypeだけで
他は普通にOKなので動画の再生はできています。
243:デフォルトの名無しさん
09/01/19 18:51:39
再生にサンプルグラバは関与してますか?
そうでなければ別にサンプルグラバが繋がってなくても再生に支障はありませんよ。
少々面倒でもROTを登録して外部からフィルタグラフを覗けるようにしておくと
デバッグが便利ですよ。
244:243
09/01/19 18:52:57
× ROTを登録
○ ROTに登録
245:デフォルトの名無しさん
09/01/19 19:03:42
>>243-244
やりたい事はと言うと、再生して指定フレームの画像をbmpとして保存したかったのです。
その為にサンプルグラバでAddFilter後にビデオヘッダを取得したりと・・・
とりあえずGraphEditでみてみようとおもいます・・・
ちなみに、同じソースを別PCで動かすとGetConnectedMediaTypeでエラーはでませんし
正常にbmpファイルに落とすことができています。
246:デフォルトの名無しさん
09/01/20 00:24:24
>指定フレーム
フレームで指定ってできるんだっけ?
○番目のフレームとか。
247:デフォルトの名無しさん
09/01/20 00:41:20
つSetPositions
とはいえ、TIME_MEDIA_TIMEしか使えないストリームだと
ちょっと難しいけど。
248:デフォルトの名無しさん
09/01/21 22:49:54
SetPositionsって時間指定じゃん
249:デフォルトの名無しさん
09/01/21 23:40:38
TIME_FORMAT_FRAMEを指定してから使うよろし。
>>247でも書いてるけど、すべてのストリームでTIME_FORMAT_FRAMEが使えるとは限らない。
本格的にやるならDESを使うんですかね。
自分はやったことないので分からないですが。
250:デフォルトの名無しさん
09/01/22 15:56:17
コーデックの関係でSampleGrabberでの画像抽出ができずBasicVideoを使っているのですが
BasicVideoのGetCurrentImageで画像を取ると3秒もかかってしまうのですが
これをもっと早く取る方法ってありますか?
251:デフォルトの名無しさん
09/01/22 16:27:45
ムリポ
「コーデックの関係でSampleGrabberでの画像抽出ができず」辺りを
もう少し詳しく話した方が、いい話が聞けるかもよ?
252:デフォルトの名無しさん
09/01/22 16:56:00
>>251
そうですね。失礼しました。
カノープス社のコードックであれしてるaviファイルから静止画を取りたいのですが
これが何故かSampleGrabber->GetConnectedMediaTypeでエラーになるんです。
ちなみにほかのaviファイルでは正常に静止画が取得できています。
それで試しにBasicVideoで静止画と取ってみたら取れたのですがこれが遅くて・・・
253:デフォルトの名無しさん
09/01/22 17:57:02
小出しはやめてね
254:デフォルトの名無しさん
09/01/22 18:04:39
カノープスのコーデックといってもHQとかMJPGとかいろいろある
255:デフォルトの名無しさん
09/01/22 18:11:38
HQです。
今色々試してたんですが、SetMediaTypeするときの
サブタイプをMEDIASUBTYPE_RGB32にすると
GetConnectedMediaTypeでエラーが出ずに通ったのですが・・・
これすると、映像がさかさまになってる・・・
256:デフォルトの名無しさん
09/01/22 21:17:22
>>255 さかさまってビットマップか?
257:デフォルトの名無しさん
09/01/22 21:44:12
---------------------------------------------------------------------------
可能な限り速くコマ送りするのってどうするんですか?
IVideoFrameStepを使うと1倍速以上にはならないし、逆方向には進めません。
独自レンダラでレンダリングした画像を
加工して1コマずつ連番BMP出力したいだけなんですが。
(将来的にはDirectShowを使った出力も実装したいが、取りあえずBMPで)
>>255
memcpyを使って画像を自力で反転するしかないのでは。
(画像の横幅*4byteのサイズでコピーを繰り返す)
4byteなのはMEDIASUBTYPE_RGB32で32bitの画像と指定したからです。
もしRGB24なら3byteです。
258:デフォルトの名無しさん
09/01/23 00:52:55
>>255
BITMAPINFOHEADERか何かで上下反転してるかどうかの判定は
可能じゃなかったかな?
>>257
SampleGrabberを使ってた時の経験だけど、SetSyncSource(NULL)では
うまくいかなくて、SetRateで適当に100倍くらいを設定して全力取得したり
したことはあります。ただ、コーデックによってはうまくいかないかも。
259:デフォルトの名無しさん
09/01/23 09:47:42
MIDIをWAVEに変換する方法はあるんでしょうか?
再生される以上どこかで電圧値に置き換わってると思うんですが、サウンドボードで変換されてるんですか?
MIDIデフォルトOUTを置き換えても不可能でしょうか?WAVE関連のものに置き換えできませんでした
260:デフォルトの名無しさん
09/01/23 10:15:08
>>256
いえRGB32にすると映像の方がさかさまになるんですよ。
RGB24にすると映像は正常なのですがGetConnectedMediaTypeでエラーになりまふ
>>258
あ、そうなんですか?
ちょっとヘルプみてみます。
261:デフォルトの名無しさん
09/01/23 10:32:57
>>260
取得できたAM_MEDIA_TYPEからBITMAPINFOHEADERを引っ張り出して
biHeightの正負を見てみそって。
一応ココ(↓)見とき。
URLリンク(msdn.microsoft.com)
URLリンク(msdn.microsoft.com)
URLリンク(msdn.microsoft.com)
フォーマットによって成功したりしなかったりはColor Space Converterが
途中に入るかどうかによるのかもしれん。
262:デフォルトの名無しさん
09/01/23 10:38:29
>>261
ありがとうございます。
しかしbiHeightが負で判別できた場合はどうやって映像を正常に表示できるんでしょうかこれ。
263:デフォルトの名無しさん
09/01/23 10:56:49
ん?
レンダリング結果も上下反転してるの?
BMPに保存したときだけじゃなくて?
264:デフォルトの名無しさん
09/01/23 11:02:18
BMPファイルのヘッダの高さもそのままマイナスにすれば普通は問題ない
まれに対応していないソフトもある
265:デフォルトの名無しさん
09/01/23 11:32:50
>>263-264
静止画は正常で動画の方が逆になるんですよね・・・
でもRGB24にすると動画は正常になるけど
GetConnectedMediaTypeでエラーになって・・・
266:デフォルトの名無しさん
09/01/23 12:47:44
それがDirectShowの仕様です
267:デフォルトの名無しさん
09/01/23 18:26:01
全フレームの画像を取得したいのですが
SetPositionsでフレームを移動して取ると時間がかかるので
もっと効率的な方法はどうしたらいいですか?
268:デフォルトの名無しさん
09/01/23 20:41:02
>>259
WavDestとFileWriterでよかばってん
>>267
ストリーム流しながらのサンプルグラバでよかばってん
269:デフォルトの名無しさん
09/01/23 20:52:30
ばってん何?
270:257
09/01/23 22:24:25
>>258
SetRateは(貴方が書いているように)コーデックによっては使えないので・・
SetSyncSource(NULL)しても再生は別スレッドで行われているのに
どうやって
レンダリング→BMP出力→レンダリング→BMP出力→...
のように同期させられるんでしょうか。
271:デフォルトの名無しさん
09/01/23 22:27:17
基本的な事だけどpushとpullモデル理解しているか?
272:デフォルトの名無しさん
09/01/23 22:37:32
>>257
サンプルグラバとNullRenderer使えよ
273:257
09/01/23 23:17:54
>>271
push??pull?
URLリンク(unkar.jp)
色々調べてみたら、これがヒットしました。
・・・ソースフィルタを作って加工したデータをこのフィルタに送るんでしょうか
274:デフォルトの名無しさん
09/01/23 23:20:49
MSのドキュメントも読んでいないなんて死んだほうがいい
275:デフォルトの名無しさん
09/01/24 11:38:54
>>268
ダメです、MIDIParsaとWevDestがつながりません。
pMediaType->SetType(&MEDIATYPE_Midi);
の変更もしてみたんですがダメです。グラフエディタでつながらないと出ます
お願いします
276:デフォルトの名無しさん
09/01/24 13:47:34
>>275
情報少なすぎてわかるわけがないよ。エスパーじゃないし。
わかるように書いてよ。
277:デフォルトの名無しさん
09/01/24 15:04:31
MIDIのトランスフォームフィルタを自作するか見つけてくる必要がある。
278:デフォルトの名無しさん
09/01/25 17:51:50
まったく作れそうな気がしません
音源はどこから引っ張ってくればいいんですか?
279:267
09/01/26 11:45:44
>>268
再生しながらはどのようにゲットすればいいですか?
イベントですか?
でもイベントでは1フレームずつ入ってこなかったしなあ
280:デフォルトの名無しさん
09/01/26 18:15:47
コールバックですよコールバック
このスレでも何度か話題に出てるんで探してみれ
281:デフォルトの名無しさん
09/01/29 21:59:01
COutputQueueを使ってコマ送りって可能?
282:デフォルトの名無しさん
09/01/30 13:26:27
サンプルグラバのGetCurrentBufferで静止画を取得する時に
動画サイズのまんまではなくて縮小して取得したい時はどうしたらいいですか?
283:デフォルトの名無しさん
09/01/31 15:50:00
自分で縮小でも拡大でも好きにすればいいんじゃない?
284:デフォルトの名無しさん
09/02/02 03:20:48
複数の音楽ファイル(mp3とWMA)の一部ずつ(サビの部分)を繋いで、一つのWAVにしたいのですが、
どう作ればいいのか判りません。
最初の曲は、サビまでシークしてしてから、WAVEファイルにはできているようです。
ですが、2曲目を処理しようとすると、グラフを停止しないと、接続できないという現状です。
例えば、2つの曲をフェードインアウトで繋げる処理はどう書けばいいのでしょうか?
なにかヒントやサンプルなど教えてもらえるとありがたいです。
285:デフォルトの名無しさん
09/02/02 04:29:59
高校の物理をちゃんと勉強していれば簡単な事なんだけどね
286:デフォルトの名無しさん
09/02/02 10:56:55
DESじゃないのん?
287:デフォルトの名無しさん
09/02/03 01:16:38
>>286
DESってDirectshow編集サービスのことですよね。
ちょっと調べてみます。 ありがとうございました。
288:デフォルトの名無しさん
09/02/05 14:32:39
質問です。
MP4ファイルの頭に5Kほどのデータを付加したファイルを再生する
フィルターをASyncサンプルに手を加えて作りました。
GraphEditではファイルを選択して、VideoRendererとPIN接続すると、
MP4Splitterとffdshow codecが間に入り再生できます。
このファイルをGraphEditにD&Dするとはじかれます。
これをIGraphBuiderでグラフを作って再生したいのですが、
どうしても自作フィルターとMP4SplitterとのConnectで
CANNOT_CONNECTが帰ってきてしまいます。
自作フィルタにファイルパスを与えてグラフに追加するという、
GraphEditでの動作をどのようにプログラムしていいのかわかりません。
方法をご存知の方、ご教授ください。
ベースとするフィルタを間違えているのでしょうか?
289:デフォルトの名無しさん
09/02/05 15:14:59
デバッグすりゃ原因がわかるだろ
290:デフォルトの名無しさん
09/02/05 15:17:29
>>289
知らないならレスしないで下さい。ウザいだけです。。
291:デフォルトの名無しさん
09/02/05 16:01:11
俺もデバッグすりゃ原因が分かると思う。
292:デフォルトの名無しさん
09/02/05 16:50:34
IGraphBuilder::RenderFile() を使っちゃってる、に1票
・・・じゃないよね。
自作フィルタはちゃんと自前でCoCreateInstanceしてる?
293:デフォルトの名無しさん
09/02/05 16:51:15
あ、メリット値を適切に設定してるなら別ね。
294:デフォルトの名無しさん
09/02/05 17:14:08
GraphBuilderに自作SourceFilterとVideoRendarerだけ追加したら
後はRendaerFileでいいんじゃないの?
そうすりゃMP4Splitterとffdshow codecが勝手に間に入るだろ
295:デフォルトの名無しさん
09/02/05 23:36:50
LONGLONG tmp = (LONGLONG)(frame * Renderer->getATPF());
pMediaSeeking->SetPositions(&tmp,AM_SEEKING_AbsolutePositioning,
NULL,AM_SEEKING_NoPositioning);
AverageTimePerFrameを使ってシークするのって駄目なんですか?
たまに思った位置にシークできないファイルがあります。
296:デフォルトの名無しさん
09/02/07 01:54:57
ISampleGrabberについての質問です。
DirectShowでmp3を再生中にISampleGrabberのGetCurrentBufferを行うと、
再生中の場所の波形データが取得できると思うのですが、
毎回GetCurrentBufferを行っても、1秒間に約3回ほどしか取得するデータに変化がありません。
リアルタイムに現在再生中の場所の波形データを取得するにはどうしたらよいのでしょうか。
297:デフォルトの名無しさん
09/02/07 15:37:21
URLリンク(oshiete1.goo.ne.jp)
URLリンク(okwave.jp)
298:デフォルトの名無しさん
09/02/08 10:12:29
>>297
ありがとうございます。
解決しました。
299:デフォルトの名無しさん
09/02/08 11:17:10
質問したなら、どう解決したのか書いて欲しい。
それにしてもマルチポストなんて今時珍しいね。
回答が付いているところにも驚いた。
300:デフォルトの名無しさん
09/02/08 13:21:49
初歩的な質問ですが
キャプチャーボードにチューナ・S端子・コンポジットがあるのですが
その切り替えはDirectShowでできるのでしょうか?
カメラで入力した映像を解析ソフトを作ってみたのですがWebカメラでは物足りなくて
手元にあったボードを使ってみたのですが初期でチューナーになってしまうので
お願いします
301:デフォルトの名無しさん
09/02/08 16:32:30
映像解析ソフトを作るとはハイレベルだ
302:デフォルトの名無しさん
09/02/08 17:28:15
>>300
つ Crossbar
303:300
09/02/08 17:55:56
できるんですね。ありがとうございます
304:デフォルトの名無しさん
09/02/09 09:54:17
2つの動画を同時再生したいんですが、2回同じ表示手続きをしないとダメですか?
305:デフォルトの名無しさん
09/02/09 10:42:16
グラフ2つ作れば良いだけの話では?
306:デフォルトの名無しさん
09/02/09 11:58:32
>>305
あ、すみません。
そこの所をもうちょっと教えてください。
どこか参考になるサイトとかもあったらお願いしまふ
307:デフォルトの名無しさん
09/02/09 12:54:37
>>306
1つのソースでレンダラ2つ出したいならスプリッタを使う。
別々のソースを表示したいならグラフビルダ2つ用意する。
308:デフォルトの名無しさん
09/02/09 13:45:22
>>307
別の動画を再生したいからグラフを2つ作るんですね。
それで再生とかする場合はMediaControlも2つですよね?
309:デフォルトの名無しさん
09/02/09 15:24:10
質問です。
IMediaDet::get_StreamLength() および get_FrameRate() で得られた値を使って
非圧縮AVIファイルの総フレーム数を取得するコードを書いていますが、
あるVista環境にて総フレーム数を間違うことがあります。
(822フレームと算出してもらいたいところ、830となったりします。)
何か特殊なフィルタがインストールされているのではないかと思うのですが、
客先環境のため、簡単にチェックできません。
とりあえず不具合回避策は準備したので緊急度は低いのですが、
このようなことが起こるケースについて何かご存知の方がいらっしゃいましたら、
ご教示ください。
310:デフォルトの名無しさん
09/02/09 16:11:46
>>308 いえす
311:デフォルトの名無しさん
09/02/09 16:16:20
>>310
ですよね。
と、言う事はやはり再生等に必要なアレは2つずつ用意しないといけないんですね。
ちなみに、同じコールバック関数を呼ぶようにした場合ってどっちの動画か見分ける術ってありますか?
312:デフォルトの名無しさん
09/02/09 16:24:04
>>311
アレじゃわかんない。
コールバックって何よ。ISampleGrabberCB::SampleCBだったら
パラメータのIMediaSample で区別ができるかもしれない。
が、流す動画による。
313:デフォルトの名無しさん
09/02/09 16:27:03
>>312
BufferCBを使ってるんです><
ちなみにアレとは
MediaControl、MediaEventEx、SampleGrabber、VideoWindowです。。。
314:デフォルトの名無しさん
09/02/19 17:11:04
クズ共ちょっと教えてください。
XP64ビットOSでVC2009で32ビット用でコンパイルすると正常に動画再生ができるが
64ビット用でコンパイルすると音だけでて映像が表示されないんです。
お前達のようなゴミにはわからないかもしれませんが宜しくお願いします。
315:デフォルトの名無しさん
09/02/19 17:16:53
VC2009
316:デフォルトの名無しさん
09/02/19 17:26:03
コーデック
317:デフォルトの名無しさん
09/02/19 17:33:45
思ったとおり役に立たないクズしかいないですね
318:デフォルトの名無しさん
09/02/19 17:35:46
>>316
319:デフォルトの名無しさん
09/02/19 23:58:51
ここはエスパー板じゃないんで、314の期待するような能力者は居ません。
もうちょっとヒントが多ければ優秀な推理マニアが現れるかもね。
320:デフォルトの名無しさん
09/02/20 00:53:51
だからさ、64bitプロセスには64bit版コーデックが要るんだよ。
321:デフォルトの名無しさん
09/02/20 02:26:18
知ってるがおまえの程度がAA略
322:デフォルトの名無しさん
09/02/20 08:21:22
64ビットアプリにゃ64ビットDLL(この場合コーデック)が必要という常識も知らず
クズ呼ばわりってどんだけおめでたいんだ・・・。
コピペ厨房の俺でさえ知ってるわ。
323:デフォルトの名無しさん
09/02/20 09:56:16
>>322
その程度の知識しかないから役立たずのクズって言ってるの
だから知らないならレスするなって
324:デフォルトの名無しさん
09/02/20 10:14:37
64bit Windowsが普及しない原因を知ってれば、
容易に気が付くだろ。知識なんかほとんどいらね。
バカじゃねーの?
325:デフォルトの名無しさん
09/02/20 10:36:15
知らないからって必死になるなって
326:デフォルトの名無しさん
09/02/20 11:09:56
>>314
が必死になってるのか。
327:デフォルトの名無しさん
09/02/24 11:30:20
VideoWindow->put_OwnerにHBitmapを与えて再生した時に
ウィンドウフレーム無しの動画が画面上に表示されるのですが
これHBitmapだからそのまま変換して画像としてファイルに保存できますか?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4997日前に更新/109 KB
担当:undef