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));
Tópicos relacionados