1 :
デフォルトの名無しさん :
2008/03/19(水) 16:36:49
2 :
デフォルトの名無しさん :2008/03/19(水) 16:37:12
3 :
デフォルトの名無しさん :2008/03/19(水) 16:38:05
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の場合はそのような問題はありますか?ということです。
上のコードのコピペ全部間違いでした。正しくは //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
新スレ乙
キーフレームの取得ってどうやってやればいいですか?
>>5 サンプル読んでないんで違ってるかもしれんけど、
IVideoWindow使って、
videoWindow.put_AutoShow(DsHlp.OAFALSE);
とかでウィンドウ非表示に出来ない?
C#でレンダラフィルタを作成したいのですが、 基底クラスCBaseVideoRendererがないため作成できません。 C++ならstreams.hにあるのですが、C#の場合どうしたらいいのでしょうか?
DirectShowNETのようにCOWで書くか C++/CLIでBaseClassesをマージしながらラッパーを自前で書くか。
>>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に渡して
ネットワークストリーミングさせればいいのでしょうか?
助けてぇぇぇ >_<
>>10 なるほど。そういう方法がありますか。
ところでCOWってなんですか?ググってみたんですが、牛のcowばかり出てきて今いち分かりませんでした。
DShowLibのソースコードにそれと近いものってどれにあたりますかね?
RCWかなんかのまちがいじゃねえの
copy on write ぐらいしか見つけられん
私も、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()の動作は違うものなのでしょうか?
17 :
9 :
2008/03/31(月) 00:12:12 >>14 どうもです。
結局、レンダリングフィルタのみC++で書いてC#からCOMとして読み込むことにより解決しました。
答えてくれた皆さんありがとうございました。