Para recuperar exemplos de mídia com o leitor síncrono

[O recurso associado a esta página, Windows Media Format 11 SDK, é um recurso herdado. Ele foi substituído por Leitor de Origem e Gravador de Coletor. O Leitor de Origem e o Gravador de Coletor foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use o Leitor de Origem e o Gravador de Coletor em vez do SDK do Windows Media Format 11, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Você deve solicitar cada exemplo um de cada vez do leitor síncrono. Isso oferece mais controle sobre os exemplos que você recebe e quando os recebe.

Use o método IWMSyncReader::GetNextSample para recuperar um exemplo. Você precisa passar principalmente ponteiros para variáveis que serão preenchidas com informações sobre o exemplo recuperado como parâmetros. O único parâmetro de entrada é wStreamNum. Se você passar um número de fluxo, GetNextSample recuperará o próximo exemplo com o número de fluxo especificado. Se você passar zero para wStreamNum, o próximo exemplo que ocorrer cronologicamente no arquivo será recuperado.

Por padrão, o leitor síncrono recupera todos os exemplos das saídas em um arquivo em ordem cronológica. Se você chamar GetNextSample e não houver mais exemplos para obter, ele retornará NS_E_NO_MORE_SAMPLES, que é um código de erro com falha. Ao codificar, portanto, você pode simplesmente executar um loop por meio de exemplos até que o método falhe.

Observação

Para garantir que o leitor síncrono forneça as durações corretas de exemplo para fluxos de vídeo, primeiro você deve configurar a saída do fluxo. Chame o método IWMSyncReader::SetOutputSetting para definir a configuração de g_wszVideoSampleDurations como TRUE.

 

Código de exemplo

O código de exemplo a seguir mostra como usar GetNextSample para recuperar todos os exemplos em um arquivo.

// 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 Interface

Lendo arquivos com o leitor síncrono