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

DirectShowと戦うスレ Part 2

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/08(水) 00:25:56
前スレ
http://pc8.2ch.net/test/read.cgi/tech/1026666092/
07577512007/09/25(火) 00:07:16
>>754
うわー!気付きませんでした!w
ほんとうにありがとうございました!! 。゜(゜´∀`゜)゜。
0758デフォルトの名無しさん2007/09/25(火) 00:14:29
手打ちだYO!よく頑張りましたで賞くれYO! 
困ったらまたおいでお嬢さん
0759デフォルトの名無しさん2007/09/25(火) 02:34:15
とてとていつ転ぶか心配な歩き方をする>>751(幼女)と
有識者だけどおっちょこちょいの>>752(褒め言葉)で盛り上がるスレはここですか。
0760デフォルトの名無しさん2007/09/25(火) 07:12:46
はいはい
0761デフォルトの名無しさん2007/09/25(火) 10:24:35
direct showで二ヶ国語の音声ストリームを切り替えて再生するには
どのようにコーディングしたら良いでしょうか。
0762デフォルトの名無しさん2007/09/25(火) 20:04:08
かたっぽのボリューム0にしとけばいいんじゃねーの?
0763デフォルトの名無しさん2007/10/02(火) 15:58:31
Compact FrameworkからDirectShowを呼び出そうとしています。
QuartzTypeLib.dllに参照設定して
 RenderFile()→各種設定→Play()
とすると(初回だけ)再生出来るのですが、もう一度別のファイルを
RenderFile()したあと、IVideoWindowを再取得して
スタイルを設定しようとしたところで0x80004002が発生します。

MSDNによると再度RenderFile()するためにはフィルタを全削除しろと
あるのですが、QuartzにはEnumFilters()やRemoveFilter()がないので
やむなくいったんFilgraphManagerを解放→GC.collect()してから
RenderFile()しても、結局上記と同じ場所で例外が起きてしまいます。
アドバイスよろしくお願いします。
0764デフォルトの名無しさん2007/10/02(火) 20:53:59
>>763
中で使われているフィルタが怪しい
0765デフォルトの名無しさん2007/10/02(火) 20:55:26
>>761
自作の変換フィルタ間に入れてデータがLRとなっているのをLLかRRにすればいいんじゃないの?
0766デフォルトの名無しさん2007/10/02(火) 21:28:38
数秒のAVIを数十個連結して再生させたいのですが、
単純にどんどんファイルを読んで再生とかやると継ぎ目に真白なフレームがはさまったり汚くなってしまいます
音なしのAVIなのでそこまでシビアにつなげられなくてもいいのですが
映像として奇麗につなげるには
グラフ内でソースをどんどん切り替えていく、って形になるんでしょうか?
07677632007/10/02(火) 22:41:48
>>764
やはりそんなところですかね…。
ただ一応、開発ターゲットの端末に添付の再生アプリでは
ふつうに別のファイルを再生できるので、回避策はあるのかも知れません。

フィルタを削除するさいにやっておく後始末とかって
何かあるんでしょうか。
07687632007/10/03(水) 02:39:01
ちょっと待て…解決(?)したかも知れません。

試しに思い切ってQuartzTypeLib.dllを参照する方法を止め、
[ComImport, Guid(...), ...] interface IGraphBuilder ... { ... }
と手動で定義する方法(DirectShowNetで採用してるもの)にしたら
ちゃんと動くようになりました。

typelibでラップする方法の不具合かな? CE限定なのかは謎。
ちなみにその端末だとやっぱりIEnumFiltersは取得できても
Next()で未実装エラーが戻りました。とにかくCE要注意。
0769デフォルトの名無しさん2007/10/03(水) 17:59:04
>>766
再生リスト(.wpl)使えば順番に再生してくれる
0770デフォルトの名無しさん2007/10/03(水) 18:00:04
>>768
たまたまかもよ
デバッガで追うべし
0771デフォルトの名無しさん2007/10/03(水) 22:06:41
>>766
音なしのAVI程度なら avi 関連 API と DrawDibDraw で・・
07727682007/10/04(木) 05:29:28
>>770
や、これまで再現率100%だったのがこの改良で全く出なくなったので、
対処方法としてはこれで間違いなさそうです。

COM相互運用(マネージドとCOMのやり取り)はけっこう高度な
トピックらしいですね。するとCEは関係ないかも。

一度QuartzTypeLib.dll(tlbimpというツールに自動生成させる)を
解析したものと、DirectShowNet方式の手動定義を比較して、
ちゃんとした原因を突き止めてみたいです。
0773デフォルトの名無しさん2007/10/07(日) 18:30:13
DirectX初心者質問スレから誘導されてきました。

DirectShowで再生してる動画の上にテキストを置きたいんですけど(ニコニコ動画みたいな感じに)
普通に再生している動画をSetWindowPositionでウィンドウに表示させて、そのウィンドウの子ウィンドウとして
スタティックコントロールを動画の上に置こうとすると、動画の下に隠れてしまいます。
WS_EX_TOPMOSTを指定しても隠れてしまいました。

そこで、SetWindowPositionでウィンドウに動画を表示させるのをやめて
グラバフィルタでフレームを取得して、フレームを取得するごとに呼ばれる
コールバック関数内で取得したフレームをウィンドウに再描画するという形にしたところ
スタティックコントロールが上手く見えるようになりました。

しかし、今度は動画の再生が進むうちに動作が重くなってしまい、コマ飛びが起きるようになってしまいました。

コマ飛びが起きないような方法はないでしょうか。
0774デフォルトの名無しさん2007/10/07(日) 18:38:02
サンプルのVMRとかVMR9にある奴じゃダメなの?
07757732007/10/07(日) 19:08:58
>>774
ありがとうございます。
VMRについて少し調べてみたんですが、確かに動画とテキストを合成して
表示するような形にすれば出来そうです。

ただ、773に書いたような方法ではテキストは表示せずに動画を再生しているだけで
重くなってしまいます。

VMRを用いて、動画とテキストを合成して再生する方法だと、動画再生自体が重くなる
ようなことはなくなるでしょうか。
0776デフォルトの名無しさん2007/10/07(日) 20:46:42
サンプルを試せばいいと思うお
0777デフォルトの名無しさん2007/10/07(日) 22:05:35
適切に書けば重くならないし、阿呆なことをすれば>>773のような阿呆な動作になる。
自分の書いたプログラムが悪いのに、他に原因があるように思っている時点で、
どうやって処理させても結果は同じ。
0778デフォルトの名無しさん2007/10/09(火) 19:36:44
ttp://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/directshow.html#stillcap2_abst
をもとに、ISampleGrabberCBインタフェースの実装を試みているのですが、
『error C2512: 'CUnknown' : クラス、構造体、共用体に既定のコンストラクタがありません。』
『error C2614: 'mySampleGrabber' : イニシャライズ リスト内のクラス 'Cunknown' が基本クラスでもメンバでもありません。』

の2つのエラーが出てしまいます。ヘッダファイルやリンクの問題は解決したと思うんですけど
C++に慣れていないのでここからどう直せばいいかが分かりません。
以下、ソースです(行数の関係で詰めているので見にくいと思いますが…)

class CGrabCB: public CUnknown, public ISampleGrabberCB{
public:
DECLARE_IUNKNOWN;
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv) {
if( riid == IID_ISampleGrabberCB ){
return GetInterface((ISampleGrabberCB*)this, ppv);
}
return CUnknown::NonDelegatingQueryInterface(riid, ppv);
}
// ISampleGrabberCB のメソッド
STDMETHODIMP SampleCB(double SampleTime, IMediaSample *pSample){
return E_NOTIMPL;
}
STDMETHODIMP BufferCB(double SampleTime, BYTE *pBuffer, long BufferLen){
cerr << "Sample time: " << SampleTime << "\t";
cerr << "BufferLen: " << BufferLen;
cerr << endl;
SaveOneImage("C:\\tmp.yuv", pBuffer, BufferLen); // 後に定義する
return S_OK;
}
// コンストラクタ
CGrabCB( ) : CUnknown("SGCB", NULL){ }
};
0779デフォルトの名無しさん2007/10/09(火) 20:45:34
CUnknownコンストラクタのパラメータが実は3つってことはないよね?
07807782007/10/09(火) 21:49:39
すみません。strmbase.libを作ってリンクさせたらコンパイルは通ったんですけど
今度は部分DECLARE_IUNKNOWNマクロで実装されているAddRef()周りが原因で
プログラムを起動した瞬間強制終了してしまいます。

DECLARE_IUNKNOWN部分を自分で実装して、AddRef()のみ実装しないようにしたところ
一応動作はするようになりました。

AddRef()を実装するために、他に実装する何かがあるのでしょうか。
0781デフォルトの名無しさん2007/10/09(火) 23:38:58
以下のように AviMux → ファイルライタ を準備してファイルへのキャプチャを行っているのですが、

pCaptureGraphBuilder2->SetOutputFileName( &MEDIASUBTYPE_Avi , キャプチャファイルのパス , &pFileOut , &pSink );
pFileOut : AviMux( IBaseFilter型 )
pSink : ファイルライタのインターフェイス( IFileSinkFilter型 )

キャプチャ終了後、AviMuxのピンを切り離し、プレビュー用のグラフ再生を行うと、ファイルライタが
グラフ内に残っているため、それによって作成したファイルが使用中となって再生できません。
キャプチャが終了したファイルはすぐに再生して確認できるようにしたいのですが、
(現状はグラフ停止中かアプリを終了しないと再生できません)
どのようにすればよいでしょうか?

上記のような便利なユーティリティ関数を使わず、地道にファイルライタ( IBaseFilter型 )の
インスタンスを作成して、ファイル名の設定、フィルタグラフの構築、と進め、キャプチャ終了後、
ファイル名を変えるかファイルライタを削除するかなりをしないといけないでしょうか?
0782デフォルトの名無しさん2007/10/10(水) 03:18:00
CBaseVideoRendererを継承したレンダーを作成したいのですが、DoRenderSampleの実装の部分で詰まっています。

HRESULT CGrabRenderer::DoRenderSample(IMediaSample *pMediaSample) {
HRESULT hr=S_OK;
CAutoLock mylock(&m_CritSec);
LPBYTE pbSrc=NULL;
const long lActualSize=pMediaSample->GetActualDataLength();
pMediaSample->GetPointer(&pbSrc);
// 表示ウィンドウからデバイスコンテキストを取得して描画
if(IsWindow(m_hwnd)==TRUE) {
BITMAPINFO bi={m_Vih.bmiHeader};
const HDC hdc=GetDC(m_hwnd);
RECT rect;
GetClientRect(m_hwnd,&rect);

StretchDIBits(hdc,0,0,rect.right-rect.left,rect.bottom-rect.top
,0,0,m_Vih.bmiHeader.biWidth , m_Vih.bmiHeader.biHeight
,pbSrc,&bi,DIB_RGB_COLORS, SRCCOPY);
ReleaseDC(m_hwnd,hdc);
}
return hr;
}

この実装方法をインターネット上のソース等を参考に試したのですが、音声だけが再生され、画像が表示されません。
pMediaSample->GetPointer(&pbSrc);でpbSrcにビットマップを読み込んでいると思っていたのですが、MSDNを参照したところ
GetPointer()は引数のバッファへのポインタを返すだけなようです。そうすると、直前で宣言、しかもNULLを代入しているpbSrcへの
ポインタを取得したところでビットマップを読み込めていないのではないかと考えたのですが、IMediaSampleでの画像の読み込み方法が
分かりません。

長文ですみません。
DoRenderSampleはどのように実装したら良いのでしょうか。
0783デフォルトの名無しさん2007/10/10(水) 03:23:30
なんでエラー値をチェックしないの?
0784デフォルトの名無しさん2007/10/11(木) 18:55:44
http://www.geekpage.jp/programming/directshow/renderfile-url.php

を元に、DirectShowで擬似ストリーミングを行おうと思ったのですが
ネットワークからダウンロード中はプログラムが固まってしまい
ダウンロードが全て完了したら再生出来るような形になってしまいます。
単にファイル名をネットワーク上のファイルにするだけでは駄目ということでしょうか。

これだとローカルにファイルを落として、そのローカル内のファイルを
再生するのと変わらないので意味がないのですが、DirectShowで
ストリーミングを行う場合、自作のソースフィルターを作らないといけないのでしょうか。

出来れば完全なストリーミング、難しければ擬似ストリーミングを考えています。
07857812007/10/12(金) 21:50:32
自己解決しました。
pSink->SetFileNameで名前を変更すれば録画ファイルは解放されました。
0786デフォルトの名無しさん2007/10/17(水) 19:07:53
USBカメラからの画像をキャプチャして、jpg形式などで保存できるようなプログラム
を作成したいのですが、お勧めの書籍などありましたらご教授願えないでしょうか。
directxやdirectshowには触れたこともない初心者なのですが、これは無謀というも
のでしょうか?
0787デフォルトの名無しさん2007/10/17(水) 20:06:54
自分で作らなくても誰かが作ってることも多い。
ライブラリでも何でも探してみるとよろしいかと
0788デフォルトの名無しさん2007/10/17(水) 20:36:16
サンプルグラバで検索したらサンプルがたくさん出てくる
0789デフォルトの名無しさん2007/10/17(水) 20:50:46
OpenCVでもいけるんじゃない?
0790デフォルトの名無しさん2007/10/18(木) 04:16:21
たしかにOpenCVの方が向いてる気がする
0791デフォルトの名無しさん2007/10/18(木) 04:17:56
DirectShowなら
 ttp://www1.bbiq.jp/kougaku/link_videocap.html
が参考になると思う
0792デフォルトの名無しさん2007/10/18(木) 14:03:41
OpenCV使用の場合、OpenCVのカメラ種類サポート内ならとても楽に実現可能
サポート外なら
 DirectShowでカメラ画像取得→画像形式変換→OpenCVで処理
という手が使える・・・ちょっと面倒くさいが
0793デフォルトの名無しさん2007/10/25(木) 18:25:24
SetRateで速度変えたときに音程を維持するにはどうすればいいでしょうか?
0794デフォルトの名無しさん2007/10/25(木) 18:40:25
>>793
1.5倍速再生で声が甲高くならないように、とか?
オーディオレンダラの前にフィルタを追加して、
再生速度に応じてピッチを変更する。

ピッチ変更の処理の実装にはLGPL のライブラリなんかもあるね。
ttp://www.surina.net/soundtouch/

GPL が嫌なら自分で作っても1.5倍位までならそう聞き苦しくないものが
簡単にできる。
0795デフォルトの名無しさん2007/10/28(日) 03:51:40
> 786
もしかして他スレで動画をフーリエ変換したいと質問されていた方かな?
そうだったらこんなところに誘導するような羽目になってすいません。

単にWebカメラから動画をキャプチャしたいというならdirectshow付属のgrapheditを使ってしまうのが楽だと思いますよ
grapheditから、フィルタを呼び出して
カメラとFilewriterフィルタを繋いで上げましょう。間に動画圧縮のフィルタを入れてもよいです。
あとは、aviutil等のツールから連番のbmpで吐き出してしまえばよいと思います。
(他のツールもあるかも)

directshow自体は、それなりにプログラム経験と能力のある人でも使い方覚えるだけで一月くらいはかかるので
大学の学部クラスで大学からプログラム覚えたとかなら苦労は避けられないかと・・・。
0796デフォルトの名無しさん2007/11/01(木) 16:53:14
質問です。
DirectShowのデコーダフィルタ部で、オーディオのタグ情報(曲名など)は取得できないのでしょうか?

やりたい事は、MP3デコーダ(自作)でタグ情報を取得し、アプリに投げてやるという事です。
どうも上流のMPEG-1 Stream Splitterからは、タグのデータが流れてこない気がします。

例えば、先頭にタグの付いたMP3ファイルをDirectShowで再生すると、
デコーダにはタグ部のデータは渡されず、タグの後のフレームデータから渡されるようです。

入力ピンのWAVEFORMAT構造体の後ろにタグがあるかと考えましたが、そこにも無いようです。

どうかヒントをお願いします。

0797デフォルトの名無しさん2007/11/01(木) 20:04:02
普通に考えるとタグ情報なんてデコーダもレンダラも要らないから流さないんじゃないの?
もしスプリッタがタグ情報を流してくれるとするならば、ヘルプにどのように格納して渡すのか記しているはず。
一般的にはアプリケーションがそのMP3をパースしてタグ情報を引っ張り出して表示するんじゃないかな。
それともどっかに「タグ情報流すよ」みたいな記述があったの?
07987962007/11/02(金) 01:28:50
>それともどっかに「タグ情報流すよ」みたいな記述があったの?

いや無いですが、そういう要望があったので、可能なのかと思って質問しました。
何かのビデオで入力ピンのAM_MEDIA_TYPEのVIDEOINFOHEADERの後ろに
ヘッダが格納されていることがあったので、同じようにどこかにあるかと思っていました。
となるとデコーダからタグ情報を得るのは難しそうですね…
07997962007/11/05(月) 19:06:27
上記についてですが、調べたところ、IAMMediaContentというインターフェイスを使えば良さそうです。
スプリッタがこのインターフェイスを実装していました。
ということで解決しました。ありがとうございました。
0800デフォルトの名無しさん2007/11/05(月) 19:44:07
なるほど。
0801デフォルトの名無しさん2007/11/14(水) 19:09:38
DirectShowを始めて間もない初心者です。
DVキャプチャしつつ同時に
プロキシファイルを作成しようと考えているのですが、
どんな方法が考えられるでしょうか。
MSDVからの出力をInfTeeでふたつに分けて
片方はDVAVIに落とし
もう片方はエンコード処理をしてプロキシファイルに落とす、というのは素人の考えでしょうか。
出来ればプロキシの方は5分単位で分割して複数ファイル作りたいです。
DirectX,Window SDKs共に最新のものをインストールしてあります。
ご教授宜しくお願いします。


0802デフォルトの名無しさん2007/11/14(水) 20:03:22
>>801
それでもいいですけど、Inplace フィルタを作って、そ奴が間に入って素通ししつつ
プロキシファイルも作るって方が簡単だと思いますよ。

性能面で余裕があるなら、標準入力から DV ストリームを受け取って
プロキシファイルを作るexeを CreateProcess してパイプで流すとか
そんな構造にするとデバグも楽です。
0803デフォルトの名無しさん2007/11/14(水) 20:56:58
>>802
ありがとうございます。
Inplaceフィルタと聞いてパッと浮かんでこないですが
イメージ的にFileWriterフィルタの機能を持たせつつOutPutで
入力されたストリームを流すということでしょうか

フィルタを作るというのが想像できなくて
素人が1から作れるものでしょうか。
作る上で802さんが参考になられたサイトとかありますでしょうか。
0804デフォルトの名無しさん2007/11/15(木) 15:18:17
>>803
そんな感じです。
NullNull フィルタサンプルを改造してゆくのが一番簡単・・・
と思ったんですが、現行の SDK には含まれていないのかな。

だとすると tee で分けて Dump フィルタの改造版で書いてゆくのが
いいかも知れませんね。

マルチスレッドのプログラミングに慣れていれば(あるいは慣れる気があるなら)、
普通のフィルタを素人が1から作るのはそう難しくはありません。
(ソースフィルタやスプリッタ、パーサは別。これらは結構難しい)

参考になるサイトはありません。
0805デフォルトの名無しさん2007/11/15(木) 20:49:37
>>804
ありがとうございます。
NullNullフィルタサンプルは見つかりませんでしたが
Dumpフィルタを改造してみます。

もうひとつ問題にあたってしまって
エンコードするほうの処理ですが
Splitter→(V)DVDecoder→ASFWriter(V)
     →(A)→→→→→→ASFWritter(A)
とGraphEdit上で接続、ビデオのほうは繋がりましたが
オーディオの方が「中間に必要な…」というメッセージが出てしまい
繋ぐことが出来ません。
実はDVキャプチャといいましても
HD(TV局などで使う機器、出力解像度は1920*1080)で
音声の周波数が48kHzのようです。
一般的なDVのほうは上記のフィルタ構成で接続確認は出来ました。
こちらは32kHzらしくてAsfWriterが32kHz以上対応していないんじゃないかと思い
調査していましたが情報は手に入らず・・・。
何か知っていればご教授下さい。
0806デフォルトの名無しさん2007/11/16(金) 12:51:26
SDKのサンプルとネット上の情報を頼りにフィルターを作っています。
ちょっとわからない事がありましたのでどなたか教えていただけないでしょうか。
プロパティページの OnReceiveMessage で、マウス関係のメッセージを拾ってくれません。

INT_PTR CHogeProperties::OnReceiveMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  switch (uMsg)
  {
  case WM_MOUSEMOVE:
        Point_x = LOWORD(lParam);
        Point_y = HIWORD(lParam);
        //ここにフィルターへマウス座標を通知するコードを書く
        return (LRESULT) 1;
    }

  return CBasePropertyPage::OnReceiveMessage(hwnd,uMsg,wParam,lParam);

}

これじゃダメなんでしょうか。
WM_LBUTTONDOWN とか WM_LBUTTONUP なんかも拾ってくれないのですが・・。
こちらが提供すべき情報で、これ以外に何か必要なものがありましたら指摘していただけませんか。
0807デフォルトの名無しさん2007/11/19(月) 21:07:55
pMediaSeek->SetPositions と pSampleGrabber->GetCurrentBuffer を使い
差分タイムを指定して、mpeg2動画のスクリーンショットを取得しようとしています。
�@指定:100 100秒ごとに画像取得
�A指定:1 1秒ごとに画像取得
しかし、プログラム動作がうまくいったと思っても、上記のような指定をした際に
�@での100秒時の画像と �Aでの100秒時の画像 が食い違う現象がおきてしまいます。
(違うといっても誤差1秒程度のもののようですが・・)

上記の関数を使って mpeg2から確実に指定位置の画像を取得する方法を知りたいのですが・・。
0808デフォルトの名無しさん2007/11/19(月) 23:24:30
>>807
よく状況がわかんないけど�Aが間に合ってないの?
0809デフォルトの名無しさん2007/11/20(火) 03:00:49
>>806ですがコントロールをサブクラス化したら上手くいきました
0810デフォルトの名無しさん2007/11/20(火) 06:38:41
レスありがとうございます。
少々長くなりますが、詳細を書いてみます。
今現在は、このような形になっています。

n100TimePos //nsec時間

pSampleGrabber->SetOneShot(true); //サンプルが届く度にグラフを停止
pMediaSeek->SetPositions(&n100TimePos, AM_SEEKING_AbsolutePositioning, NULL, AM_SEEKING_NoPositioning); //指定位置へのシーク
pMediaControl->Run();
Sleep(3000); //必要はないです SetOneShot の動作確認のために入れたものです。
long param1, param2; loop = true;
while( loop ){
hr = pMediaEvent->GetEvent(&evCode, ¶m1, ¶m2, 100);
if( hr==S_OK ){
switch( evCode ){
case EC_COMPLETE : //イベント確認
printf("EC_COMPLETE\n");
pMediaControl->Stop();
loop = false;
break;
default:
printf("------\n");
break;
}
}
else{
printf("loop\n");
}
}
pSampleGrabber->GetCurrentBuffer(&nBufferSize, (long *)(rgbImg)); //イメージ取得

0811デフォルトの名無しさん2007/11/20(火) 06:47:49
少し文字化けしてしまいました・・。
hr = pMediaEvent->GetEvent(&evCode, param1, param2, 100);

理解の仕方が間違えているとまずいので質問します。
上記のようにsleepを挟むと 指定時間からかなりずれた画像が取得されます。
SetOneShot(true);によって グラフの動作は停止するはずなので Sleepを入れても問題ないと思ったのですが
実際には サンプルが届いても停止していないのでしょうか?

また、下記でGetEventによりイベント取得をしていますが、
GetState関数で Running や Stopped を参照していた際は いつまでたってもRunningが来続けていました。
SetOneShot(true); はサンプルを行った際にグラフを停止するとの事だったので、Stop に切り替わるものと
考えていたのですが、考え方が違うのでしょうか・・。

多分、この辺りの理解が間違っているから、今のような状況に陥っているような気がするのですが・・。
他にも、StopWhenReady や WaitForCompletion など色々組み合わせてもうまくいかないので
ご教授願えるとありがたいです。
やりたい事は、最初に書いたとおり
pMediaSeek->SetPositions と pSampleGrabber->GetCurrentBuffer を使い
差分タイムを指定して、mpeg2動画のスクリーンショットを取得しようとしています。
です。
0812デフォルトの名無しさん2007/11/20(火) 06:52:01
ちなみに、スリープを入れた場合、そのsleepで指定した時間分後ろにずれた感じになります。
こちらとしては、どんなに処理が重いときでも、
処理が間に合ったから取れたとかでなく、同じタイム指定を行ったときは同じ画像が得られることを期待したいのです。

0813810〜8122007/11/20(火) 12:04:08
コールバックを使ったやり方で こちらの思惑通りの動作が出来たような気がします

これからテストを重ねて検証してきます


お騒がせしました
0814デフォルトの名無しさん2007/11/20(火) 12:33:21
805です。
とりあえず回避策として一度DVEncoderを使ってDVMuxで
映像と音声と同期させた後、もう一度DVSplitterで映像と音声を分けて
AsfWriterに繋ぐことができました。

またまた質問になってしまいますが
テープが録画可能状態かというの情報はどうしたら取得できるでしょうか。
GraphEdit上でMSDVのプロパティページを開くと
テープのつめの状態で書込み可能か書込み出来ないか出来ています。
IAMExtDeviceかIAMExtTransportが怪しいのですが
それらしいメソッドが見つかりませんでした。
IAMExtDeviceのED_DEVCAP_CAN_RECORDと思ったのですが
テープのつめを変えてもステータスの戻り値に変化ありませんでした。
DirectShowサンプルのDVCapにもそれらしい記述は見当たりません。

どうかもう一度ご教授下さい。宜しくお願いします。
0815デフォルトの名無しさん2007/11/26(月) 22:00:16
Windows Media Format SDKの質問なんですが、専用スレがなかったためここで質問させてください。

現在ストリーミングサーバとしてWindos Media サービスを使い
Windows Media Format 11 SDKで作った動画プレイヤーで
MMSプロトコルのストリーミング再生を行っています。

但し、MMSプロトコルですとシークの度にバッファリングが起きてしまい
再生速度を変えるためにIWMReader::Start()を呼び出すと、その度に
バッファリングが起きてしまいます。

MMSプロトコル、Windows Media Format 11 SDKで、バッファリングを起こさずに
スムーズな再生速度変更を行う方法はないでしょうか。
0816デフォルトの名無しさん2007/11/26(月) 23:08:19
ぜんぜん詳しくないんだけど、ヘルプ読む限りではは、Startメソッドだと必ずバッファリングがおきる、
バッファリングを起こさないためにはResumeメソッドを呼べ、って書いてるけど、これじゃだめなのかな?
(再生速度は変更できない、とか?)

Any call to Start while paused is treated as a seek through the file, and incurs a buffering penalty from
network files. This is true even for calls to Start with the WM_START_CURRENTPOSITION value.
To continue playing from the current paused position with no buffering penalty, call Resume.
08178152007/11/26(月) 23:17:56
>>816
ありがとうございます。

一旦Pauseして、Resumeすれば再生速度も1倍になるかもしれないと思ってやってみましたが、無理でした。
PauseしないでResumeすると、やはり何も起こりません。

再生速度のみ変更するような関数があればよかったのですが・・・。
0818デフォルトの名無しさん2007/11/26(月) 23:29:14
何の経験も無い俺はぐぐって出てきたヘルプをコピペするしかできんかったごめん
0819デフォルトの名無しさん2007/11/27(火) 17:15:28
DvAviファイルからAsfファイルに落とす構成を
GraphEditを使いながらいじってのですが
なぜか一度Video,Soundレンダラを通して
グラフを再生させないとAsfWriterのAuidoが繋がりません。

一度レンダラを使ってグラフを再生させると何が変わるのでしょうか。
0820デフォルトの名無しさん2007/11/28(水) 03:17:10
Builderが賢くなったかTransform Filterの状態が変わったのかかどっちかかねえ
0821デフォルトの名無しさん2007/11/28(水) 17:03:37
>>820
ありがとうございます。

原因を調べてみる必要がありますが、
とりあえず動いたみたいなのでこれで良しとします。
0822デフォルトの名無しさん2007/11/29(木) 20:56:27
とりあえず動いてるから良し、ですか。
個人趣味ならいいけど仕事だと気持ち悪いよねぇ…
0823デフォルトの名無しさん2007/11/29(木) 22:13:14
DirectShowを使うような、他社製の挙動の怪しいコンポーネントが
連動して動くアプリの場合はある程度しようがないよ。
0824デフォルトの名無しさん2007/11/30(金) 00:06:41
Microsoftは遅かれ早かれDirectShowを見捨てそう
0825デフォルトの名無しさん2007/12/02(日) 23:34:36
hResult = CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (LPVOID *)&g_pGrph );

WCHAR wszFileName[260];
MultiByteToWideChar( CP_ACP, 0, name, -1, wszFileName, 260 );
hResult = g_pGrph->RenderFile( wszFileName, NULL );
if( FAILED(hResult) )MessageBoxA(hWindow,"PlayShow()内 その名前のムービーはないです","PlayShow No2",MB_OK);

// フィルタ グラフの構築
hResult = g_pGrph->QueryInterface( IID_IMediaControl, (LPVOID *)&g_pMdaCtrl );
hResult = g_pGrph->QueryInterface( IID_IVideoWindow, (LPVOID *)&g_pVdoWin );
hResult = g_pGrph->QueryInterface( IID_IMediaEvent, (VOID **)&g_Event2 );

// ウィンドウ内で出力
RECT grc;
g_pVdoWin->put_Owner( (OAHWND)hWindow );
g_pVdoWin->put_WindowStyle( WS_CHILD | WS_CLIPSIBLINGS );
GetClientRect( hWindow,&grc );
g_pVdoWin->SetWindowPosition( 0,0,grc.right,grc.bottom );

// フィルタ グラフの開始
g_pMdaCtrl->Run();

// ムービーが終わるまでここから先へは進ませない
g_Event2->WaitForCompletion(INFINITE,&g);
if ( g == EC_COMPLETE ){
no.movie_end = 1;
UninitShow();
}
音だけしか出ません;;
なにかご指摘があるのならお願いします
0826デフォルトの名無しさん2007/12/02(日) 23:50:30
// ウィンドウ内で出力
から
// フィルタ グラフの開始

までをいじくるとなんとかなりそう
0827デフォルトの名無しさん2007/12/03(月) 14:13:43
デフォルトでvisibleだったような気がするものの、put_Visibleも付けたいような・・・
あとウィンドウ操作しといメッセージポンプ止めるなんて、Windows を舐めてるよ。
0828デフォルトの名無しさん2007/12/03(月) 17:01:26
>>824
既にVistaでは、新しくMedia Foundationが出ていて、
これがDirectShow後継になっている。
0829デフォルトの名無しさん2007/12/04(火) 00:54:25
>>827
役立たずは黙ってろよカス
0830デフォルトの名無しさん2007/12/04(火) 08:58:16
>>829
827 のは
> // ムービーが終わるまでここから先へは進ませない
> g_Event2->WaitForCompletion(INFINITE,&g);
のせいでメインのメッセージループ止まってて描画命令飛んでないんじゃないのという
非常に的を射たエスパー回答だと思うぞ。
0831デフォルトの名無しさん2007/12/14(金) 12:54:00
すみません、Directshowで、パソコンと
USBで接続されたビデオキャプチャ IO-DATAのGV-MVP/RZ3の
アナログビデオ入力(RGB)にカメラをつないで、
まずは、画像をプレビューしようかと考えています。
参考にしようと思ったプログラム、

http://www.geekpage.jp/programming/directshow/list-capture-device-3.php

を、コンパイルすることはできたのですが、うまく動きませんでした。
(ライブラリのリンクはできました。)
デバイス選択のところで、製品名のRZ3は認識しているようなのですが、
HRESULTをチェックしていくと、

// Graphを生成する
pCaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_PREVIEW,
NULL, pDeviceFilter, NULL, NULL);

のところだけ、S_OKでなく、VFW_E_CANNOT_CONNECTが返ってきました。
&PIN_CATEGORY_PREVIEWのところを、
&PIN_CATEGORY_CAPTURE や &PIN_CATEGORY_VIDEOPORT
に変えてもエラーをはいてしまいます。
周りに相談できる方が折らず、困っています。
どなたか、ご助言いただけませんでしょうか?

OSはXP home SP2に
Windows Server 2003 SP1 SDK
DirectX SDK 2007
Microsoft Visual C++ 2005で開発しています。
お手数かけますが、どうかよろしくお願いいたします。
0832デフォルトの名無しさん2007/12/15(土) 01:53:41
・そこのサンプルページのもうちょい前のサンプルの動作結果
・GraphEditでの動作結果
・デバイスの情報
 (デバイスマネージャの出力とか同じとこのサンプルプログラムとかインターフェース問い合わせるとか)

とかがあると答えやすいかも
08338312007/12/17(月) 15:38:32
>>832
お手数かけまして申し訳ありません。ありがとうございます。
いくつかご指摘の点を実行してみましたので、
下記の通り、どうかよろしくお願いいたします。

少し前のサンプル結果としてmpgファイルの再生。
http://www.geekpage.jp/programming/directshow/renderfile.php
は成功しました。

デバイス情報を表示するサンプルからは、
FriendlyName : Python2 USB WDM Encoder RZ3
Description : Python2 USB WDM Encoder RZ3
DevicePath : \\?\usb#vid_04bb&pid_0519#6&25ee13b8&0&2#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global
となりました。

graphedit使ってみたところ、
フィルターから

Python2 USB WDM Endoderが見つかりました。
入力は、RGB入力と(おそらくです。文字化けしていました)
Audio inが見つかっています。
出力は、Mpeg out,Audio Preview,Index,VBI,Video Previewが見つかりました。
このまま、video renderの入力にVideo Previewをつなげようとしたところ、
「接続に必要な中間フィルタの組み合わせが見つかりませんでした。
 エラーコード、0x80040217」
が出力されました。Mpeg Outのほうを、直接つないだり、mpeg decoderなどにつないでも
同様に中間フィルタの組み合わせが見つかりませんでした。
との結果を得ました。
ここで、詰まってしまいました。
不勉強のために不十分かとは思いますが、どうかご教授いただければ幸いです。
0834デフォルトの名無しさん2007/12/17(月) 21:18:27
>833
とりあえず、GraphEditでVideo Preview Pinのプロパティを見て、MEDIASUBTYPEと出力サイズを調べる。
そこが変じゃないのなら、Video RenderとしてVMR9やOverlayなども試してみる。
0835デフォルトの名無しさん2007/12/25(火) 12:11:57
AviファイルからDirectShowのAsfWriter使ってエンコードしてるんですが
音量の変更の仕方をどなたか知ってる方いらっしゃいませんか?
プロファイルを指定して解像度なりビットレートは変えられています。
PCの音量を最大にしても人が喋ってる声とかがあまり聞こえないんです。
ちなみにAviの方ははっきり聞こえています。
0836デフォルトの名無しさん2007/12/31(月) 23:33:07
現在、DirectShowを用いてウェブカメラの動画ストリームを
「半透明で」「最上面」に映し出すためのプログラムを書こうと思っています。

http://codezine.jp/a/article/aid/322.aspx

のプログラムを下記の環境でデバッグしたのですが、

VS2005 Pro SP1
MS Platform SDK for Server 2003 SP1
MS Direct X SDK Nov 2007

下記のようなエラーがでてきてしまいます。

エラー 2 error C2504: 'IDXEffect' : 定義されていない基本クラスが宣言されています。 c:\program files\microsoft platform sdk\include\qedit.h 980

自分の経験・勉強不足は十分承知しております。
解決方法をご教授していただければ幸いです。
0837デフォルトの名無しさん2008/01/01(火) 23:49:53
あげて行きます。

ニコニコ動画のXMLファイルを読み込んで
入力動画に表示するフィルタは需要ありますか?
エンコード一発で字幕付き動画作れるようになる
0838デフォルトの名無しさん2008/01/02(水) 21:15:36
>837

てらほしいっす!
0839デフォルトの名無しさん2008/01/03(木) 03:56:17
需要は1人か・・・。
てら微妙。

DirectShowフィルタ作ってももはやだめなのかな。
0840デフォルトの名無しさん2008/01/04(金) 00:50:16
>>836
とりあえず「半透明で」はなく「最上面」とは限らないプログラムの動作状況がわからないと
なんともしようがない
0841デフォルトの名無しさん2008/01/04(金) 04:53:48
>>837
ノシ

そんなの作ろうとしてDirectShow勉強しはじめた人間です
0842デフォルトの名無しさん2008/01/04(金) 05:57:17
DirectShow 複雑怪奇な構造してるよな
魑魅魍魎な設計ここに極まれり
0843デフォルトの名無しさん2008/01/04(金) 06:43:25
>>841
マジで?
DirectShow部分は簡単だから一緒に作ろうか?
メールのやり取りでもしながらさ。

とりあえず、文字を右から左に送るフィルタでも作ってプロジェクト一式渡そうか?
XMLのタグをどう扱うかで勉強しようかと思っていたが需要ないから諦めかけてた
0844デフォルトの名無しさん2008/01/04(金) 15:09:32
>>836
エラーメッセージを見る限り、
デバッグ以前の問題でコンパイルが通ってない、
と思われるがその認識でよい?

手元の環境では IDXEffect は以下のファイルで宣言されている。
C:\Program Files\Microsoft DirectX SDK (August 2007)\Include\dxtrans.h

DirectX SDK Nov 2007 でも同様の場所にあると思われるので、
そこにインクルードパスが通っているかどうかを確認してみるべし。
08458412008/01/04(金) 18:00:44
>>843
Windowsプログラミングの経験が浅いので役に立つかは自信ないですが、、
とりあえずメアドさらしておきます
0846デフォルトの名無しさん2008/01/04(金) 19:39:53
>>845
ほい。了解。
なら一日くらいかけて作るよ(とはいってもやる気出すのに半日使うだけだけど・・・)
ところでDirectShowのフィルタをビルドできる環境はあるかい?
08478412008/01/04(金) 21:05:16
環境はこんな感じ。
* Windows 2000 SP4
* VC++ 2005 Express Edition
* Microsoft Platform SDK for Windows Server 2003 SP1
* DirectX 9.0b SDK

ttp://www.geekpage.jp/programming/directshow/ のサンプルをビルドできたから多分大丈夫
0848デフォルトの名無しさん2008/01/05(土) 07:42:07
はーい。了解。
環境あわせようとしたけどVC2005とDXSDK9.0は相性悪いな〜。

08498412008/01/05(土) 09:04:57
Win2Kだとその構成が限界なんですよね。。
別のXPプレインスコマシンがあるのでそこに環境作ってみます。
0850デフォルトの名無しさん2008/01/05(土) 10:50:14
いや、よいですよ。
DX9.0c+VC6とVC2005+WindowsSDKこの2つの環境を作りました。
両方のプロジェクトファイルを付ければいいですね。
文字を画面に出すとこまで作ったけど環境作るのでへこたれた為、少しだれた
08518372008/01/05(土) 20:26:41
>>837です
>>841さん
メールしました。
08528362008/01/07(月) 22:48:08
>844

レスありがとうございます
>>そこにインクルードパスが通っているかどうかを確認してみるべし。
といってもVC++自体初心者なのでインクルードパスの通し方がわかってないかもしれませんが…。

ツール>オプション>
プロジェクトおよびソリューション>VC++ディレクトリ
プラットフォーム:Win32
インクルードファイルのところに
C:\Program Files\Microsoft Platform SDK\Include
C:\Program Files\Microsoft DirectX SDK (November 2007)\Include\
と入れてあります。

これであってるでしょうか?
0853デフォルトの名無しさん2008/01/08(火) 16:13:27
>>852
おkです。
あと、ライブラリのパス(ライブラリファイル)の方も同様に設定しておかないと
リンク時に見つからないと怒られます。
0854デフォルトの名無しさん2008/01/09(水) 21:37:09
>>841
おーい。一緒に開発しよっせ。
こんなクソソースよめっかっとかでもなんでもいいからなんかないの?
0855デフォルトの名無しさん2008/01/11(金) 15:28:36
( ´-`).。oO(戦うつもりだったけどスレとSDKサンプルみてもう白旗…)
0856デフォルトの名無しさん2008/01/11(金) 21:47:02
がんばれ。サンプルコードの意味わからんとこは解説してやるから

千里の道もまずはGraphedtから

■ このスレッドは過去ログ倉庫に格納されています