Hämta medieexempel med synkron läsare
[Funktionen som är associerad med den här sidan, Windows Media Format 11 SDK, är en äldre funktion. Det har ersatts av Source Reader och Sink Writer. Source Reader och Sink Writer har optimerats för Windows 10 och Windows 11. Microsoft rekommenderar starkt att ny kod använder Source Reader och Sink Writer i stället för Windows Media Format 11 SDK, när det är möjligt. Microsoft föreslår att befintlig kod som använder äldre API:er skrivs om för att använda de nya API:erna om möjligt.]
Du måste begära varje exempel ett i taget från den synkrona läsaren. Detta ger dig mer kontroll över de exempel du får och när du tar emot dem.
Använd metoden IWMSyncReader::GetNextSample för att hämta ett exempel. Du behöver främst skicka pekare till variabler som kommer att fyllas med information om det urval som hämtas, som parametrar. Den enda indataparametern är wStreamNum. Om du skickar ett strömnummer hämtar GetNextSample nästa exempel med det angivna strömnumret. Om du anger noll för wStreamNum, hämtas nästa prov som inträffar i kronologisk ordning i filen.
Som standard hämtar den synkrona läsaren alla exempel från utdata i en fil i kronologisk ordning. Om du anropar GetNextSample och det inte finns några fler exempel att hämta, returneras NS_E_NO_MORE_SAMPLES, vilket är en misslyckad felkod. När du kodar därför kan du helt enkelt loopa igenom exempel tills metoden misslyckas.
Notera
För att säkerställa att den synkrona läsaren levererar rätt exempelvaraktighet för videoströmmar måste du först konfigurera strömutdata. Anropa metoden IWMSyncReader::SetOutputSetting för att ange inställningen g_wszVideoSampleDurations till TRUE.
Exempelkod
Följande exempelkod visar hur du använder GetNextSample- för att hämta alla exempel i en fil.
// 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));
Relaterade ämnen