Share via


同期リーダーを使用してメディア サンプルを取得するには

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

各サンプルは、同期リーダーから一度に 1 つずつ要求する必要があります。 これにより、受け取るサンプルと受け取るタイミングをより詳細に制御できます。

サンプルを取得するには、 IWMSyncReader::GetNextSample メソッドを使用します。 ほとんどの場合、パラメーターとして取得されたサンプルに関する情報が入力される変数へのポインターを渡す必要があります。 入力パラメーターは wStreamNum のみです。 ストリーム番号を渡すと、 GetNextSample は指定されたストリーム番号を持つ次のサンプルを取得します。 wStreamNum に 0 を渡すと、ファイル内で時系列に発生する次のサンプルが取得されます。

既定では、同期リーダーは出力からすべてのサンプルを時系列順にファイルで取得します。 GetNextSample を呼び出し、取得するサンプルがもうない場合は、失敗したエラー コードであるNS_E_NO_MORE_SAMPLESが返されます。 そのため、コーディングする場合は、 メソッドが失敗するまでサンプルをループ処理するだけです。

Note

同期リーダーがビデオ ストリームの正しいサンプル期間を提供できるようにするには、まずストリーム出力を構成する必要があります。 IWMSyncReader::SetOutputSetting メソッドを呼び出して、g_wszVideoSampleDurations設定を TRUE に設定します

 

コード例

次のコード例は 、GetNextSample を 使用してファイル内のすべてのサンプルを取得する方法を示しています。

// Loop through all the samples in the file.
do
{
   // Get the next sample.
   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));

IWMSyncReader インターフェイス

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