トップページ⇒tech
990コメント427KB

DirectShowと戦うスレ Part 2

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん2006/11/08(水) 00:25:56
前スレ
http://pc8.2ch.net/test/read.cgi/tech/1026666092/
0893デフォルトの名無しさん2008/01/28(月) 00:39:19
'Program Files'が空白で区切られた予感。後はシラネ
0894デフォルトの名無しさん2008/01/28(月) 01:16:43
_TIME_FORMAT_FRAMEなどが未解決というエラーがでます。小生プログラミング暦が短くデバッグすることができません。
お力かしてください。
0895デフォルトの名無しさん2008/01/28(月) 01:25:22
>>892
VC2005でDirectShowがインストールできませんよ
といっているの?
私もvc2005でDX9をインストールに失敗した経験があります。
vc2005(有料版)では素直にwindowsSDKを使ったほうが簡単でしょう

>>894
あなたもインストールに困っているのでしょうか?
その問題は昔のDirectShowプログラムをビルドすると出てきます。
直し方は新しくプロジェクトを作ればよかったと思います。
が、その後別の問題があったような覚えがあります。
DirectShowのインストールをやりなおしましょう
0896デフォルトの名無しさん2008/01/28(月) 19:30:50
プログラミングが難しいとか以前に、環境がサクっと作れないのは問題だよなー
0897デフォルトの名無しさん2008/01/28(月) 19:31:13
↑MSに対する文句です
0898デフォルトの名無しさん2008/01/29(火) 01:15:09
いや。インストール環境が作れていないのを変な質問にすり替える奴らが痛い。

英語のサイト見るとそのあたりの情報調べられるよ?
DirectShow人口増やしたいから答えるけどさ…
0899デフォルトの名無しさん2008/01/29(火) 01:16:52
簡単になること自体には異議はないが
そんなに難しくないだろ・・
0900デフォルトの名無しさん2008/01/30(水) 01:00:16
MSDNをみるとVMRの入力ピン メディア タイプは
「MEDIATYPE_Video メジャー タイプを持つあらゆるタイプ」
になっていますが、これはYV12なども接続可能ということでしょうか?
つなげてみると、うまく繋がらないのですが。。。
0901デフォルトの名無しさん2008/01/30(水) 02:01:26
ソースフィルタを作成しているのですが、
CLSID_VideoInputDeviceCategoryに属するフィルタの作成が出来ません。

g_TemplatesでCLSID_VideoInputDeviceCategoryを指定しているのですが、
CreateClassEnumeratorで列挙しても検出してくれません。
デバイスを伴ったWDMフィルタでなければ作成できないのでしょうか?

なにかヒントでも良いので教えてください。
0902デフォルトの名無しさん2008/01/30(水) 04:16:17
登録部分のソースコード読めばわかるよ。つーか読め。
ちなみに、Baseclassのコードでは結論から言うとデフォルトの CLSID_LegacyAmFilterCategory にしか登録されない素敵仕様。
一からコード書くのも面倒なんで、俺はDllSetup.cppを改造したものを使ってこの問題に対処した。
09039012008/01/31(木) 00:17:30
登録できました!ありがとうございます。

私も902さんに倣ってDllSetup.cppから必要な部分抜き出して、
登録部分を実装しました。
感謝感激でございます。
0904デフォルトの名無しさん2008/01/31(木) 00:51:11
VB6でDirectX Software Development Kit(August 2006)の組み合わせで、
DirectShowを利用したプログラムを作成していました。
今度、VB2005で同じようにDirectShowを利用するプログラムを作成するの
ですが、やはり、DirectX Software Development Kit(August 2006)がよい
のでしょうか?
0905デフォルトの名無しさん2008/01/31(木) 01:03:46
自分で試せよ!このゆとり!
0906デフォルトの名無しさん2008/01/31(木) 08:25:47
どうしょうもない時以外はVBではなくCで作った方がいいですよ。

資料数と実装難易度の問題で。やっぱりメジャーな使い方が地雷を踏みにくくさせる
0907デフォルトの名無しさん2008/02/02(土) 14:20:25
VFWのビットマップをAVIにする機能をフィルタで作りたいのですが、うまく行きません。

ビットマップを挿入するタイミングは非同期でないといけないので、
今回の場合はPushSourceフィルタでは駄目でした。

Asyncfltを改造すれば、要求にこたえる機能が実装できそうだと思い見ています。
IAsyncReaderのRequestでIMediaSampleを渡すところまでたどり着ければ何とかなりそうなのですが、
取っ掛かりがつかめません。

どなたか作ったことがある、又は分かる方居ませんか?

下流フィルタとのつながりのやり取りのフローだけでも参考になるものがほしいです。

ちょっと、難易度の高い質問で申し訳ないですが、分かる方お願いします。
0908デフォルトの名無しさん2008/02/02(土) 15:18:47
まず↓を読むことが前提たい
ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/DirectX9_c/directx/htm/pullmodel.asp
0909デフォルトの名無しさん2008/02/02(土) 15:40:48
ありがとうございます。

教えていただいたURLはすでに読んでいました。
MSDNのそれらしきところを読んで回った末に、
>IAsyncReaderのRequestでIMediaSampleを渡すところ
というのが出てきたところです。

フィルタが出力ピンを用意して、それがIAsyncReaderをインターフェイスに持っているということですよね。

たとえばpushsourceでは
フィルタ>出力ピン の順に作って、

その出力ピンに下流ピンがGetMediaTypeを呼んで、良ければ繋がって、

FillBufferが呼ばれてIMediaSampleに内容を渡す

という流れですよね。これはグラフが動いている間は常に要求されているので渡す時間は実時間と違います。
パソコンが早ければ1秒で1分のビデオが作れます。そして、渡すべき物が無く、戻り値にS_OKを返さない場合、終了します。

今の段階ではFillBufferがRequestにとって代わるような感じを持っています。
渡すべき内容が無い場合、グラフに待ってもらいたいのです。

サンプルのAsyncfltはキューとかIOとかで割とシンプルじゃ無いので取っ掛かりがつかめません。
理解している人に噛んで砕いて教えていただけたら手っ取り早いなというのが実のところです。

任意のビットマップが用意できたら下流に流し、次のビットマップが無ければリクエストに対し無いと言って次回。
次のが用意できるまでは下流はリクエストをタイミングごとに出し続けて待機というイメージです。

そのようなシンプルなサンプルがほしいと思っています。

よろしくおねがいします。
0910デフォルトの名無しさん2008/02/02(土) 17:56:15
質問です。
DirectShowを使って、オーディオ入力デバイスに対してファイルストリームから入力を行う事は可能ですか?
やりたい事は、ファイルシステム上のwavファイル等をオーディオ入力にいれるというものです。
よろしくお願いします。
0911デフォルトの名無しさん2008/02/02(土) 18:56:02
ソースフィルタ作ればなんでもできるだろ
09129102008/02/02(土) 20:36:02
>>911
その場合特殊なドライバが必要だったりしませんか?
0913デフォルトの名無しさん2008/02/02(土) 20:57:21
CSourceでやってみれ。自分で好きなもの垂れ流し放題だぜ。
0914デフォルトの名無しさん2008/02/02(土) 22:14:08
908/909です。

pushsourceで出来ました。

CSourceStream をちゃんとしらべれば簡単な話でした。

掲示板で質問すれば手っ取り早い、と思うのは自分勝手でした。
すみません。

しかし、MSDNに限らず、こういうのの説明文はさらっとしすぎで初めての人には理解に時間がかかる。
もう少しデータのナガレをきちんと載せてほしいとこです。

あと、恩返しではないですが、
Delphiでやってるので、質問があればお答えします。
0915デフォルトの名無しさん2008/02/02(土) 22:33:53
>>913
レスありがとうございます。
ソースフィルタでストリームに処理を加えると、
自分以外のそのデバイスをlistenしてるアプリにも反映されるのでしょうか?
0916デフォルトの名無しさん2008/02/02(土) 23:37:39
お前DirectShowの機能勘違いしているぞ
0917デフォルトの名無しさん2008/02/03(日) 05:27:36
>>914
自分のやりたいことがPULLモデル/PUSHモデルどちらなのか
良くわかってなかったっつーことか。なんだかなー
0918デフォルトの名無しさん2008/02/03(日) 14:06:55
報告と謝罪と文句と募集と1レスで書かれるとなんだかわからん
0919デフォルトの名無しさん2008/02/04(月) 02:12:37
募集?
全レスのなかで私くらいしかしてないような…
ゴバクかいな
0920デフォルトの名無しさん2008/02/04(月) 17:16:44
>>914
Pull でも FillBuffer で待たせておけばOK.
0921デフォルトの名無しさん2008/02/05(火) 13:48:49
>>918
起承転結みたいだなw
0922デフォルトの名無しさん2008/02/11(月) 00:41:52
そろそろ新スレいっとくかい?
0923デフォルトの名無しさん2008/02/11(月) 01:01:57
1週間で1レスしか進んでないのに、まだまだ大丈夫だろ
0924デフォルトの名無しさん2008/02/11(月) 01:14:59
スレタイ変えるのもなんだけど
戦っちゃだめだよな
0925デフォルトの名無しさん2008/02/11(月) 01:58:21
戦わざるを得ないような××な仕様
0926デフォルトの名無しさん2008/02/11(月) 10:11:21
ロックするのが基本のダメ仕様。
0927デフォルトの名無しさん2008/02/11(月) 18:58:20
FillBuffer について質問。

CSourceStream はどのタイミングで FillBuffer を呼ぶの?
CSourceStream::DoBufferProcessingLoop の説明には
毎回ループを通じてアロケータから空のメディア サンプルを取得する。
とあるので、スレッドループから常に呼び出されていると理解したけど?
タイミングは随時?それとも下流フィルタから呼ばれてるの?


要は、渡すべきサンプルが FillBuffer 呼び出しに間に合わなかった場合の処置だけど、
戻り値に S_FALSE を渡すと終了してしまうよね。
IMediaSample を更新しないで単に S_OK を渡してやれば次回にスキップできる?
今やってるのではうまく行かないんだよね。
0928デフォルトの名無しさん2008/02/11(月) 19:47:04
ソースあるのになんでわからないの?
0929デフォルトの名無しさん2008/02/11(月) 20:34:38
わかってんなら教えろよ。
0930デフォルトの名無しさん2008/02/11(月) 20:58:04
ソース読めばいいじゃん
0931デフォルトの名無しさん2008/02/11(月) 21:43:21
どのソースのどこにどんな風に書いてあるんだ?

知ったかぶりすんな。

0932デフォルトの名無しさん2008/02/11(月) 22:11:37
DoBufferProcessingLoopのソースを読めっていう点では同意。
DirectShowの場合、説明だけに頼らずソースのある箇所は必ず読む方が良い。

>>927
サンプルを得られるまで返らない、とか?
昔作った時は、停止要求とかの処理で悩んだ挙句、
DoBufferProcessingLoop自体をオーバーライドしちゃった記憶が(汗
0933デフォルトの名無しさん2008/02/11(月) 22:16:49
>>931 なんでお前が偉そうなんだよw
0934デフォルトの名無しさん2008/02/11(月) 22:36:38
そーすっか
0935デフォルトの名無しさん2008/02/12(火) 02:15:50
DoBufferProcessingLoopは可能な限りすばやくループするから、
タイムスタンプに関係なくFillBufferを呼び続けるんだな。
渡すべきサンプルが無くてもお構いなしだ。

FillBufferがS_OKを返すとサンプルはDeliver(Sample: IMediaSample): HRESULT;から
Receive(Sample);に回される。ここでS_FALSEならおしまい。

ここらはMSDNから読めるだろ?

このReceiveの動作がDoBufferProcessingLoopが受け取る戻り値になるんだよ。
これはピンの状態なんかもかかわってくる。

問題は(Sample);の中身が無い状態で、とりあえず渡してどうなるかってこと
必要な動作のヒントがほしいなら、Receiveのとこはソースを見て自分で判断するしかない。

渡されたサンプルを無視するように何とかすればいいかもね
0936デフォルトの名無しさん2008/02/13(水) 18:39:20
DirectShow(Filter)がサポートしているファイルの拡張子を取得する方法ってある?
RenderFileで成功するか否か判断するしかない?
0937デフォルトの名無しさん2008/02/13(水) 22:13:41
>>936
拡張子ではわかりません。
0938デフォルトの名無しさん2008/02/13(水) 22:27:18
>>937
サポートしている拡張子は取得できない、ってことですか?
0939デフォルトの名無しさん2008/02/13(水) 22:43:02
拡張子が例えば ts や mpg や avi だったとして、
そこからはコンテナのフォーマットが推測できるだけであって、
中の映像や音声がどんなコーデックで圧縮されているかは全く不明。
0940デフォルトの名無しさん2008/02/13(水) 22:46:42
各フィルターがサポートしているメディアフォーマットならば取得可能かもしれません。
レンダラ、ライタまでたどり着けるかはシステムに拠りますね。
0941デフォルトの名無しさん2008/02/13(水) 23:16:38
>>937,939,940
ありがとうございます。

あるフォルダの中から、DirectShowで表示できるファイルだけを列挙したいのですが、
できればDirectShowにRenderさせる前に、DirectShowでサポートされているか拡張子で判断したいのです。
理由は判断ロジックのパフォーマンス確保のためです。
(この時、拡張子がrmなのに中身はwmvだった、という例外は除外してOKです。)

ファイル数が500個あった場合に、DirectShowにRenderさせてS_OKだったら、
これはサポートファイルであるという判断は時間がかかります。

もしくは、サクッとDirectShowサポートファイルか判断する手段はありますでしょうか?
0942デフォルトの名無しさん2008/02/13(水) 23:42:33
>>941
コンテナとコーデックの違いを理解しましょう
0943デフォルトの名無しさん2008/02/13(水) 23:46:01
>>941
そこにDivXの映像入りのAVIがあったとする。
しかし、そのコンピュータにはDivX(やXvidその他)がインストールされていなかったとする。
どうしよう。
0944デフォルトの名無しさん2008/02/14(木) 00:20:05
>>941
レジストリの HKEY_CLASSES_ROOT\Media Type と SDK のドキュメントの
「カスタム ファイル タイプの登録」を眺めるとひょっとしたら幸せに
なれるかも

# スプリッター/パーサーフィルタが対応してるファイルかどうかは判定できる
# ただし拡張子だけじゃなく、ファイル先頭のビットパターンまで見る必要が
# あるけど
0945デフォルトの名無しさん2008/02/14(木) 00:26:46
>>942
はい。

>>943
列挙されたファイルをDirectShowで使用する場合、Renderのタイミングでエラーになりますので、
そのタイミングで該当ファイルをリストから除外します。
ファイルの列挙のタイミングでは、精度よりもパフォーマンスを確保したいのです。

私の理解が不十分ですので、出直してきます。
ありがとうござしました。
0946デフォルトの名無しさん2008/02/14(木) 00:28:51
>>940,944
ヒントありがとうございます。
調べてみます。
0947デフォルトの名無しさん2008/02/14(木) 17:00:20
現在CTransformFilterから派生した変換フィルタを作っていますが、入力から出力へコピーするだけのフィルタを作ってみても、
ffdshowと比べて負荷が高いような気がします。
※色空間は暫定で、一番最初にCheck〜関数へ飛んでくる色空間にしてます。
自作フィルタをGRFで見てみると、AVIDecompressorが出力ピンに付くんですよね・・・そのせいでしょうか?
一応ffdshowのソースを見てみましたが、私には難解すぎました・・・orz
どなた様かご教授よろしくお願いいたします。。
0948デフォルトの名無しさん2008/02/14(木) 21:46:51
メディアサブタイプにPCMとWAVEが存在するのだが、これはどう違うの?
0949デフォルトの名無しさん2008/02/14(木) 22:14:09
気になって調べてみた。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/DirectX9_c/directx/htm/mediatypes.asp

MEDIASUBTYPE_WAVEで出力している自前のソースフィルタがあるけど普通に動いているな〜
どういうことだこれはwww
0950デフォルトの名無しさん2008/02/14(木) 23:05:06
MEDIASUBTYPE_WAVEは、過去の遺産ということなのか?
MEDIASUBTYPE_PCM = MEDIASUBTYPE_WAVE
と考えていいのか?(いやまずいだろうとは感じているのだが)
0951デフォルトの名無しさん2008/02/14(木) 23:10:44
WAVEはあくまでコンテナでしょ 中身がリニアPCMとは限らない。
0952デフォルトの名無しさん2008/02/14(木) 23:29:43
>>951
そしたら、サブタイプがWAVEだった場合、
中身のフォーマットはどのようにして取得するの?
0953デフォルトの名無しさん2008/02/16(土) 21:17:20
他スレッドからの誘導でここに来ました

質問です。
メモリ上のH.264とAACを含んだTSを再生したく、調べてみて、
ハードディスク等に保存されている動画を再生するには
IMediaControl->RenderFileを使用する事が分かったのですが、
自分でHeapAlloc等を使い、
メモリ上に展開した動画データを直接再生する方法が分かりません
何か方法はあるでしょうか?
宜しくお願いしますm(__)m
0954デフォルトの名無しさん2008/02/16(土) 21:18:57
上げます
0955デフォルトの名無しさん2008/02/16(土) 21:38:02
>>953
ソースフィルタ書け。
0956デフォルトの名無しさん2008/02/16(土) 21:51:41
当たり前だがパーサー、デコーダも必要になるぞ
0957デフォルトの名無しさん2008/02/16(土) 22:14:14
>>955
>>956

分かりました
それらのキーワードでぐぐってみます
レスありがとうございましたm(__)m
0958デフォルトの名無しさん2008/02/22(金) 14:38:56
DirectShowとDirectSoundを用いてmp3を再生するクラスを作成しようと思っています。
開発環境はWinXP + VS2005 です。
DirectShowでmp3のデコードを行ってメモリ上にrawデータを展開し、
そのデータをDirectSoundで再生させようと考えているのですが、
なかなか参考になりそうなwebページや書物が見つかりません。

そもそもこのことは可能でしょうか?
もし可能であれば簡単に展開の仕方を教示していただきたいです。
また参考になるHP等ございましたらご提示願います。
0959デフォルトの名無しさん2008/02/22(金) 15:52:58
>>958
DirectSoundでWAVEをストリーミングするサンプルを見つける
MP3をWAVEに変換するサンプルを見つける
それら2つのサンプルを組み合わせる
0960デフォルトの名無しさん2008/02/22(金) 22:00:35
>>958
yaneSDK3rd で DirectShow 使って  PCM に直す処理があったと思うので
気合でソース読め。
DirectSound 使わんで普通に再生フィルタにつなげばそれで良いと思うのだがな。
0961デフォルトの名無しさん2008/02/25(月) 23:55:58
GraphStudio
ttp://blog.monogram.sk/janos/tools/monogram-graphstudio/
オープンソース版GraphEditだそうだ。
0962デフォルトの名無しさん2008/02/28(木) 13:15:03
オープンソースなGraphEditならこっちも
ttp://www.codeproject.com/KB/audio-video/dsgraphedit.aspx
0963デフォルトの名無しさん2008/02/28(木) 20:37:55
なんか見た目がカッコいいなw
0964デフォルトの名無しさん2008/03/02(日) 16:58:32
再生速度をSetRateで変えたときに、動画が一瞬止まるのは何故でしょうか?
キーフレーム、バッファリングと関係があったりするのでしょうか。

また、再生レートを変更しても動画が一瞬止まらないようにするための解決法などありますか?
0965デフォルトの名無しさん2008/03/03(月) 03:02:10
SetRateで速度上げると音と動画が同期しませんが
どうすれば同期しますか?
0966デフォルトの名無しさん2008/03/04(火) 03:23:05
本家GraphEditっていまどこにあるの?
PSDK?
0967デフォルトの名無しさん2008/03/04(火) 17:36:08
Windows SDK
最新の6.1(Windows Server 2008/.NET Framework 3.5まで対応)にも収録されている。
0968ddd2008/03/06(木) 17:31:30
hhaahahhahaahahhahahahahah
0969デフォルトの名無しさん2008/03/06(木) 17:32:55
http://pc11.2ch.net/test/read.cgi/tech/1162913156/l50
http://pc11.2ch.net/test/read.cgi/tech/1162913156/l50
http://pc11.2ch.net/test/read.cgi/tech/1162913156/l50
http://pc11.2ch.net/test/read.cgi/tech/1162913156/l50
0970デフォルトの名無しさん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が帰ってくると
思ってたんですけど。・・・?
0971デフォルトの名無しさん2008/03/08(土) 09:19:06
ハードメーカー以外に居ない予感
0972デフォルトの名無しさん2008/03/08(土) 12:51:36
個々のフィルタの設定をIPersistStreamで保存したいのですが、うまく行きません。
IPersistStream::Save()は成功するのですが、IPersistStream::Load()はいつどのフィルタで呼んでも「初期化は既に完了している」とエラーが出てしまいます。
そもそも、設定の保存にIPersistStreamを使うので合っているのでしょうか?
0973デフォルトの名無しさん2008/03/08(土) 13:20:42
前スレ
http://mimizun.com/search/perl/dattohtml.pl?http://mimizun.com/log/2ch/tech/pc8.2ch.net/tech/dat/1026666092.dat
0974デフォルトの名無しさん2008/03/10(月) 12:26:29
IMediaSeeking::SetPositionsの説明に

AM_SEEKING_SeekToKeyFrame
最も近いキー フレームをシークする。これは高速だが、精度は落ちる。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/DirectX9_c/directx/htm/imediaseekingsetpositions.asp

という記載がありますが、AM_SEEKING_SeekToKeyFrameを加えても高速になりません。
これって体感できるほどの効果があるのでしょうか?
0975デフォルトの名無しさん2008/03/10(月) 22:09:40
圧縮形式とデコーダのでき次第じゃね?
0976デフォルトの名無しさん2008/03/11(火) 11:27:40
>>970
UVCのExtension関連の記憶は少しあやふやだけど、KSNODETYPE_DEV_SPECIFICで
良かった気がする。アクセス自体はその後Pinインタフェイスで行ったような。

ただ、UVC周辺は動作が怪しいんだよね…XPでの経験しかないんだけど、Extensionの
サンプルってそのままだと上手く動かなかった気がする。
あとXPだとUVCドライバの対応が中途半端なので、MSDNの説明通りにドライバが動かない
部分もあったり。Vistaだとそこらへん改善してるのかどうか少し気になる。
09779702008/03/11(火) 13:03:33
>>976
HINTありがとう。

Pinインタフェイスですか・・・。試してないので早速試してみます。
KSNODETYPE_DEV_SPECIFICのノードのPinですよね。

あと、VISTAでもやって見ますね。
09789702008/03/12(水) 19:58:39
>>976
VISTAでやったところ、get_NodeTypeはDEV_SPECIFICが返り、
やっぱり、CreateNodeInstanceは失敗したんですが、
IKsControlのKsPropertyでアクセスできました!やった。

ただ、XPは同様な方法ではダメでした。
(MSDNにもFilterではなくnodeからしか出来ないと書いてありますし・・)

で、Pinインタフェイスなのですが、IKsPinの事ですよね!?
インタフェイスは取得できたのですが、どう扱えばよいのか・・。

0979デフォルトの名無しさん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のキャプチャーを開始すると他のアプリのプレビュー映像は消えるので、
カメラに映像配信を停止するような?命令を出しているのかもしれません。
0980デフォルトの名無しさん2008/03/13(木) 17:38:50

どなたかアドバイスください。

IBasicAudio::put_Volume だとOSのWAVE音量が変わってしまうようです。

DirectSoundのSetVolumeのように、OSの設定には影響を与えない
アプリ内でのみ有効な音量の変更は出来ないでしょうか?
(設定できるのはOSの音量設定以下での相対値で構いません)

よろしくお願い致します。
09819802008/03/14(金) 10:26:08
レス付かないですね…

Winampとかでムービー再生するとアプリ内の音量調整はOSのボリューム
コントロールに影響しないので、何かしら方法はあると思うのですけど。
WinampがDirectShowを使ってるかは分らないですが…。

失礼いたしました。
0982デフォルトの名無しさん2008/03/14(金) 11:34:26
>>981
DirectShowでの実現方法は分かりませんが…

WinAPIならコレでできたような…
ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpmltimd/html/_win32_waveoutsetvolume.asp
09839802008/03/14(金) 12:52:40
>>982
レスどうもです

>waveOutSetVolume
このAPIでは、WAVEボリュームどころかOSのマスターボリュームまで
変わってしまいました。やりたいのはOSのボリューム設定を動かさずに
DirectShowの音声出力だけを制御する(下げる)ことなんです。
0984デフォルトの名無しさん2008/03/14(金) 13:14:05
詳しくないので違うかもしれないが、出力するサウンドデバイスに因ると思う
09859802008/03/14(金) 13:39:01
>>984
ヒントありがとうございます。手持ちのデバイスで試してみました。

OSデフォルト:WAVE変更無し
マザボのオンボードカード:WAVE変更あり
USB音源:WAVE変更無し

となりました。さらにモニカのGetDisplayNameに"DirectSound:"が含まれ
ない場合にWAVEボリューム変更ありという感じでした。

なら"DirectSound:"が含まれるデバイスを選択すれば大丈夫なのですが、
PCによってはこれだと音が出ない場合もあったりで、結構困りモノです。

なんとかユーザーに選択させる方向で考えたいと思います…。
0986デフォルトの名無しさん2008/03/14(金) 14:24:35
DirectShowの何かがDirectSoundバッファにストリーミングさせてるから
そのバッファの音量変えればいいようにも思えるんだが違うのかな?

もともとの音関係のライブラリはデバイスに激しく依存していて
WAVE系APIで複数音を鳴らせることはできないのも多かった。
で、DirectSoundによってアプリごとの設定ができるようになった。

Winampの場合は出力するときに使うDLLに依存してて、
そのDLLが音量を調節する機能を盛っていたはず。
だから、自力で実装するかDirectSound使うか。

列挙についてはWindowsのガイドライン通りにやっても
うまくいかないことは多いので下手に作りこむとはまると思う。

0987デフォルトの名無しさん2008/03/14(金) 15:39:26
音量変える変換フィルタをサクッと作って繋ぐってのはどうだろう?
フィルタはレジストリに登録しなくても使えるみたいだし。
09889802008/03/15(土) 10:41:01
>>986
>DirectShowの何かがDirectSoundバッファにストリーミングさせてるから
>そのバッファの音量変えればいいようにも思えるんだが違うのかな?
バッファがどこにあるのか(どう取得するのか)自分の知識範囲では
わかんないです。

>>987
その発想はありましたが、サクッと作れるなら苦労しないです^^;

画像だとサンプルグラバってのを参考にして出力画像を加工する
ってのはやったことあるんですが、音だとどこら辺参考にしたら
いいでしょうか?

デコード後の生データの流れにルーチンを割り込ませることが出来れば、
確かにボリューム調整は単なる乗算なので出来そうではありますが、
そこまでたどり着くので難儀してますね…。
0989デフォルトの名無しさん2008/03/15(土) 11:29:03
PCMデータの加工なんぞWAVEの基礎だ。
理解に5分もかからないけどな。
0990デフォルトの名無しさん2008/03/15(土) 11:34:50
今もあるかどうかわからんが、Inplace null フィルタサンプルにインタフェイス一個と
追加して掛け算するようにすれば簡単にできると思う。

コールバックを登録するインタフェイスを追加して、掛け算の代わりにコールバックを
呼ぶフィルタにすれば今後映像音声のいろんな加工やモニタリングに流用可能。
レス数が950を超えています。1000を超えると書き込みができなくなります。