次の方法で共有


スキーム ハンドラーと 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

ここで <スキーム> は、ハンドラーが解析するように設計された 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 (使用可能な場合) です。 バイト ストリーム ハンドラーは、メディア ソースを作成するのに十分なデータを解析するまでバイト ストリームから読み取ります。

ソース リゾルバー