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