Windows Media フォーマット SDK の紹介

Denys Howard
Microsoft Corporation

September 2002

要約: この記事では、Windows Media フォーマット Software Development Kit (SDK) について説明します。Windows Media フォーマットをアプリケーションに実装するための方法について詳細に説明しています。また、Windows Media フォーマット SDK を使用してデジタル メディア コンテンツをエンコードおよびデコードする方法についても説明します。

Windows Media フォーマット 9 シリーズ SDK ダウンロード用登録フォーム

目次

はじめに
オブジェクトの概要
Windows Media ファイル
プロファイル
ライター オブジェクト
リーダー オブジェクト
詳細について

はじめに

開発コード名「コロナ (Corona)」と呼ばれる Microsoft® Windows Media™ フォーマットの Software Development Kit (SDK) には、アプリケーションで Windows Media ファイルを作成して操作できるようになるテクノロジとマニュアルが用意されています。Microsoft が提供するテクノロジをすばやく使用できるので、アプリケーションに固有のビジネス要件をより効率的に実現することができます。

Windows Media フォーマット SDK には、最新の Microsoft コーデックを使用してデジタル メディアをエンコードするライター オブジェクトとリーダー オブジェクト、およびこのようなデータをデコードし、レンダリングのためにこれを配信するオブジェクトが含まれています (コーデックとは、特定のタイプのデジタル メディア コンテンツをエンコードおよびデコードするものです。最新バージョンの Microsoft コーデックは最大限の圧縮率を達成しています)。SDK には、Windows Media ファイル内のコンテンツを構成するストリームを指定および設定するためのプロファイル オブジェクトも含まれています。

この記事では、以下の構成内容で Windows Media フォーマット SDK について説明します。

  • オブジェクトの概要
    Windows Media フォーマット SDK の中核となるオブジェクトを紹介します。これを使用すると Windows Media ファイルを作成および読み取ることができます。
  • Windows Media ファイル
    Windows Media ファイルの内部構造を説明します。
  • プロファイル
    プロファイルを作成して定義する方法を説明します。プロファイルは、ファイル内の各ストリームのプロパティ (タイプ、ビット レート、フレーム レートなど) を記述するものです。
  • ライター オブジェクト
    Windows Media ファイルの作成に必要な手順を説明します。
  • リーダー オブジェクト
    同期および非同期のリーダー オブジェクトについて説明します。これを使えば、Windows Media ファイルからデジタル メディア コンテンツを取り出すことができます。

オブジェクトの概要

このトピックでは、Windows Media フォーマット SDK 内の中核となる各オブジェクトを取り上げて、これらのオブジェクトの相互作用の仕組みについて説明します。各オブジェクトの詳細については、その後のトピックで説明します。

Windows Media ファイルをアプリケーション内に作成するには、最初に入力ソースから入力サンプルを取得する必要があります。ファイルやライブ ソースからの入力サンプルは、好みの手法を使用して取得できます。

複数の入力ソースを利用できます。各入力ソースが、Windows Media ファイル内の 1 つのストリームになります。アプリケーション内で各入力サンプルをライター オブジェクトに渡し、そのサンプルのストリームを指定します。ストリームが相互に排他的であれば、1 つの入力ソースで 2 つ以上のストリームにデータを提供することもできます。たとえば、各ストリームのビット レートが異なり、それぞれが異なるタイプの再生デバイス用であれば、1 つの入力ソースから 3 つのストリームをエンコードできます。

エンコード処理はプロファイルによって制御されます。プロファイルには、ファイル内に含まれるストリームの数、各ストリームに含まれるデータのタイプ、およびその他のストリーム プロパティ (ビット レートなど) についての情報が含まれます。プロファイルは、各ストリームのエンコードに使用するコーデックも指定します。設定情報のためのプロファイルを読み取ることに加えて、ライター オブジェクトは、Windows Media ファイルのヘッダー部にプロファイル データを挿入します。

Windows Media ファイルをデコードするには、アプリケーション内のリーダー オブジェクトを使用します。アプリケーションにコードを書き込んで Windows Media ファイルを開くと、リーダー オブジェクトがこのファイルのヘッダー部からプロファイル データを読み取ります。このプロファイルにより、ファイル内の各ストリームをデコードする場合に使用するコーデックが決まります。したがって、リーダー オブジェクトは各ストリームごとに 1 つの出力を生成することになります。ここでの出力データは、非圧縮のデジタル メディア コンテンツです。

次にアプリケーションは出力をレンダリングするか、あるいはこの出力を用いて他の操作を行うことができます。

次の図は、Windows Media ファイルの書き込みと読み取りの両方を図示しています。図の全体がアプリケーションを表しています。アプリケーションはデジタル メディア入力を取得して、ライター オブジェクトに渡す必要があります。ライター オブジェクトは、Windows Media ファイルにストリームとしてこのデータを挿入します。アプリケーションはリーダー オブジェクトを使用してデータをデコードし、出力することもできます。次にアプリケーションはこれをレンダリングできます。

Dd148612.wmformat_9_sdk_intro-01(ja-jp,MSDN.10).gif
図 1. 入力から出力までのデジタル メディア コンテンツ

この記事の後半では、この図で示した各オブジェクトについて詳細に説明します。

Windows Media ファイル

Windows Media フォーマット SDK のオブジェクトの基本的な目的は、Windows Media ファイルのデータを作成すること、および読み取ることです。このファイルは、Advanced Systems Format (ASF) 仕様に準拠したもので、.wmv および .wma のファイル名の拡張子を使用します。

注意   Microsoft コーデック以外のコーデックでエンコードされたデジタル メディア コンテンツが含まれたファイルは、そのファイルに Microsoft コーデックでエンコードされたストリームも含まれていたとしても、.wmv および .wma のファイル名の拡張子を使用することはできません。このようなファイルは、.asf のファイル名の拡張子を使用する必要があります。詳細については、Windows Media フォーマット SDK の「エンド ユーザー使用許諾契約書 (EULA)」を参照してください。

ASF 形式の Windows Media ファイルは 3 つの部分、すなわちヘッダー部、データ部、およびインデックス部に分かれています。以下のトピックで、各部について説明します。

ヘッダー部

Windows Media ファイルの最初の部分はヘッダー部です。ファイルのこの部分には、ファイル自体についてのメタデータと、ファイル内のデジタル メディア コンテンツについてのメタデータが含まれます。

ヘッダー部の標準的なメタデータ値としては、ファイルのサイズ、ファイルに含まれるストリーム数、ファイルに含まれるパケット数、およびファイル内のストリームをエンコードするのに使用するコーデックがあります。オプションのメタデータ値として、ファイルの説明、作業の作成者、著作権などを含めることができます。アプリケーションで必要となるユーザー設定の値を含めることもできます。

データ部

Windows Media ファイルの最大部分がこの 2 番目の部分であり、デジタル メディア コンテンツそのものが含まれます。データはパケット内のこの部分に格納されます。各パケットには、1 つまたは複数のペイロードがあります。各ペイロードには、1 つのデジタル メディア サンプルとそのサンプルについての情報が含まれます。この情報は、一意の識別子、サンプルの長さ、およびファイルのタイムライン内のポイント (サンプルがレンダリングを開始すべきポイント) です。これは、パケットのプレゼンテーション時刻であり、これによってリーダー オブジェクトは、想定した順序で出力を生成することができます。

Windows Media ファイル内の各パケットがストリームの一部になります。各ストリームはパケットから構成され、1 つのデジタル メディア出力を生成します。たとえば、単純なビデオ ファイルには、オーディオ ストリームとビデオ ストリームが含まれています。

ファイルには、特定のセッションの間に使用されないストリームを含めることもできます。たとえば、アプリケーションで英語、日本語、およびスペイン語のオーディオ入力を取り込んで、これらのそれぞれを別々のストリームとして Windows Media ファイルに挿入できます。リーダー オブジェクトを使用して再生用にファイルをデコードするとき、エンド ユーザーが選択した言語ストリームだけをアプリケーションでレンダリングするようにできます。これは、相互排他オブジェクトを使用することで可能となります。相互排他オブジェクトをプロファイル内で定義すると、ライター オブジェクトは、この情報を使用してファイル内のストリームをグループ化します。

相互排他は、ビット レート、言語 (オーディオ ストリーム用)、または縦横比 (ビデオ ストリーム用) に基づいて指定できます。プログラグを追加すれば、定義した任意の基準に基づいて相互排他を指定することもできます。

インデックス部

Windows Media ファイルの最後の部分はインデックス部です。インデックスは、ファイル内の各ビデオ ストリームごとに、特定のプレゼンテーション時刻を特定のサンプル識別子にマッピングし、ファイルのタイムライン内の特定ポイントにアプリケーションが簡単に移動できるようにします。たとえば、エンド ユーザーが 15.7 秒のデータをファイル内で表示できるようになります。

ライター オブジェクトは、各ビデオ ストリームごとにインデックスを自動的に作成します。インデクサ オブジェクトを使用すれば、インデックスをカスタマイズすることもできます。たとえば、SMPTE/EBU というタイム コードの規格 (映画テレビ技術者協会 (SMPTE) およびヨーロッパ放送連合 (EBU) が定義した規格) を使用すると、ファイルのインデックスを作成できます。

プロファイル

プロファイルとは、Windows Media ファイルとこのファイルのデジタル メディア コンテンツについての、物理的および論理的な構成を記述したプロパティのセットです。コンテンツ固有のプロパティ、すなわち、タイプ (たとえば、オーディオやビデオ)、ビット レート、エンコードまたはデコードに使用するコーデックなどを使って、ファイル内の各ストリームを表します。

ライター オブジェクトは、プロファイル データを使用して、渡された入力サンプルのエンコード方法を決定します。またライター オブジェクトは、ファイルのヘッダー部にプロファイル データの挿入も行います。リーダー オブジェクトは、ヘッダーからプロファイル データを読み取ってファイルのデコード方法を決定します。

プロファイル マネージャ

Windows Media ファイルのプロファイルを動的に定義するには、プロファイル マネージャ オブジェクトを使用します。プロファイル マネージャのメソッドを呼び出して、空のプロファイルまたは既存のプロファイルのいずれかをロードします。いずれの場合も、プロファイル オブジェクトをロードします。次に、プロファイル オブジェクトのさまざまなメソッドを呼び出して、このエンコード セッションのプロファイルに、必要な値を指定します (既存のプロファイルを変更せずに使用するには、単にメソッドを呼び出してプロファイル データを含んだファイルを指定するだけです)。

プロファイルには、ファイルに含まれるストリームの数、およびこれらのストリームが相互排他グループに含まれているかどうかを指定します。各ストリームごとに、そのストリーム内のデジタル メディア コンテンツのタイプ、ストリームが必要とするコーデック、およびビット レートや画面サイズなどのその他の値を指定します。プロファイル オブジェクトのメソッドにより、アプリケーションが必要とするプロファイル全体をプログラムを用いて定義できます。

プロファイルのプロパティのすべてを設定したら、プロファイル データを文字列として保存するため、プロファイル マネージャのメソッドを呼び出します。これにより、好みの手法を使用してファイルに文字列を保存できます。ファイルは、.prx のファイル名の拡張子を使用します。オプションとして、単にプロファイル データの文字列をライター オブジェクトに渡せば、ファイルに保存することなく、このセッションでプロファイルを使用できます。

ライター オブジェクト

アプリケーションは、ライター オブジェクトを使用して入力サンプルをエンコードし、Windows Media ファイルのデータ部にあるストリームに入力サンプルを挿入できます。ライター オブジェクトは、ファイルのヘッダー部とインデックス部を作成することもできます。

アプリケーション内で、ライター オブジェクトを作成し、次にライター オブジェクトとプロファイルとを関連付けます。この関連付けのためには、この記事の「プロファイル」のトピックで述べたように、プロファイル オブジェクトのプロパティを設定するルーチンの作成が必要となる場合があります。次に、プロファイル オブジェクトをライター オブジェクトに渡します。

必要なら、ライター オブジェクトによってファイルのヘッダー部に挿入するメタデータを指定することもできます。

プロファイル オブジェクトとライター オブジェクトとの関連付け、およびユーザー設定のメタデータの指定が完了すれば、ライター オブジェクトに入力サンプルを渡すことができます。最初に、ライター オブジェクトのメソッドを呼び出してエンコード処理を開始します。次にバッファを割り当てて、そのバッファのインターフェイスへのポインタを取得し、サンプル データをバッファにコピーします。最後に、バッファ ポインタ、正しい入力数、および正しいプレゼンテーション時刻をライター オブジェクトに渡します。

この時点で、ライター オブジェクトは、プロファイルに指定されたコーデックに入力サンプルを渡します。コーデックはサンプルをエンコードして、ライター オブジェクトに戻します。ライター オブジェクトは次にサンプルをパケットにし、ファイルのデータ部にある正しいストリームにパケットを挿入します。

ソースから入力サンプルが続く限り、前の 2 つの段落の作業を繰り返す必要があります。入力サンプルのすべての提供が完了すれば、ライター オブジェクトはファイル内のビデオ ストリームのインデックスを作成し、ファイルのインデックス部にデータを追加します。

これまで述べたように、ライター オブジェクト使用方法は非常に簡単です。ファイルに対する入力の指定、必要となるメタデータの指定、希望の出力の設計、および適切なプロファイルの準備については、これより多くの作業が必要となります。

リーダー オブジェクト

Windows Media ファイルに格納されたデジタル メディア データはエンコードされ、また非常に高い率で圧縮される場合があります。アプリケーションでこのデータを使用するには、最初に Windows Media ファイルからデータを読み込んでデコードする必要があります。この作業を行うため、リーダー オブジェクトを使用します。

アプリケーションは、Windows Media フォーマット SDK の 2 つのリーダー オブジェクト、すなわち同期リーダー オブジェクトまたは非同期リーダー オブジェクトのいずれかを使用できます。アプリケーションのビジネス ニーズに最適なリーダー オブジェクトを選択します。両方のリーダー オブジェクトをアプリケーションで使用して、いろいろな要件を満足させることもできます。

同期リーダー オブジェクト

同期リーダー オブジェクトは、任意の時点における Windows Media ファイルの一部分だけを取り出すアプリケーション (たとえば、デジタル メディア コンテンツを編集するアプリケーション) に最適です。アプリケーション内でこのリーダー オブジェクトのメソッドを呼び出して、指定されたパケットだけを取り出します。これは同期方式であるため、このリーダーは 1 つのスレッドだけを使用します。

同期リーダー オブジェクトを使用すると、自分のコンピュータ上に存在する、またはネットワーク上で利用できる Windows Media ファイルを読み込むことができます。Windows Media ベースのコンテンツをこのオブジェクトにストリーミングすることはできません。またインターネット ロケーションからのファイルを開くこともできません。

同期リーダー オブジェクトを初期化した後、ファイルを開く場所を指定します。次に、リーダー オブジェクトのメソッドを呼び出して、ファイルのヘッダー部からプロファイル データとメタデータを取り出します。この情報を使用すると、たとえば、必要な出力を決定したり、特定のプレゼンテーション時刻に合致するサンプルを決定したりできます。

同期リーダー オブジェクトを使用すると、ファイル内の任意のストリームにデータを要求できます。これには、相互排他オブジェクトに格納されたストリームも含まれます。たとえば、編集アプリケーションは、相互に排他的なストリームを含むファイル内のすべてのストリームにアクセスする必要があります。

リーダー オブジェクトは、要求されたデータをデコードして戻します。次にアプリケーションは、好みの手法を使用してこのデータをレンダリングするか、あるいはこのデータを用いて他の操作を行うことができます。

非同期リーダー オブジェクト

非同期リーダー オブジェクトは、Windows Media ファイルのすべてまたは一部を再生するアプリケーションに適しています。このリーダー オブジェクトのメソッドを呼び出して、ファイルのデコードを開始、一時停止、または再開することができます。リーダー オブジェクトは、効率向上のため複数のスレッドを使用できます。

このオブジェクトを使用すると、ローカル、ネットワーク、またはインターネットの各ロケーションから、あるいは Windows Media ベースのストリーミング コンテンツから Windows Media ファイルを読み込むことができます。

非同期リーダー オブジェクトを初期化した後、ソースを指定します。ファイルを読み込む前に、リーダー オブジェクトのメソッドを呼び出して、ファイルのヘッダー部からプロファイル データとメタデータを取り出し、この情報を使用してデジタル メディア コンテンツのレンダリング方法を決定できます。

非同期リーダー オブジェクトを使用すると、一般的なビデオ ファイルを構成するオーディオ出力やビデオ出力などの各出力をファイルから受信することができます。任意のデコード後のストリームを受信することはできません。ファイルの相互排他オブジェクトに複数のストリームが含まれている場合、いずれの再生の間も、相互に排他的なそのグループからデコードされた出力を 1 つだけ取り出すことができます。ただし、任意の圧縮ストリームを受信することはできます。これは、非同期アクセスは必要であるがデコードは必要でないときに有効です。

非同期リーダー オブジェクトを用いてファイルを開いた後、リーダー オブジェクトは、デコードする各サンプルごとにイベントを生成します。アプリケーションは、サンプルを受信するためのイベント ハンドラを実装する必要があります。これにより、好みの手法を使用してこのサンプルをレンダリングできます。リーダーは、ファイルの最後に到達するか、一時停止または停止のメソッドが呼び出されるまで、このイベントの生成を続行します。

詳細について

この記事で説明した手法に必要なオブジェクトとインターフェイスの詳細については、Windows Media Technologies Web ページから Windows Media フォーマット SDK をダウンロードしてください。