Condividi tramite


Per recuperare esempi multimediali con il lettore sincrono

[La funzionalità associata a questa pagina, Windows Media Format 11 SDK, è una funzionalità legacy. È stata sostituita dal lettore di origine e dal writer sink. Lettore di origine e writer sink sono stati ottimizzati per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi lettore di origine e writer sink anziché Windows Media Format 11 SDK, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

È necessario richiedere ogni esempio alla volta dal lettore sincrono. In questo modo si ottiene un maggiore controllo sugli esempi ricevuti e quando vengono ricevuti.

Usare il metodo IWMSyncReader::GetNextSample per recuperare un esempio. È necessario passare principalmente puntatori alle variabili che verranno riempite con informazioni sull'esempio recuperato come parametri. L'unico parametro di input è wStreamNum. Se si passa un numero di flusso, GetNextSample recupererà l'esempio successivo con il numero di flusso specificato. Se si passa zero per wStreamNum, viene recuperato l'esempio successivo che si verifica cronologicamente nel file.

Per impostazione predefinita, il lettore sincrono recupera tutti gli esempi dagli output in un file in ordine cronologico. Se si chiama GetNextSample e non sono disponibili altri esempi da ottenere, verrà restituito NS_E_NO_MORE_SAMPLES, ovvero un codice di errore non riuscito. Quando si scrive codice, è quindi possibile scorrere semplicemente i campioni fino a quando il metodo non ha esito negativo.

Nota

Per assicurarsi che il lettore sincrono fornisca durate di esempio corrette per i flussi video, è prima necessario configurare l'output del flusso. Chiamare il metodo IWMSyncReader::SetOutputSetting per impostare l'impostazione g_wszVideoSampleDurations su TRUE.

 

Codice di esempio

Il codice di esempio seguente illustra come usare GetNextSample per recuperare tutti gli esempi in un file.

// 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));

Interfaccia IWMSyncReader

Lettura di file con lettore sincrono