次の方法で共有


キャプチャ フィルターのピン要件

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

このトピックでは、DirectShow キャプチャ フィルターに出力ピンを実装するための要件について説明します。

ピン名

ピンには任意の名前を付けることができます。 ピン名がチルダ (~) 文字で始まる場合、フィルター グラフ マネージャーは、アプリケーションが IGraphBuilder::RenderFile を呼び出したときに、そのピンを自動的にレンダリングしません。 たとえば、フィルターにキャプチャ ピンとプレビュー ピンがある場合は、それぞれ "~Capture" と "Preview" という名前を付けます。 アプリケーションがそのフィルターをグラフでレンダリングすると、プレビュー ピンは既定のレンダラーに接続され、キャプチャ ピンには何も接続されません。これは適切な既定の動作です。 これは、レンダリングを意図していない情報データを提供するピンや、カスタム プロパティを設定する必要があるピンにも適用できます。 チルダ (~) プレフィックスを持つピンは、引き続きアプリケーションによって手動で接続できることに注意してください。

ピンカテゴリ

キャプチャ フィルターには常にキャプチャ ピンがあり、プレビュー ピンがある場合があります。 一部のキャプチャ フィルターには、制御情報などの他の種類のデータを配信するために、他の出力ピンが含まれています。 各出力ピンは 、IKsPropertySet インターフェイスを公開する必要があります。 アプリケーションでは、このインターフェイスを使用してピン カテゴリを決定します。 通常、ピンはPIN_CATEGORY_CAPTUREまたはPIN_CATEGORY_PREVIEWを返します。 詳細については、「 Pin プロパティ セット」を参照してください。

次の例では、 IKsPropertySet を実装して、キャプチャ ピンのピン カテゴリを返す方法を示します。

// Set: Cannot set any properties.
HRESULT CMyCapturePin::Set(REFGUID guidPropSet, DWORD dwID,
    void *pInstanceData, DWORD cbInstanceData, void *pPropData, 
    DWORD cbPropData)
{
    return E_NOTIMPL;
}

// Get: Return the pin category (our only property). 
HRESULT CMyCapturePin::Get(
    REFGUID guidPropSet,   // Which property set.
    DWORD dwPropID,        // Which property in that set.
    void *pInstanceData,   // Instance data (ignore).
    DWORD cbInstanceData,  // Size of the instance data (ignore).
    void *pPropData,       // Buffer to receive the property data.
    DWORD cbPropData,      // Size of the buffer.
    DWORD *pcbReturned     // Return the size of the property.
)
{
    if (guidPropSet != AMPROPSETID_Pin) 
        return E_PROP_SET_UNSUPPORTED;
    if (dwPropID != AMPROPERTY_PIN_CATEGORY)
        return E_PROP_ID_UNSUPPORTED;
    if (pPropData == NULL && pcbReturned == NULL)
        return E_POINTER;
    if (pcbReturned)
        *pcbReturned = sizeof(GUID);
    if (pPropData == NULL)  // Caller just wants to know the size.
        return S_OK;
    if (cbPropData < sizeof(GUID)) // The buffer is too small.
        return E_UNEXPECTED;
    *(GUID *)pPropData = PIN_CATEGORY_CAPTURE;
    return S_OK;
}

// QuerySupported: Query whether the pin supports the specified property.
HRESULT CMyCapturePin::QuerySupported(REFGUID guidPropSet, DWORD dwPropID,
    DWORD *pTypeSupport)
{
    if (guidPropSet != AMPROPSETID_Pin)
        return E_PROP_SET_UNSUPPORTED;
    if (dwPropID != AMPROPERTY_PIN_CATEGORY)
        return E_PROP_ID_UNSUPPORTED;
    if (pTypeSupport)
        // We support getting this property, but not setting it.
        *pTypeSupport = KSPROPERTY_SUPPORT_GET; 
    return S_OK;
}

キャプチャ フィルターの記述