使用同步讀取器擷取媒體範例
[與此頁面相關聯的功能 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));
相關主題