共用方式為


使用同步讀取器擷取媒體範例

[與此頁面相關聯的功能 Windows Media Format 11 SDK是舊版功能。 來源讀取器接收寫入器已取代它。 來源讀取器接收寫入器 已針對 Windows 10 和 Windows 11 優化。 Microsoft強烈建議新程式代碼盡可能使用 來源讀取器接收寫入器,而不是 Windows Media Format 11 SDK。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]

您必須逐一向同步讀取器請求每個範例。 這可讓您更好地掌控您收到的範例,和您何時收到範例。

使用 IWMSyncReader::GetNextSample 方法來擷取範例。 您需要將主要的指標傳遞到將會被填入獲取範本信息的變數,這些變數會作為參數使用。 唯一的輸入參數是 wStreamNum 。 如果您傳遞數據流編號,GetNextSample 會擷取具有指定數據流編號的下一個範例。 如果您針對 wStreamNum傳遞零,則會擷取檔案中依時間順序發生的下一個範例。

根據預設,同步讀取器會依時間順序從檔案的輸出擷取所有樣本。 如果您呼叫 getNextSample ,而且沒有其他要取得的範例,則會傳回NS_E_NO_MORE_SAMPLES,這是失敗的錯誤碼。 因此,撰寫程式代碼時,您可以直接循環執行範例,直到方法失敗為止。

注意

若要確保同步讀取器為視訊串流提供正確的範例持續時間,您必須先設定串流輸出。 呼叫 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 介面

使用同步讀取器讀取檔案