- 1 名前:デフォルトの名無しさん [2008/06/22(日) 18:38:21 ]
- DirectShowプログラマーのみなさん。
メソッドのデッドロックとか、わけわからん現象多くないすか。 このスレに怒りやテクをぶつけましょう。 関連スレ Win32API質問箱 Build67 pc11.2ch.net/test/read.cgi/tech/1212931246/ くだすれDirectX(超初心者用) part.3 pc11.2ch.net/test/read.cgi/tech/1193605500/ 【C++】 DirectX初心者質問スレ Part17 【C】 pc11.2ch.net/test/read.cgi/tech/1207702556/ DirectX総合スレ (Part8) pc11.2ch.net/test/read.cgi/gamedev/1205306118/ 【PureVideo】DirectX Video Acceleration【AVIVO】 pc11.2ch.net/test/read.cgi/tech/1178285897/
- 152 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:49:58 ]
- C++で作ったフィルタをC#から使うのってどうやるの?
検索しても出ない
- 153 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:29:33 ]
- >>152
フィルタを使うじゃ抽象的過ぎてわからんよ。
- 154 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:43:57 ]
- 手とり足とりということです
- 155 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 21:00:54 ]
- DShow.NETがあるやん。
- 156 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 21:33:31 ]
- もちろん、DirectShow自体COM Interopでもなんとかなるはず。
- 157 名前:152 mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 22:24:21 ]
- COMに対応したDLLってのは1のことか?
SDKのサンプルの改造じゃだめなの?
- 159 名前:152 mailto:sage [2008/12/23(火) 22:46:59 ]
- ・・・どのサンプル?
- 160 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 22:50:45 ]
- SampVidとかだけど。
- 161 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 22:33:25 ]
- "C# DirectShow"でgoogle検索すると山ほど見つかるわけだが。
何を迷ってる?
- 162 名前:デフォルトの名無しさん mailto:sage [2008/12/25(木) 00:38:38 ]
- DirectShowに関係ないところで迷ってるぽい
- 163 名前:デフォルトの名無しさん mailto:sage [2008/12/25(木) 01:33:09 ]
- 質問なのですが、HDVをDirectShowでキャプチャすることはできますでしょうか?
- 164 名前:152 [2008/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 名前:デフォルトの名無しさん [2009/01/02(金) 21:25:16 ]
- 1フレーム目を表示させてすぐ一時停止状態にするのって
どうやるの?
- 166 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 22:21:16 ]
- 目と指と反射神経を鍛える
- 167 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 23:19:34 ]
- 普通にImediaControl::Runするとビデオが進んでしまうので
そうさせない方法を
- 168 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 00:07:03 ]
- Pauseでええやん。
- 169 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 14:21:02 ]
- ライブストリーミングを保存するために
動画を再生しながらファイルにも出力しようと思っているのですが SampleGrabberで可能なのでしょうか? Web上のサンプルは静止画を切り抜くものばかりで使い方がよくわかりません・・・
- 170 名前:デフォルトの名無しさん [2009/01/06(火) 14:40:49 ]
- 指定フレームの画像を抽出しようと以下のようにすると
MediaSeeking->SetPositions( ¤t, AM_SEEKING_AbsolutePositioning, &stop, AM_SEEKING_AbsolutePositioning ); ::Sleep( 50 ); // ←これないとフレーム移動する前の画像になる SampleGrabber->GetCurrentBuffer( &DIBBufferSize, (long *)DIBBuffer ); 間にSleepを入れないと指定フレームの画像にならなのですが もっと早く取る方法あったら教えてください。
- 171 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 15:10:32 ]
- >>169
可能です。 ただ、ファイル出力処理で滞ると当然コマが飛びます。 再生優先かファイル出力優先かによってコールバック内の実装をよく考えるべし。 >>170 IMediaControl::GetState()で必要最低限のウェイトを入れられると思います。 デバッグ中ならとりあえずINFINITEを入れてもいいでしょう。
- 172 名前:169 mailto:sage [2009/01/06(火) 16:03:26 ]
- >>171
ありがとうございます 現在 ttp://www.geekpage.jp/programming/directshow/samplegrabber.php こちらのページを参考にしているのですが BMPではなくそのままの動画ファイルにするには どういった部分を変更すればよいのでしょうか?
- 173 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 16:38:33 ]
- >>172
あー、ごめん、別に自前のメモリにビットマップが欲しいわけなじゃないのね。 じゃあ、この辺りを参考にしてみてはどうでしょう? VBで書いてあるけど、大体意味は分かるでしょう。 ttp://www.geocities.co.jp/SiliconValley/7406/tips/dshow/dshow3.html 簡単に説明すると、入力データを Infinite Pin Tee Filter で分岐させて、 Video Renderer と AVI Mux につっこむ。 ピンのつなぎ方が分からなければ、またそのときに。
- 174 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 17:01:41 ]
- >>171
ありがとうございます。 IMediaControl::GetState()で最低限のウェイトにできました。 所でこれはやっぱりウェイトを入れないとダメなものなんですか?
- 175 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 17:51:04 ]
- >>174
フィルタグラフ自体は別のスレッドで動いているものなので、 スレッド間で同期をとることを考えると仕方のないことですね。
- 176 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 18:12:26 ]
- >>175
そうなんですか。 ちなみに、最初のフレームから最後のフレームまで 順番に画像を抽出したい場合は>>170以外の方法でもっと効率がいいやり方はありますか?
- 177 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 18:41:58 ]
- なんか知らんが、普通にエンコードする時の様にフィルタ繋げるだけでいいんでね?
- 178 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 18:50:35 ]
- やりたい事は、最初のフレームから最後のフレームまで順番に
画像を取り出すだけなんですけどね。特に動画を再生する必要はないんですが
- 179 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 18:55:56 ]
- >>176
毎フレームSetPositionsをするのは確かに効率が悪いです。 可能であればSampleGrabberのコールバックを使った方がいいでしょう。 自分は以下の記事を参考にしてコールバック処理を実装しました。 ttp://codezine.jp/article/detail/322 GetCurrentBufferに比べると結構面倒ですけどねw しかし結局自分はSampleGrabberの実装を捨てることになってしまいましたorz (まあどうでもいいことですが)
- 180 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 19:13:34 ]
- >>179
ありがとうございます。 参考にさせて頂きます〜
- 181 名前:169 mailto:sage [2009/01/06(火) 19:14:29 ]
- >>173
度々ありがとうございます VBはいまいち理解できてないのですがVC++の場合ですと ttp://www.geekpage.jp/programming/directshow/video-capture-save-avi.php こちらのページの入力をビデオカメラから動画ファイルに変更するということでよろしいのでしょうか? 的外れな質問でしたらすみません
- 182 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 19:41:19 ]
- >>181
そこにはキャプチャデバイスからAVIファイルに直接保存する方法が書いてありますが、 169さんの場合対象が(ネットワーク上の)ファイルからの再生だとすると あまり参考にならないと思います。 とりあえず>>173で挙げたページと同じようにGraphEditでフィルタを繋いでみて、 自分の意図している動作をさせられるか、を確認してはいかがでしょうか。 ほな。
- 183 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 21:14:22 ]
- こちらはDirectShowについては全く無知な素人です。
板違いな質問かもしれませんが、ことはDirectShowに関わる問題なようなので、お詳しい皆さんお助けください。 「Virtual PC」上で、NHKオンデマンドからDLしたWMVファイルをWMPで再生を試みたところ、「DirectShow フィルタ グラフに存在しないピンに操作を実行しようとしました」と表示され、再生できませんでした。 OSはXP、WMPのバージョンは10です。 解決法について、ご教示のほど願います。
- 184 名前:167 mailto:sage [2009/01/06(火) 22:10:41 ]
- >>168
RunしてすぐにPauseするという事? ttp://www.shader.jp/xoops/html/masafumi/directx9/DShow/dshow001.htm を参考にレンダラー作ったんだけど RunしてすぐにPauseすると一回もレンダリングが行われないで ポーズしてしまう・・・
- 185 名前:169 mailto:sage [2009/01/06(火) 22:23:50 ]
- >>182
ライブストリーミングの場合はアドレスが「IP:ポート番号」になるので GraphEditではどうやってソースとして指定できるのかがわかりません 再生することはできたので 要は再生している動画を別ファイルに保存するというようなことをしたいのですが 簡単な方法などないでしょうか? 何度も質問ばかりで申し訳ありません
- 186 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 23:40:19 ]
- >>184
DoRenderSampleで初回のフレームが到着したかどうかチェックして ポーズをかけてみたらどうでしょう? (やり方としてマットウかどうかはよく分かりませんが) >>185 File Source (URL) で・・・、と思ったけどこれで直接URL指定する方法が分かりませんね。 一応適当なテキストファイルにアドレスを書いて File Source (Async) で開くと 勝手に ASX File Parser が繋がってFile Source (URL) で開きなおしてくれるっぽい・・・。 こっち(↓)みてコード書いた方が早いかも。 ttp://www.geekpage.jp/programming/directshow/renderfile-url.php
- 187 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 10:13:37 ]
- ちょいと質問なんですが。
DirectShowがまだ何かに統合する前に作ったソフトがあるのですが これ今でもDirectX9にしても普通にコンパイルできて動画がみれるのですが コンパイルできてるなら特にSDKとかなくてもいいんですよね?
- 188 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 10:30:51 ]
- VFWでコーディングされているのではないかとエスパー
試しにコードの一部でもうpしてみれ
- 189 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 12:49:42 ]
- おおう、エスパー失敗w
普通にDirectShowね。 「まだ何かに統合する前」てActiveMovie時代のことを言ってるのかな? 当時はActiveMovie SDKのインストールが必要でしたね。 Visual Studio .NET 2003辺りならPlatform SDKのサブセットみたいなのが 同梱されていたと思うので、特にSDKを追加する必要はないはず。 2005以降だとEEであればPlatform SDKかWindows SDKのインストールは 必要になると思いますです、ハイ。
- 192 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 13:17:20 ]
- >>191
これDirectShow使うのに必要なのって ヘッダファイル DShow.h QEdit.h と strmiids.lib とDirectXがインスコされていればいいだけですよね?
- 193 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 13:34:24 ]
- >>192
プログラムとしてインクルード/リンクすべきファイルはそんなもんですが、 各ヘッダからやはり別のWindows(Platform) SDKに含まれるヘッダを インクルードしている形跡もあるので、注意は必要かと思います。 まあ、コンパイルしてみれば分かることですけどね。
- 194 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 13:40:56 ]
- >>193
あ、そっか、そうですよね。 とりあえず今は普通にコンパイルが通るって事は 以前にインスコしたのがあるからなんですね。
- 195 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 18:04:57 ]
- Visual Studio 2008 Standard EditionってSDK入れないとダメですか?
何かExpressは同封されてるって書いてるんですが・・・
- 196 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 18:17:50 ]
- されてるって書いてあるのに何故インストしない?
BaseClassesの方ならStandardのSDKにすら入ってないよ。 いつもどうり別途Windows SDKが必要。
- 197 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 18:22:57 ]
- ExpressじゃなくてStandardだから。
Standardはどうなのか知りたかった
- 198 名前:184 mailto:sage [2009/01/09(金) 21:51:03 ]
- >>186
なるほど DoRenderSample() { ... rendered = true; ... } movie->play(); while(!movie->isRendered()) { } こんな感じ?確かにあまりまっとうじゃない・・ ttp://www.geekpage.jp/programming/directshow/samplegrabber-3.php 画像の取得はCBaseVideoRendererで、1フレーム目でとめるのには SampleGrabberを使うということはできるのかな
- 199 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 22:34:33 ]
- >>184
そのままの意味だ。RunしないでPause。
- 200 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 22:37:33 ]
- ttp://msdn.microsoft.com/ja-jp/library/cc356923.aspx
つか、全部書いてあるだろ。ドキュメントくらい読め。
- 201 名前:184 mailto:sage [2009/01/09(金) 23:53:34 ]
- しかし なにもおこらない
Runして初めて表示される・・
- 202 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 00:58:38 ]
- oops!レンダラ自作してるのか。悪かった。
Pauseでポスターフレーム出す処理はレンダラが実装する必要があるんだわ。 void OnReceiveFirstSample(IMediaSample *pMediaSample) { DoRenderSample(pMediaSample); } これ追加するとよかばってん
- 203 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 08:09:02 ]
- おー、OnReceiveFirstSampleってそうやって使うんか。
184じゃないけどthx
- 204 名前:169 mailto:sage [2009/01/12(月) 19:29:05 ]
- とりあえずGraphEditを使ってみた結果
ttp://sageuploader.if.land.to/cgi-bin/1upload/src/sage1_8271.jpg このようにすることでライブストリーミングが保存できました あとはこれをプログラムで書くだけなのですがピンのつなぎ方がよくわかりません 再生の場合は ttp://www.geekpage.jp/programming/directshow/renderfile-url.php にあるように pMediaControl->RenderFile(URL); pMediaControl->Run(); という風にすればよいというのはわかるのですがこの場合はどうすればよいのでしょう? SetOutputFileNameとRenderStreamを使えばよいのかな?と考えてはいるのですが サンプルがビデオキャプチャからの取得方法ばかりで こういった場合にどのような記述をすればよいのかわかりません
- 205 名前:デフォルトの名無しさん [2009/01/12(月) 22:51:43 ]
- これ使って作ったツールはWindows2000でも動くかな?
- 206 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 01:18:52 ]
- >>204
RenderFilleやっちゃいかん。 ソースフィルタ(URL)をフィルタグラフに登録したあと、 出力ピンを列挙してAVI Muxに1つずつ接続すればおk たぶん。 あ、あとファイル出力も手動で指定してフィルタ繋いでね。
- 207 名前:169 mailto:sage [2009/01/13(火) 06:56:07 ]
- >>206
ありがとうございます 以下のようなプログラムを作ってみたのですが ttp://uploaders.ddo.jp/upload/1mb/src/1up5294.txt コンパイルすれば通るものの実行してもファイルが作成されません これはピンのつなぎ方などが間違っているのでしょうか?
- 208 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 12:50:40 ]
- なんでエラー値をチェックしないの?
- 209 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 16:10:02 ]
- >>206さんのアドバイスが理解されていない・・・・
- 210 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 17:18:19 ]
- >>208
チェックしてみましたがどこもエラーは返ってきませんでした >>209 すいません・・・ >>206と ttp://msdn.microsoft.com/ja-jp/library/cc352330.aspx の辺を参考にしてやってみたんですがどの辺がおかしかったでしょうか? ソースフィルタ(URL)をフィルタグラフに登録、というのは pGraph->AddSourceFilter(URL, L"Source Filter", &pSrc); 出力ピンを列挙してAVI Muxに1つずつ接続 というところはRenderStreamを2回行ってみたのですが 根本的に間違っていたりしたらすみません・・・
- 211 名前:169 mailto:sage [2009/01/13(火) 18:38:16 ]
- あー見返すとなんか滅茶苦茶ですね
一から書き直してきます
- 212 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 19:57:05 ]
- okwave.jp/qa4625143.html
- 213 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 20:29:46 ]
- サンプルをビルドして動いたからと言って
安易に一歩踏み込むとすぐに樹海に迷い込むのがDirectShow。
- 214 名前:169 mailto:sage [2009/01/13(火) 22:44:13 ]
- 以下のように作り直してみたのですが、
ttp://uploaders.ddo.jp/upload/1mb/src/1up5301.txt AddFilterからどうしてもNULLポインタが返ってきたり GetPinがコンパイルをとおらずPin同士の接続ができなかったりしますが とりあえずそれらの部分を除外して実行した結果 localhost:7144/test.aviのようなファイルは保存に成功できました。 しかしライブストリーミングの場合は解像度と再生時間はきちんとできた動画が作成されたのですが 再生しようとしても再生されない動画ファイルでした やはりAddFilterやPinの接続がきちんとできていないことが原因なのでしょうか? GraphEditでは簡単にできても実際に作るのは難しいものなのですね 単に私が駄目なだけかもしれませんが
- 215 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 22:55:51 ]
- 確かに、GraphEditの様子をそのままコードにしてくれるツールがあったら欲しいな。
- 216 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 23:37:12 ]
- >>214
MSDNの通りにプログラムが書けてない。 IGraphBuilderはCoCreateInstanceしない。 ICaptureGraphBuilder2からGetFiltergraphで取得する。
- 217 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 01:21:22 ]
- なんだそのGetPinってのはどこからでてきた?自作メソッドなのか?
- 219 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 01:38:19 ]
- >>218
これ使ってピン同士を接続するのかなと思ってコピペしてきたら ただの自作メソッドでした 早とちりしてすみません 削っても動かないことに変わりはないのですが・・・
- 220 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 01:42:46 ]
- >>219
もう少し頑張って勉強してからまたおいで。 エスパーじゃないから、そんなんでコンパイル通らないとか言われても困るわ。
- 221 名前:デフォルトの名無しさん mailto:sage [2009/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 mailto:sage [2009/01/15(木) 19:18:33 ]
- 対象コンピュータをx64にしてたらエラーがでてx86にすると正常に通りました><
ちなみに上記のコードの後に読み込みと同時に1フレーム目を表示されようと MediaSeeking->SetPosition ←上のコードには書いてないですが今はQueryInterfaceしてます MediaControl->StopWhenReady(); VideoWindow->Visible( OATRUE ); を入れたのですが、何故か1回目の読み込み時には表示されず 2回目以降に表示されるのですが、何が原因ですか?
- 223 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 22:57:20 ]
- C++で作ったフィルタをC#で使いたいんですが
作ったフィルタをregsvr32で登録しないで使う方法ってありますか? 登録するのは(ユーザーにとって)面倒だし クラスの型がIBaseFilterにしか出来ないので アプリケーション側からデータを渡したり出来ません。
- 224 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 23:06:15 ]
- その程度の事もわからないお前には無理だ。
C#のCOMのラッピングのメカニズムも理解できていないんだろ?
- 225 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/01/15(木) 23:39:31 ]
- もはや時代はMediaFoundation
- 227 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 23:52:39 ]
- >>225
エラーコードは何ぞ? 試してないから外してるかもしれないけど、 pin_DefaultDSDeviceToをReleaseしてないから、ってなオチはない?
- 228 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 00:01:29 ]
- hr = pin_DefaultDSDeviceTo->Disconnect();
hr = pin_DefaultDirectSoundDevice->Disconnect();
- 229 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 00:43:07 ]
- エラーなくなりました。
フィルターを削除する時繋いであったピンを解除。 繋ぎ換えるのにも解除後接続ですね。覚えました 意外と融通きかないんですね・・・ ありがとうございました。
- 230 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 03:43:18 ]
- wmvが登場したとき wmvのコンテナに対応したソースフィルタを
書けと言われたときはくらくらと眩暈がした。
- 231 名前:デフォルトの名無しさん [2009/01/16(金) 12:36:29 ]
- ふうん
- 232 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 13:31:35 ]
- 1フレーム毎にイベントを取りたいのですが
イベント通知コードは何になるんですか?
- 233 名前:221 mailto:sage [2009/01/16(金) 15:57:23 ]
- >>222で最初のフレームが表示sれないって話なんですが
どうやら一瞬表示してるみたいで VideoWindow->Visible( OATRUE );の下にSleep( 1000 );と入れると 1秒間最は初のフレームを表示して、1秒後に消えてしまいます。 そして2回目に>>221を走らせた時はずっと最初のフレームを表示した状態になります 何が原因でしょうか・・・
- 234 名前:221 mailto:sage [2009/01/16(金) 16:11:44 ]
- わかりました。
どうやらStatic Textに描画されてるのがまずかったみたいです。 Picture Controlにしたら消えなくなりますた。。。 なにこれ・・・
- 235 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 17:00:57 ]
- Windowsの描画の基本的な所を理解していないのが問題
- 236 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 17:10:21 ]
- >>235が基本を教えてくれるそうです。
では、どうぞw
- 237 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 01:24:29 ]
- 他人が理解できる説明の仕方を意識しよう。あと、日本語を学べ。
- 238 名前:デフォルトの名無しさん [2009/01/19(月) 09:02:44 ]
- ではまず国語辞典を勉強したらよろしいでしょうか?わかりません><
- 239 名前:デフォルトの名無しさん mailto:sage [2009/01/19(月) 16:28:00 ]
- 単語を覚えるだけでは言語を会得できないな。
日本語でも英語でもプログラミング言語でも。
- 240 名前:デフォルトの名無しさん mailto:sage [2009/01/19(月) 17:49:44 ]
- GetConnectedMediaTypeでVFW_E_NOT_CONNECTEDが返って来るのですが原因は何でしょうか?
その前にやってるSetMediaTypeはちゃんとS_OKが返ってきてます。
- 241 名前:デフォルトの名無しさん mailto:sage [2009/01/19(月) 18:22:51 ]
- VFW_E_NOT_CONNECTED だから
繋げろ!
- 242 名前:デフォルトの名無しさん mailto:sage [2009/01/19(月) 18:30:15 ]
- >>241
言い忘れてましたが、VFW_E_NOT_CONNECTEDが出るのはGetConnectedMediaTypeだけで 他は普通にOKなので動画の再生はできています。
- 243 名前:デフォルトの名無しさん mailto:sage [2009/01/19(月) 18:51:39 ]
- 再生にサンプルグラバは関与してますか?
そうでなければ別にサンプルグラバが繋がってなくても再生に支障はありませんよ。 少々面倒でもROTを登録して外部からフィルタグラフを覗けるようにしておくと デバッグが便利ですよ。
- 244 名前:243 mailto:sage [2009/01/19(月) 18:52:57 ]
- × ROTを登録
○ ROTに登録
- 245 名前:デフォルトの名無しさん mailto:sage [2009/01/19(月) 19:03:42 ]
- >>243-244
やりたい事はと言うと、再生して指定フレームの画像をbmpとして保存したかったのです。 その為にサンプルグラバでAddFilter後にビデオヘッダを取得したりと・・・ とりあえずGraphEditでみてみようとおもいます・・・ ちなみに、同じソースを別PCで動かすとGetConnectedMediaTypeでエラーはでませんし 正常にbmpファイルに落とすことができています。
- 246 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 00:24:24 ]
- >指定フレーム
フレームで指定ってできるんだっけ? ○番目のフレームとか。
- 247 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 00:41:20 ]
- つSetPositions
とはいえ、TIME_MEDIA_TIMEしか使えないストリームだと ちょっと難しいけど。
- 248 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 22:49:54 ]
- SetPositionsって時間指定じゃん
- 249 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 23:40:38 ]
- TIME_FORMAT_FRAMEを指定してから使うよろし。
>>247でも書いてるけど、すべてのストリームでTIME_FORMAT_FRAMEが使えるとは限らない。 本格的にやるならDESを使うんですかね。 自分はやったことないので分からないですが。
- 250 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 15:56:17 ]
- コーデックの関係でSampleGrabberでの画像抽出ができずBasicVideoを使っているのですが
BasicVideoのGetCurrentImageで画像を取ると3秒もかかってしまうのですが これをもっと早く取る方法ってありますか?
- 251 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 16:27:45 ]
- ムリポ
「コーデックの関係でSampleGrabberでの画像抽出ができず」辺りを もう少し詳しく話した方が、いい話が聞けるかもよ?
- 252 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 16:56:00 ]
- >>251
そうですね。失礼しました。 カノープス社のコードックであれしてるaviファイルから静止画を取りたいのですが これが何故かSampleGrabber->GetConnectedMediaTypeでエラーになるんです。 ちなみにほかのaviファイルでは正常に静止画が取得できています。 それで試しにBasicVideoで静止画と取ってみたら取れたのですがこれが遅くて・・・
|

|