Date

DirectShowに関するQ and AがGDCL Home Page というWebサイトで公開されている。

それらの一部を和訳しているページがあるが、和訳されていない項目分を当サイトで引き継いで紹介することにした。

これらのQ and Aは古い項目もありますが、ざっと読むだけでも参考になると思う。

翻訳あたっては DirectShow MVP である Geraint Davies 氏より快諾を頂いた上で実施した。あまり綺麗に訳せてないので原文も合わせて参照して頂きたい。

なぜ MPEG-1 のシークはとっても遅いのか?

原文

Why is frame seeking so slow for Mpeg-1?

なぜ MPEG-1 のシークはとっても遅いのか?

The Mpeg-1 stream splitter in DirectX 8 (and 8.0a) contains a bug which makes seeking to frames (with IMediaSeeking using TIME_FORMAT_FRAMES) slow and inaccurate.

DirectX8(と8.0a)にあるMPEG1ストリームスプリッタは、IMediaSeekingTIME_FORMAT_FRAMESを使っているとき、遅く、不正確にフレームへシークするというバグを抱えている。

The time taken is proportional to the offset within the file, so that seeking 3 or 4 minutes into a file can take as much as 5 or 6 seconds.

ファイル内のオフセットに比例して時間がかかる。だから、ファイルの3か4分にシークすると5か6秒もかかってしまう。

Use ConvertTimeFormat, or simply seek in time mode. The splitter in any case performs frame mode seeking by assuming a constant frame rate, so you can use this in your code to work around this bug.

ConvertTimeFormatか、単に時間モードのシークを使いなさい。どの場合でもスプリッタは一定のフレームレートであると仮定することによりフレームモードシークを行う。このバグを回避するために、あなたのコードでこれを使うと良いだろう。

メディアプレイヤが私のフィルタを2度作るのだが

原文

Media Player creates my filter twice

メディアプレイヤーが私のフィルタを2つ作るのだが。

This seems to be a bug in WMP8 that I think is fixed in WMP9.

これはWMP8のバグ、WMP9では直ってるようだ。

If you have a source filter that is registered as the handler for a private URL protocol "myproto://parameters...", WMP8 will create the filter twice.

もしあなたが"myproto://parameters..."のようなプライベートURLプロトコルハンドラとして登録したソースフィルタを持っていると、WMP8は2回フィルタを作るだろう。

It will add both instances to the same graph and will call IFileSourceFilter::Load on both.

同じグラフに両方とものインスタンスが作成され、IFileSourceFilter::Loadが呼ばれるだろう。

Probably the best fix is to check in JoinFilterGraph if another instance of your filter already exists in this graph, and if so return an error from JoinFilterGraph.

おそらく、他のインスタンスが既にグラフにあるかJoinFilterGraphでチェックし、もしそうならJoinFilterGraphからエラーを戻すことがベストな修正方法だ。

複数のグラフがあるときReleaseするとハングする

My app hangs in FilterGraph->Release() when there are several graphs

いくつかグラフがあるときにFilterGraph->Release()で私のアプリがハングするんだが。

I think this is an obscure deadlock in the FGControl component of the filter graph manager.

フィルタグラフマネージャのFGControlコンポーネントにおけるデッドロックだと思う。

There is a worker thread shared between all filter graphs in the same process. This worker thread is blocked waiting for a lock on graph A, which is held by the main app thread. While waiting for the lock, sent messages are processed which results in winproc code on the main app thread being executed.

同一プロセスで全フィルタグラフ間で共有するワーカースレッドがある。このワーカースレッドは、メインアプリのスレッドによって抱えられているグラフAのロックを待つためにブロックされる。ロックを待ってる間、送信したメッセージはスレッドが実行されているメインアプリ上のWinProcにおける結果処理される。

During this winproc execution, your code releases filter graph B.

このウィンドウプロシージャが実行している間、あなたのコードはフィルタグラフBを解放する。

The destructor for graph B (still running on the main app thread) sends a message to the worker thread informing it that the graph is going away, and it blocks for a response which it never gets.

グラフBのデストラクタ(メインアプリ上で実行されている)は、ワーカースレッドにグラフは無くなるよっていうメッセージを送信し、返ってくることのない反応を待ってブロックする。

You will only hit this problem if the main app thread is handling events (such as video window activation and de-activation) for other filter graphs when it receives the message that causes your graph to be destroyed.

もし、それがグラフが破棄されるメッセージを受信するとき、メインアプリのスレッドが他のフィルタグラフのイベントをハンドリングしているならば、あなたは、この問題に当たるだろう。

If you control the application code, the simplest fix is to call InSendMessage before destroying the filtergraph, and if this returns true, postpone the graph destruction until later, using PostMessage.

あなたがアプリケーションコードをコントロールするなら、最もシンプルな修正はフィルタグラフを破棄する前にInSendMessageを呼ぶことだ。そして、もしtrueが戻ってきたらPostMessageを使って後でグラフを廃棄する。

Otherwise I think the fix is to use the "no threads" filter graph CLSID_FilterGraphNoThread.

そうでなかったら、スレッドのないCLSID_FilterGraphNoThreadというフィルタグラフを使うことが解決方法だと思う。

This must be created on a thread that has a message pump (which in most cases means having a dedicated thread that does the CoCreateInstance and then just pumps messages).

これはメッセージポンプを持つスレッド上に作られなければならない。(ほとんどの場合、CoCreateInstanceをする専用スレッドが持っていることを意味する。それからメッセージをポンプする。)

If you think you are running into this problem, please let me know.

この問題に出くわしたら私に教えてほしい。

どうやって IQueueCommand を動かすのか?

原文

IQueueCommand allows you to queue up operations on OLE-automatable interfaces for times in the future.

IQueueCommandは、未来の時間にコマンドをキューにいれるOLEオートメーションインターフェイスだ。

The interface allows you to specify accurate timing (eg when the filter is processing data to be presented at time X), but to date it has only ever been implemented with coarse timing (ie, command is executed when the graph reaches time X).

そのインターフェイスは、正確なタイミングを指定できる。(例: いつ、フィルタが時間Xに表示されるデータを処理するか)、しかし、荒いタイミングで実装されていた。(言い換えれば、コマンドはグラフが時間Xに到達したときに実行される。)

Watch out for three tricky points:

気をつけたい 3 つのややこしいポイント:

  • the IID is not stored -- instead the IID* is stored, so don't put the REFIID param on the stack.
  • You need to pass the dispid for the command to be executed. Use the type info to find this.
  • Don't forget that the time param is an old-style REFTIME double, in which the integers are the number of seconds.

  • IID ではなく IID* を格納すること。従って、スタックに REFIID パラメータを置かないこと。

  • 実行するコードの DISPID を渡す必要がある。これを探すために型情報(type info)を使う。
  • 時間パラメータは、秒単位で、古いスタイルの浮動小数点型のREFTIME であることを忘れないこと。

The following sample code will cause the graph to stop after 5 seconds of playing

以下のサンプルコードは、5秒再生したあとにグラフを停止する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
ITypeLib* ptlib;
LoadRegTypeLib(LIBID_QuartzTypeLib, 1, 0, 0, &ptlib);
ITypeInfo* pti;
ptlib->GetTypeInfoOfGuid(IID_IMediaControl, &pti);
ptlib->Release();
WCHAR* pMethod = L"Stop";
long dispid;
pti->GetIDsOfNames(&pMethod, 1, &dispid);
pti->Release();
IQueueCommand* pQ;
m_Player.Graph()->QueryInterface(IID_IQueueCommand, (void**)&pQ);
if (pQ) {
    HRESULT hr = pQ->InvokeAtStreamTime(
        &m_pCmd, 5,
        (GUID*)&IID_IMediaControl,
        dispid, DISPATCH_METHOD, 0, 0, 0, 0);
    pQ->Release();
}

You can implement IQueueCommand in your filter - eg if you want it to apply with fine precision when you are processing the relevant sample.

あなたは IQueueCommand をあなたのフィルタに実装することができる。- eg もしあなたが関係のあるサンプルを処理するとき正確に適用したいのであれば。

The base classes in ctlutil.h/cpp will help you there. But the distributor will not call your filter, so your app will need to find your filter and QI for IQueueCommand directly on your filter. The fact that this distributor feature was never implemented is probably why no-one ever used IQueueCommand.

ctlutil.h/cppにある基底クラスは役に立つだろう。 しかし、配布する人はあなたのフィルタを呼び出さない、だからあなたのアプリケーションはあなたのフィルタを探し、そして、あなたのフィルタにある IQueueCommandをQIする必要があるだろう。 つまり、おそらく誰も IQueueCommand を使うことがないので、この配布機能は実装されない。

ムービーにテキストを合成するには

原文はこちら。各ダウンロード用のリンクもこちら。

How can my application draw text and graphics on top of a running movie, for example as caption text?

再生中のムービー上にたとえばキャプションテキストのようなテキストやグラフィックを描画するにはどうしたらいい?

The simplest way is to use OvTool.

もっともシンプルな方法はOvToolを使うことだ。(訳注:OvToolのリンクは原文参照。)

This is a freely available tool that provides an HDC that you can draw text and graphics on, which is overlaid using source colour keying.

これは無料で使えるツールで、ソースカラーキーイングを使ってオーバーレイをするテキストやグラフィックを描画できるHDCを提供する。

On non-XP systems, this uses the Overlay Mixer together with a custom source filter that is part of ovtool.

XP以外では、オーバーレイミキサーと一緒にovtoolの一部であるカスタムソースフィルタを使う。

When your app calls GetDC, the custom source filter gets a buffer from the overlay mixer and gives you a DC onto it.

あなたのアプリケーションがGetDCを呼ぶと、カスタムソースフィルタはオーバーレイミキサーからバッファを取得し、それのDCをあなたに与える。(訳注:DCはデバイスコンテキストの事でしょう。)

When you call ReleaseDC, the buffer is delivered to the overlay mixer and source-colour-keyed into the video window.

ReleaseDCを呼ぶと、バッファはオーバーレイミキサに届けられ、ソースカラーキーされてビデオウィンドウに表示される。

On XP systems, OvTool uses the IVMRMixerBitmap interface to deliver the bitmaps directly to the Video Mixing Renderer.

XPにおいては、OvToolはVideo Mixicing Rendererへ直接ビットマップを届けるためにIVMRMixerBitmapインターフェイスを使う。

Note: New Fixes: The latest version fixes an XP-specific bug that only allowed white text -- it created a monochrome bitmap by mistake.

Note: 新しい修正 : 最新版は、作成した誤った白黒ビットマップの白いテキストのみを許容するXPのバグを修正する。

There have also been reports of OvTool not working if the video is played back in an application window instead of the default popup window.

デフォルトポップアップウィンドウの代わりにアプリケーションウィンドウ上でビデオが再生される場合、OvToolはうまく動かないというバグレポートあった。

This is because the window is made visible and receives repaint messages, which make the graph active.

ウィンドウは表示させるのとグラフをアクティブにするのが再描画メッセージ受け取るのが理由だ。

OvTool's graph building (inserting the overlay mixer) will not work if the graph is running.

OvToosのグラフ構築(オーバーレイミキサーを挿入する)は、グラフが実行中であれば動作しないだろう。

The latest version works around this (though you could also just call OvTool.SetGraph before the window re-parenting). End Note

最新版は動作する。(ウィンドウを再親化?前にOvTool.SetGraphを呼ぶだけかもしれないけど。)

Note: New (1 July 2002): Cleaning up after errors: If the overlay cannot be created, OvTool now reconnects the graph as it was, so playback can continue without the overlay.

Note: 新 (1 July 2002): エラー後のクリーンアップ: オーバーレイが作成できない場合、Ovtoolはグラフを再接続する。だから再生はオーバーレイ無しに続行できる。

29 Sep 2002: If the graph is paused, the ReleaseDC method would block indefinitely.

29 Sep 2002: グラフがポーズされると、ReleaseDCメソッドはいつまでもブロックすることがあった。

This is now fixed, so you can repeatedly deliver overlays even when the graph is paused. Note: this applies to ovmix mode only. The VMR will not update the display when paused, so you need to force a refresh of the display by, for example, setting the current position (graph.CurrentPosition = graph.CurrentPosition).

これは修正済み、だからあなたはグラフがポーズされても何度もオーバーレイに転送できる。Note: この適用はovmixモードのみである。 VMR はポーズ時に表示を更新しない。 だから例えば現在位置を設定して強制的に更新する必要がある。(graph.CurrentPosition = graph.CurrentPosition).

To show how simple it is, there is a VB app included in the zip that allows simple overlay of text in only a few lines of VB. There is also an MFC-based C++ application that does the same thing (in source and binary form).

単純に示すために、zipのなかに、たった数行でテキストのオーバーレイができるVBアプリケーションが含まれている。また同じことをするMFCベースのC++アプリケーションもある。(ソースコードとバイナリフォーム)

Both applications create a filter graph, and then pass it to OvTool.

どちらのアプリケーションもフィルタグラフを作り、OvToolに渡す。

If there is no Video Mixing Renderer or Overlay Mixer, OvTool will insert the Overlay Mixer into the graph.

Video Mixing Rendererかオーバーレイミキサーが無ければ、OvToolはオーバーレイミキサーをグラフに挿入する。

Note that this will not work for all types of graphs, since not all video streams can provide the YUV formats that are typically needed to connect to the overlay mixer.

全てのビデオストリームが一般的にオーバーレイミキサへ接続する必要があるYUVフォーマットを提供するわけではないのだから、グラフの全ての種類で動くわけではないことに注意すること。

This is especially true for uncompressed RGB and some AVI codecs. To fix this, download the YUV-RGB converter filter.

これは特に非圧縮RGBといくつかのAVIコーデックにあてはまる。修正するにはYUV-RGB変換フィルタをダウンロードすること。

The overlay mixer uses colour-keyed DirectDraw overlays.

オーバーミキサーはカラーキーDirectDrawオーバーレイを使う。

This is not ideal for all applications, and it does not work with all decoders.

これはすべてのアプリケーションにふさわしくないし、全てのデコーダで動くことではない。

On XP systems, the Video Mixing Renderer provides a far superior tool for mixing, using alpha-blending rather than colour-keying. OvTool ensures that your app can work with the VMR, but it does not take full advantage of it.

XPでは、Video Mixing Rendererは、カラーキーよりもアルファブレンディングを使ったミキシングのための強力なツールを提供する。

Note that there are two problems on XP with playback of raw RGB files. Both are apparently related to confusion between RGB and ARGB formats. If you want to use OvTool with RGB files on XP, you should consider using the overlay mixer in the graph to prevent use of VMR.

XPでは生RGBファイルの再生で2つの問題がある。とぢらもRGBとARGBフォーマットで混乱することに関連しているようだ。XPでRGBファイルをOvToolで使いたいなら、グラフでVMRの仕様を防止してオーバーレイミキサーを使うことを考慮すべきだ。

Extensive thanks to Stephen Estrop for his patience and advice on XP support.

Stephen Estrop 氏のXPサポートの辛抱強さとアドバイスに多大に感謝する。

PS: there is a well-publicised hack involving IOverlay to get the window handle. This will not work on XP, and on pre-XP systems is highly unreliable and is more likely to result in a flickering mess than a successful mix. Please don't use it.

PS: ウィンドウハンドルを取得するためにIOverlayを改善するハックがある。 これはXPでは動かない。XP以前では、信頼できる動作はしない。ミックスに成功したときよりも、大変ちらつく結果となる。どうか使わないでほしい。

アプリ内の変換フィルタを使うには

原文

How can I use a transform filter within my app?

アプリケーション内にある変換フィルタを使うには?

You can create a filter using new within your application instead of using CoCreateInstance.

CoCreateInstanceを使う代わりにnewを使ってアプリケーション内のフィルタを作成できる。

This allows you to have a filter that is private to the application, and also allows you to call public methods on the filter without having to define and expose a COM interface.

アプリケーションのためのプライベートなフィルタを持つことができる。そしてCOMインターフェイスを定義・公開することなくフィルタのパブリックメソッドにアクセスできる。

Download this code sample which demonstrates the use of an in-place transform that lives within the .exe of a simple video player.

シンプルなビデオプレイヤーの.exe内にある、インプレース変換フィルタを使うデモンストレーションのサンプルコードをダウンロードしてください。(訳注:ダウンロード先は原文にあります。)

インプレース変換フィルタとビデオレンダラを接続するには

原文

How to use in-place transforms with the video renderer

インプレース変換フィルタと一緒にビデオレンダラを使うには?

The CTransInPlaceFilter base class does not work for filters that connect to the video renderer.

CTransInPlaceFilter基底クラスはビデオレンダラへ接続するフィルタとしてはうまく動作しない。

It will not connect if the downstream filter insists on its own allocator, and will miss dynamic type changes originating from downstream.

もしダウンストリームフィルタがそれ自身のアロケータを要求する場合、接続しないだろう。そしてダウンストリームが起源となる動的なメディアタイプの変更は失敗するだろう。

This set of derived classes solves the problem by using a proxy allocator on the input pin.

この派生したクラスは、入力ピン上のプロキシアロケータを使うことにより解決する。

Note that in most cases, reading from a VideoRenderer buffer is much slower than writing to it. In-place transforms are not appropriate for filters that access the data in any way.

留意すべきは多くの場合、ビデオレンダラバッファから読むことはそれを書くよりとても遅い。インプレース変換は何らかの方法でデータにアクセスするフィルタには適さない。

However, there are cases where this in-place transform will be useful: for filters that manage only the timestamp, monitor traffic or enforce specific media types, for example. Download the classes here.

しかし、インプレース変換が役立つ場合がある。 : 例えばタイムスタンプを管理するため、トラフィックを監視するため、メディアタイプを強制的に指定するため。(訳註:ダウンロードリンクは原文を参照。)

VBから基準クロックを選ぶには?

How can I select a reference clock from Visual Basic?

Visual Basicから基準クロックを選ぶにはどうしたらいい?

If you need to select a specific filter as the reference clock, the simplest way to do this is to make a filter graph containing only the filter you want as clock, then call Run and Stop on this before making the rest of the graph.

基準クロックとする特定のフィルタを選択する必要があるなら、最も単純な方法はクロックとしたいフィルタだけを含むグラフを作る。そして、グラフの残りを作る前にRunとStopを呼ぶ。

This works because the graph manager selects a clock when the graph goes active, but only if a clock has not already been selected.

クロックがまだ選択されていないと、グラフがアクティブになるときグラフマネージャはクロックを選択するから、うまくいくよ。

VBからフィルタプロパティを表示するには?

原文

How can I show a filter's property pages from Visual Basic?

Visual Basicからフィルタプロパティを表示するにはどうしたらいい?

This can only be done using C/C++ code I think, so I have extended FSFWrap.dll to support it. Download FSFWrap (11Kb) and register the dll with regsvr32 fsfwrap.dll, and then add a reference to the FSFWrap type library.

思うにC/C++コードからしかできない。だから私はFSFWrap.dllを、それをサポートするように拡張した。FSFWrap(11kb)をダウンロードして、regsvr32を使って登録し、FSFWrapタイプライブラリへの参照を追加しよう。

Then you can show a filter's property page with code such as the following. Add this to a command button in the DirectShow vb\builder example to show the property pages of the selected filter. Note that some property pages are shown on the pin, not the filter - for these, you will need to use the PinPropInfo class (see below).

んでもって、次のようなコードを使ってフィルタのプロパティページを表示できる。選択したフィルタのプロパティページを表示する、 DirectShow vb\builder サンプルのコマンドボタンを追加しよう。いくつかのプロパティページはフィルタではなくピン上に表示される。あなたはPinPropInfoクラスを使う必要があるだろう。(以下を参照すること。)

1
2
3
4
5
6
Private Sub FilterProps_Click()
Dim filterex As SinkInfo
Set filterex = New SinkInfo
filterex.filter = g_objSelFilter
filterex.ShowPropPage hWnd
End Sub

VBからAVI Muxフィルタのインターリーブ設定をするには

原文

How can I set the interleaving properties of the AVI Mux filter from Visual Basic?

Visua BasicからAVI Muxフィルタのインターリーブ設定をするにはどうしたらいい?

This can only be done using C/C++ code I think, so I have extended FSFWrap.dll to support it. Download FSFWrap and use code like the following:

C/C++からしかできないと思う。だからFSFWrap.dllでサポートするように拡張した。FSFWrapをダウンロードして次のようなコードを使おう。

1
2
3
4
5
6
Dim mux As AVIMuxInfo
Set mux = New AVIMuxInfo
On Error Resume Next
mux.filter = objFI
txtMode.Caption = mux.Mode
txtInterleave.Caption = mux.Interleave txtPreroll.Caption = mux.Preroll

VBからMPEG-1の左or右チャンネルを選んで再生するには

原文

How can I select the left or right audio channels when playing MPEG-1

MPEG-1を再生するとき、左または右のオーディオチャンネルを選ぶにはどうしたらいい?

If you have the dshow 6 or dx8 sdk, you will find that mpegtype.h includes a definition of an interface IMpegAudioDecoder. The DualMode property can be set to AM_MPEG_AUDIO_DUAL_MERGE (0) or ...LEFT (1) or ...(RIGHT).

dshow6 または dx8sdk を持ってるなら、IMpegAudioDecoderインターフェイスの定義を含んでいるmpegtype.hで見つかる。このデュアルモードプロパティはAM_MPEG_AUDIO_DUAL_MERGE (0) or ...LEFT (1) or ...(RIGHT)をセットできる。

Alas the interface is not vb compatible. I've added a class to fsfwrap to provide VB access to the DualMode and Stereo methods. I tested it by adding the following code to the dshow builder project, to listFilters_Click in frmMain:

インターフェイスはVB互換では無い。私はVBからデュアルモードとステレオメソッドにアクセスするクラスをfsfwrapに追加した。私はdshow構築プロジェクトに次のようなコードを追加して試した。

1
2
3
4
Dim aprops As MpegAudioProps
Set aprops = New MpegAudioProps
aprops.filter = objFI
txtDualMode.Caption = aprops.DualMode

VBからストリームフォーマットを選択するには

原文

How can I select the video capture format with the "Stream Format" dialog? The Stream Format property page allows you to select the pixel format and image size (using the IAMStreamConfig interface). It is exposed by the preview and capture pins of WDM video capture filters. You need to show the property pages of the pin, and not the filter. I have extended fsfwrap.dll to support this, using the following code to show the property page of a pin. This is also used in the CapStill sample below.

ストリームフォーマットプロパティページではピクセルフォーマットやイメージサイズを選択できる。(IAMStreamConfigインターフェイスを使う。) それは WDM ビデオキャプチャフィルタのプレビューピンやキャプチャピンによって公開される。私はこれをサポートするためにfsfwrap.dllを拡張した。ピンのプロパティページを表示させるには次のようなコードを使う。これはまたCapStillサンプルでも使われている。

1
2
3
4
5
6
Dim pinOut As IPinInfo
<...code to set pinOut...>
Dim ppropOut As PinPropInfo
Set ppropOut = New PinPropInfo
ppropOut.Pin = pinOut
ppropOut.ShowPropPage 0

キャプチャフォーマット、キャプチャパラメータをVBから指定するには

原文

How can I specify a capture format and capture parameters from a VB program? Some VB programs need to specify a capture format such as RGB24 320x240, rather than simply showing the Stream Format dialog for the user to select a type. The media type is a complex structure which is hard to deal with directly in VB. I have provided a simple but effective method for using them: a tool that saves the current media type to a file and restores from a file.

VBプログラムには、単にストリームフォーマットダイアログを表示してユーザが種類を選択するのではなく、RGB24 320x240のようなキャプチャフォーマットを指定する必要があるものがある。メディアタイプはVBから直接触るには複雑な構造体である。私は現在のメディアタイプをファイルに保存し、そして復元できる単純ではあるが有効なツールを提供した。

The capstill sample demonstrates this in use. The application shows the Stream Format dialog (see here) and then saves to a file the format that the user selects. Next time the app is run, before showing the Stream Format dialog, the app restores and selects the saved media type.

capstill サンプルはこれを使う。アプリケーションはストリームフォーマットダイアログを表示し、ユーザが選択したフォーマットをファイルへ保存する。次回アプリケーションを実行すると、ストリームフォーマットダイアログを表示する前に、アプリケーションは保存したメディアタイプを復元し、選択する。

The fsfwrap.dll contains a StreamConfig object. The program creates one of these and assigns an IPinInfo to its Pin property, and then uses the SaveCurrentFormat and Restore methods. This only works with pins that support the IAMStreamConfig interface (typically on video capture filters).

fsfwrap.dllはストリームコンフィグオブジェクトを含む。プログラムはそれらの一つを作成し、IPinInfoをピンプロパティに割り当てる。そして、SaveCurrentFormatRestoreメソッドを使う。これはIAMStreamconfigインターフェイスをサポートするピンのみ動作する。(ビデオキャプチャフィルタにはたいていある。)

The latest version of FSFWrap.dll also allows you to control the crossbar settings (to select between eg Composite and S-Video input), and the video standard (PAL, NTSC). This is demonstrated in the capstill sample.

最新のFSFWrap.dllはクロスバー設定の制御(例 CompositeまたはSビデオ入力を選ぶ)、ビデオ規格(PALかNTSC)を制御できる。これはcapstill sampleで示される。

なぜDirectX Builderサンプルはうまく動かないのか?

原文

Why does the DirectX Builder sample not work properly? The DirectShow VB sample Builder does not work with live graphs because it tries to set the file position, and if this fails, it silently does not start the graph. Change the code in the builder’s mnu_FilterGraphRun_Click method to the following

DirectShow VB サンプルビルダーは、ライブグラフでうまく動かない。ファイルポジション(再生位置)をセットしようとし、もしそれが失敗すると、グラフは何も言わずに始まらないからだ。mnu_FilterGraphRun_Clickメソッドを次のように変えると良いよ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
Case GraphState.StateStopped
If Not m_objMediaControl Is Nothing Then
'obtain the current position
Set objPosition = m_objMediaControl
If Not objPosition Is Nothing Then
'reset the position to zero
On Local Error Resume Next
objPosition.CurrentPosition = 0
On Local Error GoTo ErrLine
End If
'set state to running
m_objMediaControl.Run
'reset module-level variable
m_GraphState = StateRunning
End If

Also the "Connect One Pin" implementation in the v8.1 sdk is broken. This code (in frmSelectPins, method listFilters_Click) is intended to show all the unconnected pins that you could connect to. To do this, it uses the pin.ConnectedTo method and then shows the pin if there is an error. Unfortunately a statement "On Local Error Goto Errline" was added which means that when a useful pin is found, the error handler jumps out of the loop. You need to add On Error Resume Next instead:

また、"あるピンを接続する"実装は壊れている。このコード(frmSelectPinslistFilters_Clickメソッド)は、あなたが接続できる、未接続のピンをすべて表示することを意図している。これをするために、pin.ConnectedToメソッドを使っている。そして、もしエラーであれば表示している。残念ながら、"On Local Error Goto Errline"ステートメントは、ピンを見つけたときエラーハンドラはループの外へジャンプしてしまう。あなたは代わりに"On Error Resume Next"を使わなければならない。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
For Each pin In pfilter.Pins
    On Error Resume Next
    Set pinOther = pin.ConnectedTo
    If Err.Number <> 0 Then
        If pin.Direction <> OtherDir Then
            'append the pin's name to the listbox
            listPins.AddItem pin.Name
        End If
    End If
Next

VBで動画から静止画を取得するには?

原文

How can I grab still frames from a movie using Visual Basic? DirectX 8 includes a SampleGrabber filter. This is a pass-through filter that allows an application to view frames as they pass through the graph. However, it is hard to use from Visual Basic. I've written a small dll that, when called from VB, saves the next frame to a .BMP file. To use it, you need to add the SampleGrabber filter to the graph, then construct a VBGrabber object and set the sample grabber to the VBGrabber.FilterInfo property.

DirectX8はSampleGrabberフィルタが含まれる。このパススルーフィルタはアプリケーションがグラフをパススルーするフレームを見ることができる。しかしVBから使うのは難しい。私はVBから呼び出す.BMPファイルへ次のフレームを保存する小さなDLLを書いた。それを使うには、SampleGrabberフィルタを追加し、VBGrabberオブジェクトを作成し、VBGrabber.FilterInfoプロパティにサンプルグラバを設定する必要がある。

I've also written a small test app in VB that demonstrates how to use capstill.dll. To use the demo app, you need to select a source filter (Bouncing Ball works) and then press Preview to build and run a preview graph. Press Snap to save the next frame to a bitmap file. The sample also uses the Stream Format property page on the pin, if present, to allow you to select the image size (the format of the file will always be RGB24). Clearly for a real app you will need a more sophisticated way of selecting the source filter and output pin.

私はcapstill.dllのどのように使うかデモする小さなアプリをVBで書いた。デモアプリを使うために、あなたはソースフィルタ(Bouncing Balは動く)を選択し、Previewを推し、プレビューグラフを実行する必要がある。ビットマップファイルに次のフレームを保存するにはSnapを押す。また、サンプルは、もし示されるならピン上のストリームフォーマットプロパティを、イメージサイズを選択するために使う。(ファイルフォーマットは常にRGB24になるだろう。) 実際には、洗練されたソースフィルタと出力ピンを選択する方法はより洗練する必要があるだろう。

New! you can now also capture still frames to memory. It returns an IBitmapAccess COM object containing the bitmap, from which you can get an HBITMAP (a DIB Section) and also a pointer directly to the bits, and there is an updated sample that demonstrates this, including a dreadful hack which creates a byte array from the bits

New! あなたは静止画をメモリへキャプチャできる。 DIBセクションのHBITMAPからビットマップを含んでいるIBitmapAccessCOMオブジェクトを返す。ビットからバイト配列を作成するひどいハックを含む更新されたサンプルがある。

  • capstill.dllとvbcapデモは原文のサイトよりダウンロードしてください。

VBでビデオキャプチャフィルタを全て挙げるにはどうしたらいい?

原文 >How can I list all the video capture filters (or any another category of filters)?

FSFWrap now contains a FilterCatEnumerator object that allows VB programs to enumerate filters by category. Examples of categories include Video Capture sources, Audio input and output devices and audio or video compressors. A modified version of the DirectShow 8.1 SDK sample builder is included in the zip, which shows how to use this feature. The category is specified by a GUID in text form. The most common categories are given in the builder example.

FSFWrapは、VBプログラムでカテゴリでフィルタを列挙することができるFilterCatEnumeratorオブジェクトを含む。 例えば、ビデオキャプチャソース、オーディオ入力と出力デバイス、オーディオまたはビデオコンプレッサをカテゴリを含む。ZIPに含まれている改良されたDirectShow 8.1 SDKサンプルビルダーは、この機能の使い方を示している。カテゴリはテキストフォームにGUIDで指定する。ほとんどのカテゴリはビルダーサンプル内で与えられている。

VBからフィルタをグラフから取り除くにはどうしたら?

原文

How can I remove filters from a graph in VB The VBGraphHelper (in FSFWrap) has a method RemoveChain(pFilter). This removes from the graph the specified filter, and all filters downstream of it, and returns the output pin that was connected to pFilter.

FSFWrapにあるVBGraphHelperはRemoveChain(pFilter)メソッドを持っている。これは指定したフィルタと、ダウンストリームフィルタの全てをグラフから取り除く。そしてpFilterに繋がれている出力ピンを返す。

1
2
3
4
5
6
7
Dim fg As VBGraphHelper
Set g_FilGraph = New FilgraphManager
Set fg = New VBGraphHelper
fg.Graph = g_FilGraph
Sub Rebuild (pF as IFilterInfo)
Dim pOut As IPinInfo
Set pOut = fg.RemoveChain(pF)

Then you can render pOut using a different set of transforms or whatever. At this point, you might want to add your own transform by class id:

それから、あなたは、別のトランスフォームとかセットしてpOutをレンダリングできる。この時点で、あなたクラスIDであなた自身のトランスフォームを追加したいかもしれない。

1
2
Dim fMyTransform as IFilterInfo
Set fMyTransform = fg.FilterByClsid("{34aa6f94-7778-4cb8-99FB-F2799AAEC64B}", "My Transform")

Then use pOut.Connect to connect the output pin to the new transform.

それから、新しいトランスフォームへ出力ピンを繋ぐためにpOut.Connectを使う。


Comments

comments powered by Disqus