DirectShowと戦うスレ Part 3

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
DirectShowプログラマーのみなさん。
メソッドのデッドロックとか、わけわからん現象多くないすか。
このスレに怒りやテクをぶつけましょう。

過去スレ
Part 2 http://pc11.2ch.net/test/read.cgi/tech/1162913156/
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1026666092/
2デフォルトの名無しさん:2008/03/19(水) 16:37:12
関連スレ
Win32API質問箱 Build63
http://pc11.2ch.net/test/read.cgi/tech/1204600558/
くだすれDirectX(超初心者用)part.3
http://pc11.2ch.net/test/read.cgi/tech/1193605500/
【C++】 DirectX初心者質問スレ Part16 【C】
http://pc11.2ch.net/test/read.cgi/tech/1202634347/
DirectX総合スレ (Part8)
http://pc11.2ch.net/test/read.cgi/gamedev/1205306118/
3デフォルトの名無しさん:2008/03/19(水) 16:38:05
関連サイト
MSDN Microsoft DirectX9.0 DirectShow
http://msdn.microsoft.com/library/ja/DirectX9_c/directx/htm/directshow.asp
DirectX ホームページ
http://www.microsoft.com/japan/windows/directx/
MSDN ホームページ
http://www.microsoft.com/japan/msdn/
MSDN ライブラリ
http://msdn.microsoft.com/library/ja/
MSDN 2 ライブラリ
http://msdn2.microsoft.com/ja-jp/library/
Geekなページ DirectShowプログラミング [VC++]
http://www.geekpage.jp/programming/directshow/
あひるのホームページ DirectShowをよりよく使いたい人たちのサイト
http://hammer.prohosting.com/%7Earabo/DirectShow.shtml
Windowsでビデオキャプチャを作るため参考資料まとめ
http://www1.bbiq.jp/kougaku/link_videocap.html
奈良高専 土井研究室  動画あれこれ
http://wwwdoi.elec.nara-k.ac.jp/html/jisyu/doga/index.html
東京理科大 Kato Laboratory プログラミングキャプチャ
http://www.katolab.ee.kagu.sut.ac.jp/programing/capture.htm
京大川嶋氏 DirectShowのビデオキャプチャプログラミング
http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/directshow.html
M.Oshikiri's HomePage
http://www.geocities.jp/konbiki/tips/index.html
DirectShowを利用した透明ウィンドウでのビデオ再生
http://codezine.jp/a/article/aid/322.aspx

Google
http://www.google.com/
4デフォルトの名無しさん:2008/03/20(木) 22:29:49
乙です。
ttp://www.shader.jp/xoops/html/masafumi/directx9/DShow/dshow001.htm
上のページを参考にsdk8.1のtexture3dのソースを変えて音が出るようになったのですが、

//WMVとかMPEG2とか
hr = m_pGB->RenderFile(wFileName,NULL);
if(FAILED(hr))
return hr;
if(!bSound)
{
// 無音
hr = IAudio->put_Volume(-10000);
}
else
{
//音の出力
hr = IAudio->put_Volume(0);
}

WMVとかMPEG2を読み込む処理に飛んでbSoundが1(音を鳴らす)の
場合、テクスチャにムービーを描画せず、新たに画面が出てそちらに
描画してしまいます。bSoundが0のときはテクスチャに描画できます。
知りたいのはsdk9.0の場合はそのような問題はありますか?ということです。
5デフォルトの名無しさん:2008/03/21(金) 11:30:57
上のコードのコピペ全部間違いでした。正しくは

//AVIとかMPEG1とかVFWでいけるやつ
//オーディオトラックを再生しない場合 NO_AUDIO_RENDERER を定義
if(!bSound)
{
// If no audio component is desired, directly connect the two video pins
// instead of allowing the Filter Graph Manager to render all pins.
CComPtr<IPin> pFTRPinIn; // Texture Renderer Input Pin
// Find the source's output pin and the renderer's input pin
if (FAILED(hr = pCTR->FindPin(L"In", &pFTRPinIn)))
{
Msg(TEXT("Could not find input pin! hr=0x%x"), hr);
return hr;
}
// Connect these two filters
if (FAILED(hr = m_pGB->Connect(pFSrcPinOut, pFTRPinIn)))
{
Msg(TEXT("Could not connect pins! hr=0x%x"), hr);
return hr;
}
}


6デフォルトの名無しさん:2008/03/21(金) 23:18:45
新スレ乙
7デフォルトの名無しさん:2008/03/22(土) 23:40:25
キーフレームの取得ってどうやってやればいいですか?
8デフォルトの名無しさん:2008/03/24(月) 15:14:07
>>5
サンプル読んでないんで違ってるかもしれんけど、
IVideoWindow使って、
videoWindow.put_AutoShow(DsHlp.OAFALSE);
とかでウィンドウ非表示に出来ない?
9デフォルトの名無しさん:2008/03/24(月) 17:15:38
C#でレンダラフィルタを作成したいのですが、
基底クラスCBaseVideoRendererがないため作成できません。
C++ならstreams.hにあるのですが、C#の場合どうしたらいいのでしょうか?
10デフォルトの名無しさん:2008/03/24(月) 17:45:37
DirectShowNETのようにCOWで書くか
C++/CLIでBaseClassesをマージしながらラッパーを自前で書くか。
11デフォルトの名無しさん:2008/03/24(月) 22:47:17
>>8 ありがとうございます。いろいろ試してみます。
12デフォルトの名無しさん:2008/03/24(月) 23:52:18
このスレをROMってて、ここまで出来ました

1.Webカメラの制御と動き検知による録画
 ・DirectShowでWebカメラからキャプチャ
 ・キャプチャの前後フレームの赤部分を比較して動き検知
 ・動きを検知したらStreamBufferで数秒前まで遡って一定時間録画
 ・録画後別スレッドで、MPEG4に変換
 ・フレームを適当に間引いて、JPEG保存 ⇒ ☆

2.上記☆のJPEG画像をクライアント(Webブラウザ)に配信
 ・NetworkStreamで、リクエストを受けてコンテンツをひたすら返す

上記の2の部分がもっといい方法があるはずと悩んでいます

 WindowsMediaエンコーダーで出来るWebカメラのストリーミング配信
(クライアント側はMediaPlayerで見るやつ)が本来やりたいことなんです

 色々検索してると
ttp://www.microsoft.com/japan/msdn/directx/techart/ds_wm_faq.aspx
「Windows Media Encoder は、キャプチャに DirectShow を使用します」
と書いてあるじゃないですか…

 どうやって DirectShowの最終出力をWindowsMediaEncorderに渡して
ネットワークストリーミングさせればいいのでしょうか?

 助けてぇぇぇ >_<
13デフォルトの名無しさん:2008/03/25(火) 04:27:08
>>10
なるほど。そういう方法がありますか。
ところでCOWってなんですか?ググってみたんですが、牛のcowばかり出てきて今いち分かりませんでした。
DShowLibのソースコードにそれと近いものってどれにあたりますかね?
14デフォルトの名無しさん:2008/03/28(金) 21:47:00
RCWかなんかのまちがいじゃねえの
15デフォルトの名無しさん:2008/03/29(土) 01:07:54
copy on write ぐらいしか見つけられん
16デフォルトの名無しさん:2008/03/30(日) 16:10:13
私も、DirectshowLibを使ってDESのプログラムを組もうとしています。
サンプルプログラム(DirectShowSamples-2007-JulyのDESCombine-2005.sln)において、
トラックを作成する際にIAMTimelineObjであるpTrack1ObjからキャストによりIAMTimelineTrackをモジュールスコープの変数m_Trackに取得しています。
public Group(AMMediaType mType, IAMTimeline pTimeline, double fps)
{
int hr;
hr = m_pTimeline.CreateEmptyNode( out pGroupObj, TimelineMajorType.Group);
DESError.ThrowExceptionForHR(hr);
try
{
//(省略)
m_Track = (IAMTimelineTrack)pTrack1Obj;
}
finally
{
Marshal.ReleaseComObject(pGroupObj);
}
//Marshal.ReleaseComObject(pTrack1Obj); // Released as m_VideoTrack in dispose
}
ここで、一番最後にコメントアウトされているMarshal.ReleaseComObject(pTrack1Obj); がなぜコメントアウトされているのかがちょっと理解できずにいます。
ttps://www.microsoft.com/japan/msdn/directx/japan/dx8/DES.aspx でC++でのサンプルが掲載されておりこのサンプルにおいては、
pTrack1Obj->Release();として開放しています。
ちょっとソースの修正を加えつつ、コメントアウトをはずしたプログラムを走らせるとトラックにソースを追加するAddメソッドの以下の行、
hr = m_Track.SrcAdd( pSource1Obj );
で「基になる RCW から分割された COM オブジェクトを使うことはできません。」
というエラーが発生し、すでに開放されてしまっているというような動作をしてしまいます。
調べてみると、一応両者ともに「参照カウントをデクリメント」するという動作で同じだと思われるのですが、
C++でのRelease()メソッドとC#のMarshal.ReleaseComObject()の動作は違うものなのでしょうか?
179
>>14
どうもです。

結局、レンダリングフィルタのみC++で書いてC#からCOMとして読み込むことにより解決しました。
答えてくれた皆さんありがとうございました。