スキーム ハンドラーとByte-Stream ハンドラー

このトピックでは、ソース リゾルバーがメディア ソースを作成する方法の内部的な詳細について説明します。 Media Foundation 用のカスタム メディア ソースを実装していて、ソース リゾルバーを介してアプリケーションでメディア ソースを使用できるようにする場合は、このトピックを参照してください。

ソース リゾルバーは、URL またはバイト ストリーム (つまり IMFByteStream ポインター) からメディア ソースを作成できます。 これを行うには、ハンドラーと呼ばれるヘルパー オブジェクト を使用します。 URL の場合、ソース リゾルバーは スキーム ハンドラーを使用します。 バイト ストリームの場合は、 バイト ストリーム ハンドラーが使用されます

スキーム ハンドラーは、URL を入力として受け取り、メディア ソースまたはバイト ストリームを作成します。 バイト ストリームを作成する場合、ソース リゾルバーはそれをバイト ストリーム ハンドラーに渡し、メディア ソースを作成します。 次の図は、このプロセスを示しています。

ソース解決プロセスを示す図

スキーム ハンドラー

スキーム ハンドラーは、アプリケーションが IMFSourceResolver::CreateObjectFromURL またはその非同期同等の BeginCreateObjectFromURL を呼び出すときに使用されます。

ソース リゾルバーは、レジストリ内のスキーム ハンドラーを検索します。 スキーム ハンドラーは、次のキーの下の URL スキームで一覧表示されます。

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows Media Foundation
            SchemeHandlers
               <scheme>
                  {00000000-0000-0000-0000-000000000000} = REG_SZ
HKEY_LOCAL_MACHINE
   Software
      Microsoft
         Windows Media Foundation
            SchemeHandlers
               <scheme>
                  {00000000-0000-0000-0000-000000000000} = REG_SZ

>scheme< は、ハンドラーが解析するように設計されている URL スキームです。 スキームには末尾の ':' 文字が含まれています。たとえば、"http:" です。

新しいスキーム ハンドラーを登録するには、正規文字列形式で、スキーム ハンドラーの CLSID という名前のエントリを追加します {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}。 エントリの値は、"My Scheme Handler" などのハンドラーの簡単な説明を含む文字列 (REG_SZ) です。エントリの重要な部分は CLSID です。 ソース リゾルバーは、この CLSID で CoCreateInstance を呼び出してハンドラーを作成します。

スキーム ハンドラーは、 IMFSchemeHandler インターフェイスを 公開します。 ソース リゾルバーが URL スキームに一致するスキーム ハンドラーを見つけた場合、ソース リゾルバーは元の URL を渡して IMFSchemeHandler::BeginCreateObject を呼び出します。 スキーム ハンドラーは URL を開き、内容の解析を試みます。 その時点で、スキーム ハンドラーには 2 つのオプションがあります。

  • メディア ソースを作成します。
  • バイト ストリームを作成します。

メディア ソースを作成すると、ソース リゾルバーはメディア ソースをアプリケーションに返します。 バイト ストリームを作成する場合、ソース リゾルバーは、次のセクションで説明するように、適切なバイト ストリーム ハンドラーの検索を試みます。

Byte-Stream ハンドラー

バイト ストリーム ハンドラーは、アプリケーションが IMFSourceResolver::CreateObjectFromByteStream またはその非同期同等の BeginCreateObjectFromByteStream を呼び出すときに使用されます。 前に説明したように、スキーム ハンドラーがバイト ストリームを返すときにも使用されます。

スキーム ハンドラーと同様に、バイト ストリーム ハンドラーがレジストリに一覧表示されます。 これらは、次のキーの下に、ファイル名拡張子または MIME の種類 (または両方) のいずれかで一覧表示されます。

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows Media Foundation
            ByteStreamHandlers
               <ExtensionOrMimeType>
                  {00000000-0000-0000-0000-000000000000} = REG_SZ
HKEY_LOCAL_MACHINE
   Software
      Microsoft
         Windows Media Foundation
            ByteStreamHandlers
               <ExtensionOrMimeType>
                  {00000000-0000-0000-0000-000000000000} = REG_SZ

ここで<、ExtensionOrMimeType> はファイル名拡張子または MIME の種類です。 ファイル拡張子には、最初の '.' 文字が含まれます。たとえば、".wmv" です。

ファイル名拡張子は、アプリケーションによって提供される URL の一部です。 MIME の種類は、バイト ストリームの MF_BYTESTREAM_CONTENT_TYPE 属性を通じて使用できる場合があります。

新しいバイト ストリーム ハンドラーを登録するには、標準文字列形式でハンドラーの CLSID という名前のエントリを追加します。 エントリの値は、"My Byte-Stream Handler" などのハンドラーの簡単な説明を含む文字列 (REG_SZ) です。ソース リゾルバーは CoCreateInstance を呼び出して、CLSID からハンドラーを作成します。 同じハンドラーを複数の拡張機能または MIME の種類に登録できます。

バイト ストリーム ハンドラーは、 IMFByteStreamHandler インターフェイスを 公開します。 ソース リゾルバーは、一致するバイト ストリーム ハンドラーを検出すると、 IMFByteStreamHandler::BeginCreateObject を呼び出します。 このメソッドへの入力は、バイト ストリームへのポインターと、元の URL (使用可能な場合) です。 バイト ストリーム ハンドラーは、メディア ソースを作成するのに十分なデータを解析するまでバイト ストリームから読み取ります。

ソース リゾルバー