同期リーダーを使用したファイルの読み取り

[このページに関連付けられている機能である Windows Media Format 11 SDK は、従来の機能です。 ソース リーダーシンク ライターに置き換わりました。 ソース リーダーシンク ライターは、Windows 10とWindows 11用に最適化されています。 Microsoft では、可能であれば、新しいコードで Windows Media Format 11 SDK ではなくソース リーダーシンク ライターを使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

同期リーダーを使用すると、リーダー オブジェクト内の非同期メソッドではなく、同期呼び出しを使用して ASF ファイルを読み取ることができます。 同期呼び出しを使用すると、ファイルの読み取りに必要なスレッドの数が減ります。 非同期リーダーは、ストリームの処理に複数のスレッドを使用します。 複数のストリームを含むファイルの場合、使用されるスレッドの数が非常に多くなる可能性があります。 同期リーダーは、1 つのスレッドのみを使用します。

同期リーダーは、コンテンツ作成およびファイル編集アプリケーションのニーズを満たすように設計されています。 同期リーダーは他のアプリケーションに使用できますが、その機能は制限されています。

同期リーダーは、ローカルのファイル、または UNC パス名 ("\\someshare\somedirectory\somefile.wmv" など) を使用してネットワーク上のファイルを開くことができます。 同期リーダーにファイルをストリーミングしたり、インターネット上の場所からファイルを開いたりすることはできません。 同期リーダーは、 IStream COM インターフェイスをソースとして使用するためのサポートも提供します。

同期リーダーは、非同期リーダーよりも ASF ファイルからサンプルを取得するための汎用性を提供します。 同期リーダーは、ストリーム番号と出力によってサンプルを配信できます。 ストリーム番号によって配信されるサンプルは、圧縮または圧縮解除できます。 同期リーダーは、再生中に圧縮配信と非圧縮配信を切り替えることもできます。この機能は"高速編集" と呼ばれます。この機能により、編集アプリケーションは、Windows メディア ベースのコンテンツを読み取り、目的のフレームに到達するまでライターに直接渡すことができます。 その時点で、アプリケーションは、圧縮されていないコンテンツの配信を開始するようにリーダーに指示できます。その後、アプリケーションで変更を行い、再圧縮のためにライターに渡すことができます。 アプリケーションが指定したフレームの変更を完了すると、圧縮されたフレームの配信を再開するようにリーダーに指示できます。

同期リーダー オブジェクトの最も基本的な機能は、次の手順に分けることができます。 これらの手順では、"アプリケーション" は、Windows Media Format SDK を使用して記述するプログラムを指します。

  1. アプリケーションは、読み取るファイルの名前を同期リーダーに渡します。 同期リーダーがファイルを開くと、各ストリームに出力番号が割り当てられます。 ファイルが相互除外を使用する場合、リーダーは相互に排他的なすべてのストリームに 1 つの出力を割り当てます。
  2. アプリケーションは、リーダーからさまざまな出力の構成に関する情報を取得します。 収集された情報により、アプリケーションはメディア サンプルを適切にレンダリングできます。
  3. アプリケーションは、同期リーダーからのサンプルの要求を一度に 1 つずつ開始します。 同期リーダーは、 INSSBuffer インターフェイスを提供するバッファー オブジェクト内の各サンプルを提供します。
  4. アプリケーションは、リーダーによって配信された後にデータをレンダリングする役割を担います。 Windows Media Format SDK では、レンダリング ルーチンは提供されません。 通常、アプリケーションは他の SDK を使用して、Microsoft Direct X SDK や Microsoft Windows プラットフォーム SDKのマルチメディア機能などのデータをレンダリングします。

これらの手順は、WMSyncReader サンプル アプリケーションで示されています。 詳細については、「 サンプル アプリケーション」を参照してください。

同期リーダーでは、より高度な機能もサポートされています。 同期リーダーを使用すると、次の操作を行うことができます。

  • 時間またはフレーム番号で取得するサンプルの範囲を指定します。
  • 相互に排他的なストリームのストリーム選択を制御します。
  • 標準の COM インターフェイス IStream を使用してファイルを開きます。
  • ファイル ヘッダーからプロファイル データを読み取ります。
  • ファイル ヘッダーからメタデータを読み取ります。
  • 再生中にストリームと出力のサンプルを切り替えます。
  • 再生中に圧縮されたストリーム サンプルと圧縮されていないストリーム サンプルを切り替えます。

以降のセクションでは、同期リーダー オブジェクトの使用方法について詳しく説明します。

コード例

次のコード例は、同期リーダーを使用して ASF ファイルからサンプルを読み取る方法を示しています。 配信するサンプルの範囲をフレーム番号で指定します。

IWMSyncReader* pSyncReader = NULL;
INSSBuffer*    pMyBuffer   = NULL;

QWORD cnsSampleTime = 0;
QWORD cnsSampleDuration = 0;
DWORD dwFlags = 0;
DWORD dwOutputNumber;
HRESULT hr = S_OK;

// Initialize COM.
hr = CoInitialize(NULL);

// Create a synchronous reader.
hr = WMCreateSyncReader(NULL, WMT_RIGHT_PLAYBACK, &pSyncReader);

// Open an ASF file.
hr = pSyncReader->Open(L"c:\\somefile.wmv");

// TODO: Identify the properties for each output. This works 
// exactly as it does with the asynchronous reader.

// Specify a playback range from frame number 100 of the video 
// stream to the end of the file. Assume that the video stream 
// is stream number 2.
hr = pSyncReader->SetRangeByFrame(2, 100, 0);

// Loop through all the samples in the specified range.
do
{
   // Get the next sample, regardless of its stream number.
   hr = pSyncReader->GetNextSample(0,
                                   &pMyBuffer,
                                   &cnsSampleTime,
                                   &cnsSampleDuration,
                                   &dwFlags,
                                   &dwOutputNumber,
                                   NULL);

   if(SUCCEEDED(hr))
   {
      // TODO: Process the sample in whatever way is appropriate 
      // to your application. When finished, clean up.
      pMyBuffer->Release();
      pMyBuffer = NULL;
      cnsSampleTime     = 0;
      cnsSampleDuration = 0;
      dwFlags           = 0;
      dwOutputNumber    = 0;
   }
} 
while (SUCCEEDED(hr));

pSyncReader->Release();
pSyncReader = NULL;

IWMSyncReader インターフェイス

ASF ファイルの読み取り

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