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

DirectShowと戦うスレ Part 2

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/08(水) 00:25:56
前スレ
http://pc8.2ch.net/test/read.cgi/tech/1026666092/
0596デフォルトの名無しさん2007/07/07(土) 01:13:03
DirectShowで画像を回転させるフィルタでいいのない?
逆さ向けてビデオとってしまったんだorz
0597デフォルトの名無しさん2007/07/07(土) 04:03:29
>>596
ワロタ
てかその修正をフィルタに任せるなよw

動画編集ソフトで回転させるとか
動画を反転回転できるプレイヤー使うとかあるだろ
05985922007/07/07(土) 18:37:34
>>549>>595 ご返事ありがとうございます。

>>594
再生しているmovieは特別なコーデックを必要としないので、違う原因かと思います。

>>595
親をNULLで再生すると、再生時にメインWIndowが最小化してしまい、全画面モードが
通常画面に戻ってしまいます。(movieは左上で再生)

もうすこし詳しく症状を説明すると、まったく再生しないわけではなくて
成功・失敗をランダムで繰り返します。
成功すれば、メイン画面の前にVideoWindowが出て、普通に再生。
失敗すると、メイン画面の裏にVideoWindowがいるようで、音だけ再生。
このような感じになります。

色々とネット検索したところ、VideoWindowを再描画することで回避可能と見つけたのですが、
組んだところうまくいきません。(症状は同じ)

HWND hChild = GetWindow(m_hwnd,GW_CHILD);
InvalidateRect(hChild,NULL,true);

うーん・・・
0599デフォルトの名無しさん2007/07/07(土) 19:58:50
それは、親ウインドのバックグラウンド再描画で映像ウインドが消されてしまうからじゃないかな。
親ウインドのWM_ERASEBKGNDをDefaultWindowProcに渡さないようにして試してみな。

case WM_ERASEBKGND:
return 0;
でOK
0600デフォルトの名無しさん2007/07/08(日) 13:54:57
>>599ご返事ありがとうございます。

入れてみましたが、現状変わらずです。
元々WaitForCompletionで処理を止めている状態ならウィンドウメッセージが
ムービー再生中に取れることも無いので、SetNotifyWindowでイベント登録
に切り替えてみましたが、やはり同じ状態です。
WaitForCompletionで再生しても裏に回った状態になるので、
WM_ERASEBKGNDを無視しても、同じ症状になるのだと思います。
再生中に定期的にInvalidateRectをVideoWindowに送ってもみましたが、
やはり裏の時は裏で再生されます。

うーむ、もう少し調べてみます。
0601デフォルトの名無しさん2007/07/08(日) 14:11:52
親ウインドは何?
ダイアログ?それともダイアログに貼り付けたCStatic?
0602デフォルトの名無しさん2007/07/08(日) 15:00:15
>>601
以下のスタイルで画面切り替え時にSetWindowLongしたものです。

WS_POPUP | WS_SYSMENU | WS_VISIBLE | WS_BORDER
0603デフォルトの名無しさん2007/07/08(日) 19:36:06
WMPみたいな全画面をやりたいなら、普通にStayOnTopで画面いっぱいのサイズにするだけでおk。
0604デフォルトの名無しさん2007/07/08(日) 20:01:24
>>602ご返事ありがとうございます。

以下のような方法でVideoWindowにTOPMOSTを指定しましたが、
どちらも結果は変わらず、表に出たり裏に回ったりします。

1.
pVideoWindow->put_WindowStyleEx(WS_EX_TOPMOST);

2.
HWND hChild = GetWindow(m_hwnd,GW_CHILD);
::SetWindowPos(m_hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

うーん。
0605デフォルトの名無しさん2007/07/08(日) 20:24:33
ふとスレ見直したんだけど、ownerじゃなくてparentでないのか?
窓の設定が間違っている予感。
0606デフォルトの名無しさん2007/07/08(日) 20:35:11
もうDirectShow関係なくね?
0607デフォルトの名無しさん2007/07/08(日) 20:47:08
>>605ご返事ありがとうございます。

すいません、それは具体的にどのようにすればよいでしょうか?
0608デフォルトの名無しさん2007/07/08(日) 21:17:56
Owner指定なしで、最大化はできんの?
0609デフォルトの名無しさん2007/07/08(日) 21:57:40
>>608
Owner指定無しだと、元の全画面ウィンドウからVideoWindowに移る際に
全画面モードが解除されます。(Movieは左上で再生)
これは、put_FullScreenMode()を実行しでも同じような動作になります。

通常画面からput_FullScreenModeをつかえば全画面でムービー再生してくれるのですが、
全画面モードから使うと、逆に全画面が解除されるようです。
うーん。
06105992007/07/08(日) 22:11:45
ウインド関係がよくわからない。

ビデオウインドの親ウインドは何?
このウインドを仮にhParentとすると、
hParentウインドに親はいるのか?(or最初からWS_POPUP?)とか
hParentウインドのスタイルにWS_CLIPCHILDRENは設定されているのか?とか
hParentウインド自身は全画面サイズに引き伸ばされ、且つTopに表示されているの?とか
hParentウインドのWM_ERASEBKGNDをちゃんと無視しているの?とか
put_Ownerするタイミングとか

そういうことが知りたい。

06115922007/07/08(日) 22:36:34
>ビデオウインドの親ウインドは何?
CreateWindowしたWindowが親です。

>このウインドを仮にhParentとすると、
>hParentウインドに親はいるのか?(or最初からWS_POPUP?)とか
画面切り替え時にWS_POPUPとしています。

>hParentウインドのスタイルにWS_CLIPCHILDRENは設定されているのか?とか
指定していませんでしたが、元々メッセージ処理するつもりではなく、movie再生終了まで
処理停止するプログラムです。

pMediaEvent->WaitForCompletion(15000, &eventCode); // 15秒経過するかmovie再生が停止するまで待つ

また、入れてメッセージ処理をするようにしましたが改善されませんでした。

>hParentウインド自身は全画面サイズに引き伸ばされ、且つTopに表示されているの?とか
はい、全画面でTOPです。

>hParentウインドのWM_ERASEBKGNDをちゃんと無視しているの?とか
これも前に書きましたが入れても改善されませんでした。

>put_Ownerするタイミングとか
基本は>>592のソースですが、put_Visibleの直前まで、1行ずつ移動させても改善しませんでした。
また、その前にはVideoWindowの取得になるので移動できません。

こんな感じてす。何か判りますでしょうか。
06125992007/07/08(日) 23:12:43
この手の問題は大抵は、ビデオレンダラが描画したあとに親ウインドが背景をリフレッシュすることで発生する。
タイミングによってはリフレッシュが先に発生し、あとからビデオレンダラの再描画が行われ、表示される場合もある。
したがって親ウインドがある場合、親ウインドのWM_PAINTの描画処理をクリップして、且つERASEBKGNDをさせなければならない。
WS_CLIPCHILDRENやWM_ERASEBKGNDの処理を確実にしなければ効果がない。

ビデオレンダラの親ウインドにWS_CLIPCHILDRENをいれてみたらどうなる?

もしダメならほかの理由かもね。
06135922007/07/08(日) 23:36:52
>>612
>したがって親ウインドがある場合、親ウインドのWM_PAINTの描画処理をクリップして、且つERASEBKGNDをさせなければならない。
>WS_CLIPCHILDRENやWM_ERASEBKGNDの処理を確実にしなければ効果がない。
WM_PAINTのクリップ、WM_ERASEBKGNDをDefに流さない、WS_CLIPCHILDRENを入れる。
全てやってみたんですが、やはりダメでした。

>ビデオレンダラの親ウインドにWS_CLIPCHILDRENをいれてみたらどうなる?
上でも描きましたが、入れてみても症状は変わらずです。

そもそもWaitForCompletionで、再生終了まで待つ処理でも症状がでるんですよね。
で、再生終了をイベント取得に切り替えて、PAINT処理を切ったりしてもやはり同じくだめでした。

うーん、タイミング問題だとは自分も思うんですが・・・。
もう少し調べてみます。
06145922007/07/09(月) 12:22:04
皆さん色々と助言をありがとうございます。
すこし原因らしきものが見えましたのでご報告します。

メインWindowの描画にDirect3Dを使用しているんですが、

全画面モードで
メイン画面の描画を一切やらない → 100%ムービー再生に成功
一度だけDirect3Dでサーフェイスのクリア → 表と裏のランダム再生
一度だけDirect3Dでメイン画面を描画 → 表と裏のランダム再生

どうやらDirect3Dのフロントバッファが問題を起こすようです。
引き続き対策を調べて見ます。
06155922007/07/09(月) 14:40:31
結局、スマートな方法が見つからず、ムービー再生時には
IDIRECT3DDEVICE9のリセットをおこなってから再生するようにした所
うまくいくようになりました。
おさわがせいたしました。
貴重なご意見をいただき、ありがとうございました。
0616デフォルトの名無しさん2007/07/10(火) 00:26:34
なぜそんな重要なことを。。
0617デフォルトの名無しさん2007/07/10(火) 00:31:05
Direct3Dということはゲームのムービーでしょうか?
0618デフォルトの名無しさん2007/07/10(火) 10:40:38
聞いてどうすんの
0619デフォルトの名無しさん2007/07/10(火) 14:01:52
#include <qedit.h>
と
#include <d3d9.h>
を一緒にするとエラーが出るんです。

順番変えてもエラーでます

対応策ってありますか?
0620デフォルトの名無しさん2007/07/10(火) 14:16:28
環境とエラー内容は?
0621デフォルトの名無しさん2007/07/10(火) 14:28:13
環境は、
VC2003で
Microsoft DirectX 9.0 SDK Update (December 2004)
だと思います。

#include <d3d9.h>
#include <d3dx9.h>
#include <dshow.h>
#include <qedit.h>
と書くと
c:\DXSDK\Include\d3drmobj.h(46): warning C4005: 'WIN_TYPES' : マクロが再定義されました。
c:\DXSDK\Include\d3drmobj.h(274): error C2061: 構文エラー : 識別子 'LPDIRECT3D'
・・・
等が出ます。

#include <dshow.h>
#include <qedit.h>
#include <d3d9.h>
#include <d3dx9.h>
と書くと

c:\DXSDK\Include\d3dx9math.inl(1924): error C2039: 'm' : 'D3DXMATRIX' のメンバではありません。
c:\DXSDK\Include\d3dx9math.h(310) : 'D3DXMATRIX' の宣言を確認してください。
c:\DXSDK\Include\d3dx9math.inl(769): error C2065: 'm' : 定義されていない識別子です。
c:\DXSDK\Include\d3dx9math.inl(775): error C3861: 'm': 識別子は、引数依存の照合を使用しても見つかりません。
・・・

等が出ます。
0622デフォルトの名無しさん2007/07/10(火) 14:51:17
>>621
d3drm〜ってファイル名から明らかだが
qeditがDirectX7を使ってるからだろ?
一つのコンパイルパスにおいて複数のバージョンのDirectXは同居できない。

>>564-565 にズバリな事が書いているような気がするんだが、これは試したの?
0623デフォルトの名無しさん2007/07/10(火) 14:53:34
ああ、違うバージョンのDirectX自体が同居できない訳ではないな。
ちょっと訂正
06246192007/07/10(火) 14:56:28
>>565
で通りました。
ありがとうございます><
0625デフォルトの名無しさん2007/07/10(火) 15:08:21
現行スレを検索することくらい、答える側にやらせないで自分でやれよ…ったく
0626デフォルトの名無しさん2007/07/10(火) 16:02:52
うわ
0627デフォルトの名無しさん2007/07/10(火) 16:42:41
まいったねこりゃ
0628デフォルトの名無しさん2007/07/10(火) 22:27:39
まぁいいじゃん。過去ログにまさかズバリがあるとは思わないだろう。
ここ過疎気味だし。
0629デフォルトの名無しさん2007/07/11(水) 06:48:47
YUVの4:2:2→4:4:4補間するDShowフィルタってあるんでしょうか?
0630デフォルトの名無しさん2007/07/11(水) 07:02:28
ない
06316292007/07/11(水) 07:35:29
>>630
ありがとうございました!
0632デフォルトの名無しさん2007/07/11(水) 23:00:21
YUV422→444作れ。簡単だ。それが嫌なら500円くれたらやる。
0633デフォルトの名無しさん2007/07/12(木) 02:13:15
すいません、オーディオ、ビデオの2つの出力ピンのあるスプリッタを作成してるのですが、
2つの出力ピンともレンダラと繋いで、オーディオのみのファイルを再生すると、音声が流れません。
スプリッタのビデオ出力ピンを未接続にし、オーディオ出力ピンのみをレンダラと繋ぐと音声は再生されます。
ピンから出力データが無い場合に、そのピンを接続するのはいけないのでしょうか?
何とか、ビデオピンも繋いで、オーディオのみのファイルの再生をしたいのですが、
どうしたらよいでしょう?



0634デフォルトの名無しさん2007/07/13(金) 02:01:04
PlatformSDK WindowsServer2003 R2をインストールしました
ドキュメントにはサンプルのTextOutがさもあるように書いてあるんですが
どこにあるかわかりません。
どこにあります?

そのほかのサンプルもなんか無いんですが。。
0635デフォルトの名無しさん2007/07/13(金) 16:06:44
それは古いSDKをとってこないと無いはず(DXSDKまで遡らないと無いものもあり)。
0636デフォルトの名無しさん2007/07/14(土) 00:34:35
あ、そうなんだ。ありがとう。
ちょっくら探してきます。
0637デフォルトの名無しさん2007/07/15(日) 19:51:58
幼女と老婆を酷使する番組w
0638デフォルトの名無しさん2007/07/15(日) 19:52:58
↑
間違えた。無視して
0639デフォルトの名無しさん2007/07/15(日) 22:03:20
だが断る
0640デフォルトの名無しさん2007/07/17(火) 18:48:32
DirectShowはょぅじょとばばぁを酷使しますね。

フィルタをシェアウエアで出したいんだがいいとこある?
0641デフォルトの名無しさん2007/07/18(水) 00:19:37
どんなフィルタ?
0642デフォルトの名無しさん2007/07/18(水) 12:24:38
たとえば
>>401の拡張したやつ
顔を検出するやつ
動物体を検知するやつ
あとはサンプルグラバのこったやつ
0643デフォルトの名無しさん2007/07/18(水) 13:49:33
パターン認識のフィルタならどっかになかったっけ?フリーで。
0644デフォルトの名無しさん2007/07/18(水) 22:06:45
javaで顔認識で心霊写真チェッカーみたいなのがあったけどね。
0645デフォルトの名無しさん2007/07/18(水) 22:32:22
windows2000で最新のPlatformSDK入れたヤツ居る?
BaseClassesをnmakeしようとすると
makefile(53) : fatal error U1083: ターゲット マクロ '' が展開されません。
って出るんだけど・・・。
0646デフォルトの名無しさん2007/07/19(木) 13:38:03
複数のBMPから、AVIを作りたいなーと思って調べていたのですが、
DirectShowのフィルタを自作しなければできないのでしょうか??
0647デフォルトの名無しさん2007/07/19(木) 22:14:14
別にヘッダさえ付けてやればできる(俺はそうした)
使った方があとあとシステムにしやすいから作ったら??
0648デフォルトの名無しさん2007/07/19(木) 22:19:26
ちなみに自分ならBMPファイルを連続で読み出しメディアサンプルに乗せるだけのソースフィルタを作る。
2週間程度時間があればね〜☆

時間なければヘッダを直にバイナリにかく。
0649デフォルトの名無しさん2007/07/19(木) 22:49:12
今ビデオ見てて気づいたけどさ
ド、ド、ドリフの大爆笑〜♪  というところ
ダ、ダ、ダイレク、ダイレクトショウ〜♪  に聞こえるよな
0650デフォルトの名無しさん2007/07/19(木) 23:12:20
いや、それはない
0651デフォルトの名無しさん2007/07/20(金) 22:00:27
ありがとうございます!勉強してみます!
0652デフォルトの名無しさん2007/07/20(金) 22:24:49
がんがれ〜RIFFチャンクは先頭に付けてLISTチャンクはBMPの生画像の間に付けるんだぞ〜。
後動画によっては上下さかさまに気をつけて〜。(たぶん問題ないけど)
0653デフォルトの名無しさん2007/07/20(金) 22:33:19
>>649
クソワロタ.うん聞こえる。ダ、ダ、ダイレク、ダイレクショウ〜♪
0654デフォルトの名無しさん2007/07/22(日) 00:23:16
ないない
0655デフォルトの名無しさん2007/07/22(日) 02:58:50
すいません。質問です。
動画を一律30FPSにするDirectShowのフィルターってどう作ればいいですか?
方法が思い浮かばないので・・・ヒント教えてください
0656デフォルトの名無しさん2007/07/22(日) 09:48:17
タイムスタンプいじるとか
0657デフォルトの名無しさん2007/07/22(日) 19:41:18
作れたら私にも使わせてください
0658デフォルトの名無しさん2007/07/23(月) 00:55:08
質問です。
2つの映像入力を何らかの形で合成し
1つの出力として吐き出すフィルタを作成しています。

最終的に、出力ピンに繋がった入力ピンのReceive()に
合成結果であるIMediaSampleを渡せば良いというのはわかるのですが、
映像の同期がうまくとれません。
(同期というかそれぞれの入力から1フレームずつ取得して出力したい)

どのようにすればよいでしょうか?
0659デフォルトの名無しさん2007/07/23(月) 07:56:53
【派遣ネガティブ根性チェック】

3つ以上、チェックがつけばアナタの性格はひん曲がっており、
ネガティブ負け組派遣人生を歩んでいます。

□派遣先正社員の作った糞開発ツールはたとえ腐っててもマンセーして使う
□派遣先の人事権のある社員の意見はたとえ間違っていてもマンセーする
□仕様とは正社員から口伝されるものだ
□耳で聞いた仕様を正確に覚えていないのは自分の責任だ
□昼食は必ず派遣先の社員と行くべきだ
□自分の仕事で問題が発生しても解決するのは派遣の仕事ではない
□派遣先から「いつまでもここで仕事してくださいね(安い金でw)」と言われて嬉しい
□自社で仕事なんてできるわけがない
□派遣労働の問題点の話題が出ると感情剥き出しにして反論する
□派遣労働の問題を指摘する人は嫌いだ
□派遣先には仕事だけでなくプライベートについてもグイグイ引っ張って欲しい
□奢ってくれる派遣先正社員を尊敬する
□自分の月額金額を知らないのは当然だ、単金を聞いてはいけない
□派遣先正社員より自分の生涯収入が低いのは当然だ
□チビは派遣先にかわいがってもらいやすいから派遣には有利だ
0660デフォルトの名無しさん2007/07/23(月) 21:04:26
>>658 入力Aと入力B、両方受信を確認してから合成、出力すればいいだけの話じゃないの?
入力ソースがライブ(プッシュ)だったりする?
06616582007/07/24(火) 10:24:31
>>660
AddSourceFilterでハードディスク上のムービーファイルを扱う場合って
どっちになるんですかね?
プッシュモデルにするかプルモデルにするかは
やっぱりソースフィルタに依存します?
0662デフォルトの名無しさん2007/07/24(火) 21:32:14
>>661
ハードディスク上のムービーファイルなら通常プルモデル。
パーサー(スプリッタ)がデータを引っ張り出して後ろに流します。
んで入力2系統あるらしいけど、両方ともハードディスク上のムービーファイルなの?
ファイル形式はなんですかね?
0663デフォルトの名無しさん2007/07/25(水) 17:12:59

AMCap を参考にプログラムを作っています.

OleCreatePropertyFrame() でビデオキャプチャピンのダイアログを表示できますが,

ttp://pukapuka.sakura.ne.jp/cgi-bin/upload/puka/img-box/1185348928740.jpg

 上記の 「色空間/圧縮」,「出力サイズ」をダイアログからではなく,プログラム上から制御
したいのですが,どのようにすれば可能でしょうか?
 具体的には,これらの値の列挙,現在の値の取得・変更を行いたいと思っています.

 参考になるページ等もありましたら御教示下さい.
0664デフォルトの名無しさん2007/07/25(水) 17:21:17
キャプチャピンのIAMStreamConfig で設定する。
Connect する前にね。
06656632007/07/25(水) 21:56:05
>>664 有難う御座います.おかげさまで以下のようにして取得と変更が出来ました.

 CComPtr<IAMStreamConfig> pAMStreamConfig;
 hr = pCaptureGraphBuilder2->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
                              pVideoDeviceFilter, IID_IAMStreamConfig,
                              (void **)&pAMStreamConfig);
 if( SUCCEEDED(hr) )
 {
   AM_MEDIA_TYPE* pMediaType;
   pAMStreamConfig->GetFormat( &pMediaType ); // 現在の設定を取得

   pMediaType->subtype = MEDIASUBTYPE_YUY2;// YUY2 に変更

   VIDEOINFOHEADER* pVideoInfoHeader = (VIDEOINFOHEADER*)pMediaType->pbFormat;
   pVideoInfoHeader->bmiHeader.biWidth = 640; // 640 wide
   pVideoInfoHeader->bmiHeader.biHeight = 480; // 480 height に変更

   pAMStreamConfig->SetFormat( pMediaType );//設定を反映

   DeleteMediaType( pMediaType );
 }


 列挙も pAMStreamConfig->GetNumberOfCapabilities() と GetStreamCaps() で実現できそうです.
有難う御座いました.
06666582007/07/27(金) 15:52:03
>>662
>両方ともハードディスク上のムービーファイルなの?
>ファイル形式はなんですかね?

とりあえずは両方ともハードディスク上のもので
ファイル形式はAVIでやってます。
0667デフォルトの名無しさん2007/07/31(火) 15:19:35
枯れてる内容かもしれないんだけど・・・

ttp://wwwdoi.elec.nara-k.ac.jp/html/jisyu/dxm/ds/index.html
ここのlist702サンプルを実行して、mpgファイルなんかだと問題なく静止画取り込みができるんだけど、
とあるDivX6エンコードのaviファイルで実行すると、GetConnectedMediaType()で取ったAM_MEDIA_TYPEの
pbFormatがNULLになってしまい、ビデオ情報が取れないみたいなんですが一体どういう原因が考えられるんでしょうか。
ファイル自体はMediaPlayerで再生できています。
06686672007/07/31(火) 15:46:23
補足です。

DivXファイルだとISampleGrabberCBでのコールバックの指定も無視されてしまうようです。
キャプチャされないように何かロックされてる?
0669デフォルトの名無しさん2007/07/31(火) 17:13:25
まずフィルタグラフ全体がどうなっているか調べると良い。
あとpbFormat以外のメジャータイプとサブタイプを見たほうがいい。
もしかするとDivX6はパーサーとデコーダがセットで使用されていて、
パーサーとデコーダは互いを知っているのでpbFormatなんか使わないっていう実装かもしれん。
そこにサンプルグラバがパーサーとデコーダの間に挟まれば、ありうる。
06706672007/07/31(火) 17:32:37
>>669
ありがとうございます。
さらに調べてみたら、どうもDivXはRGB24への自動変換をサポートしていなかったり結構中途半端な模様。
で、レンダラまで自前実装してやるとキャプチャできる(SDK付属サンプルのWindowlessなら動く)ようなので、
そっちをベースにした実装にしたいと思います。
0671デフォルトの名無しさん2007/07/31(火) 20:55:11
フィルタの中でビットマップをリサイズするようにしたらすごく遅くなった
コマ落ちばっかりです
なんか早くする方法はありませんか?
0672デフォルトの名無しさん2007/07/31(火) 23:18:45
リサイズ処理を見直す
0673デフォルトの名無しさん2007/08/01(水) 22:13:09
どうやってリサイズしてるんだ?

普通にCで書いて間に合わないんなら、SIMD命令使え。
それでも間に合わないんならPCをパワーアップ。
0674デフォルトの名無しさん2007/08/01(水) 22:25:01
ロジックが悪い。
0675デフォルトの名無しさん2007/08/01(水) 22:40:55
すいません。質問です。
CTransformFilterの中で今の時間を取得することはできますでしょうか?
シークするとTransformに渡ってくるIMediaSampleのGetTimeやGetMediaTimeの時間が0に戻ってしまって、今の時間がわからなくなってしまいます・・・

それからCTransformFilterから動画の長さ(再生時間の合計)を知る方法ってありますか
0676デフォルトの名無しさん2007/08/02(木) 09:54:52
今の時間・・・?エスパーすると聞きたいことは「動画スタートしてからの時間」だとは思いますが、現在時刻の取得は下記のようにできます。
SYSTEMTIME st;
GetLocalTime( &st );
こんな感じ。

CTransformFilterから動画の長さをとることはできますが、フィルタ設計上
カメラもつなげる想定で作るべきっぽいから書いていいんだろうか
0677デフォルトの名無しさん2007/08/03(金) 01:26:18
動画スタートしてからの時間でした。すいません
教えてください〜
0678デフォルトの名無しさん2007/08/03(金) 03:13:20
動画であれば投げてきたフレーム枚数をカウントしてやって
それをfpsで割るのが「動画スタートからの時間」を得るのには最適だと
思うよ。変にタイマを使ったりすると動画のレートが変わった時点で
使えなくなっちゃうから。わからんならコードをどっかにうpするよ

んで動画の長さを得るのは、ソースフィルタから変換フィルタに渡してやるような
つくりにするのはどうでしょうか?
0679デフォルトの名無しさん2007/08/03(金) 19:35:31
DirectX SDKのドキュメント探したけど
"シーク可能ストリームでは、メディア タイムは常にストリームの開始タイムから相対的になる。"
とあるからGetMediaTimeはシークしても時間は0にならないみたい。
さっき試してみたけどそうなっていました。
0680デフォルトの名無しさん2007/08/04(土) 01:05:41
>>678-679
ありがとうございます
試してみます
0681デフォルトの名無しさん2007/08/06(月) 23:28:44
IAMCameraControl::GetRange()でCameraControl_Exposureの範囲を調べたのですが、
手持ちのWebカメラでは0〜100や0〜130といった値が返ってきました。
http://msdn2.microsoft.com/en-us/library/ms779747.aspx
によると、2^0 = 1sec〜2^130secといった、大きな値に相当してしまいますが、
単位はあてにできないのでしょうか?
せめて+1する毎にexposure timeが二倍になってほしいのですが、
何か方法があったら教えてほしいです。
0682デフォルトの名無しさん2007/08/07(火) 00:48:42
Webカメラに露光時間なんて設定可能なの?
露光時間って、写真の撮影で、弱い光でも感光版が感光できるようにシャッタースピードを遅くするとかのあれだよな?
0683デフォルトの名無しさん2007/08/07(火) 00:54:49
キャプチャをするのに

pCaptureGraphBuilder2->SetOutputFileName( &MEDIASUBTYPE_Avi , L"test.avi" , &pFileOut , &pSink );
pCaptureGraphBuilder2->RenderStream( &PIN_CATEGORY_CAPTURE , NULL , pDeviceFilter , NULL , pFileOut );

というようなグラフ構築を行ったのですが、何回かテストしてtest.aviを上書きするとき、
上書き前の容量より小さいと、ファイルのプロパティに表示される容量が上書き前のまま
になります。(上書き前より大きいと更新されます)
再生してみると、正しくキャプチャされているのですが、この容量表示の問題はどのように
すれば解消できるでしょうか?
(表示上だけでなく、実際に無駄な容量が付加されているのかも?)
0684デフォルトの名無しさん2007/08/07(火) 14:30:46
>>683
DeleteFile
06856832007/08/07(火) 21:00:18
>>684
上書きは基本的にしないようにするもの、ということですね。
ありがとうございました。
0686デフォルトの名無しさん2007/08/08(水) 05:39:26
領域確保しとくとキャプチャの時パフォーマンスが良くなる効能があると言っておこう。
削除の場合は実際にエントリが書き換えられるので、サイズを0にするのも有り。
RIFF解析して自前でサイズ調整するのも意外と簡単だよ。一番外側のチャンクだけ計算するだけで済むしな。
06876832007/08/09(木) 00:58:47
>>686
そういう方法もあるんですね。
ありがとうございます。
0688デフォルトの名無しさん2007/08/09(木) 07:52:41
3:2プルダウンを行うDirectShowフィルタってあるんでしょうか?
0689デフォルトの名無しさん2007/08/09(木) 21:37:52
サンプル元に作っちゃえば早くね?
0690デフォルトの名無しさん2007/08/09(木) 22:26:35
>>688
世界中のソフトハウス探せばどっかにあると思う。
06916882007/08/09(木) 23:30:48
なるほど。
簡単に手に入れられるなら作る必要もないと思ったのですが、作る価値はありそうですね。
やってみます。
ありがとうございました。
0692デフォルトの名無しさん2007/08/11(土) 10:56:07
Nullレンダラが作れなくて困っています。
GraphEditではあるのですが、アプリでインスタンスを作成できません。

CoCreateInstance( CLSID_NullRenderer , NULL , CLSCTX_INPROC_SERVER , IID_IBaseFilter , ( void** )&pNull );

このように書いたところ、ビルド時にCLSID_NullRendererが定義されていない、と言われます。
調べてみると、qedit.hにあるようなので、includeしたところ、今後はdxtrans.hがないと言われました。
でも、このヘッダファイルはPC内にはありませんでした。

どのようにすれば作成できるでしょうか?
0693デフォルトの名無しさん2007/08/11(土) 13:10:14
>>692
そのファイル名で検索すると幾つか情報が見つかるんだが・・・

俺のPCにはDirectX SDKの中に普通に入ってた。
つかDirectXSDKとPlatformSDKはいつのを使ってるかくらいは書いたほうがいいと思うぞ。
06946922007/08/11(土) 14:06:01
>>693
Windows SDKのバージョンは最新だと思います。
DirectX SDKはインストールしていませんでした。
最新版のJune 2007を入れたら、それに入っていました。
VC++でインクルードパスを指定したのですが、それでもコンパイルはエラーになります。
エラーの内容は、DirectX SDKのIncludeフォルダにあるd3drmobj.hというファイル内に
構文エラーがある、というものがたくさん。
あと、
To compile qedit.h you must install the DirectX 9 SDK, to obtain the dxtrans.h header.
というエラーメッセージも。
0695デフォルトの名無しさん2007/08/11(土) 14:31:58
FLVファイルのシークでIMediaSeeking::SetPositions()を使うとフリーズしてしまいます。

必ず発生するというわけではないのですが、高確率で発生します。
スプリッタにflvsplit.dllを使用した時のみこの現象がおきます。
WMPやMPCでは普通にシークできているので、コーディングの問題だと思うのですが...
思い当たる点として、WMPやMPCと違う部分はISampleGrabberを咬ませていることぐらいです。
(シーク時にSetBufferSamples(FALSE)を指定しても変化無しでした)

原因が分かる方はいませんでしょうか。
■ このスレッドは過去ログ倉庫に格納されています