共用方式為


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

[與此頁面相關聯的功能 Windows Media Format 11 SDK是舊版功能。 來源讀取器和接收寫入器已取代它。 來源讀取器和接收寫入器已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用來源讀取器和接收寫入器,而不是Windows 媒體格式 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 介面

使用同步讀取器讀取檔案