次の方法で共有


メディアの種類のネゴシエート

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

Filter Graph Manager が IPin::Connect メソッドを呼び出すと、メディアの種類を指定するためのいくつかのオプションがあります。

  • 完全な種類: メディアタイプが完全に指定されている場合、ピンはそのタイプとの接続を試みます。 接続できない場合、接続の試行は失敗します。
  • 部分メディアの種類: メジャー型、サブタイプ、または書式の種類がGUID_NULL場合、メディアの種類は 部分的 です。 値GUID_NULL任意の値が許容されることを示す "ワイルドカード" として機能します。 ピンは、部分型と一致する型をネゴシエートします。
  • メディアの種類なし: フィルター グラフ マネージャーが NULL ポインターを渡した場合、ピンは両方のピンで許容される任意のメディアの種類に同意できます。

ピンが接続する場合、接続には常に完全なメディア タイプがあります。 Filter Graph Manager によって提供されるメディアの種類の目的は、使用可能な接続の種類を制限することです。

ネゴシエーション プロセス中に、出力ピンは入力ピンの IPin::ReceiveConnection メソッドを呼び出してメディアの種類を提案します。 入力ピンは、提案された型を受け入れるか拒否できます。 このプロセスは、入力ピンが型を受け入れるか、出力ピンの種類が不足し、接続が失敗するまで繰り返されます。

出力ピンが提案するメディアの種類を選択する方法は、実装によって異なります。 DirectShow 基本クラスでは、出力ピンは入力ピンの IPin::EnumMediaTypes を呼び出します。 このメソッドは、入力ピンの優先メディアの種類を列挙する列挙子を返します。 これに失敗すると、出力ピンは独自の優先型を列挙します。

メディアの種類の操作

AM_MEDIA_TYPE パラメーターを受け取る関数では、pbFormat メンバーを逆参照する前に、常に cbFormatformattype の値を検証します。 次のコードは正しくありません。

if (pmt->formattype == FORMAT_VideoInfo)
{
    VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    // Wrong!
}

次のコードは正しいです。

if ((pmt->formattype == FORMAT_VideoInfo) && 
    (pmt->cbFormat > sizeof(VIDEOINFOHEADER) &&
    (pbFormat != NULL))
{
    VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    // Now you can dereference pVIH.
}