Lendo arquivos 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 do 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 do 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ê pode usar o leitor síncrono para ler um arquivo ASF usando chamadas síncronas em vez dos métodos assíncronos no objeto reader. O uso de chamadas síncronas reduz o número de threads necessários para ler um arquivo. O leitor assíncrono usa vários threads para processar fluxos. Para arquivos com vários fluxos, o número de threads usados pode se tornar muito grande. O leitor síncrono usa apenas um thread.

O leitor síncrono foi projetado para atender às necessidades de criação de conteúdo e aplicativos de edição de arquivos. Você pode usar o leitor síncrono para outros aplicativos, mas sua funcionalidade é limitada.

O leitor síncrono pode abrir arquivos locais ou arquivos em uma rede usando o nome do caminho UNC (como "\\someshare\somedirectory\somefile.wmv"). Não é possível transmitir arquivos para o leitor síncrono ou abrir arquivos de um local da Internet. O leitor síncrono também dá suporte para usar a interface COM do IStream como fonte.

O leitor síncrono fornece mais versatilidade para recuperar amostras de um arquivo ASF do que o leitor assíncrono. O leitor síncrono pode fornecer amostras por número de fluxo, bem como por saída. Exemplos entregues por número de fluxo podem ser compactados ou descompactados. O leitor síncrono também pode alternar entre a entrega compactada e descompactada durante a reprodução; esse recurso é conhecido como "edição rápida". Esse recurso permite que um aplicativo de edição leia o conteúdo baseado em Windows Media e passe-o diretamente para o gravador até que um quadro desejado seja atingido. Nesse ponto, o aplicativo pode instruir o leitor a começar a fornecer conteúdo descompactado, que o aplicativo pode modificar e passar para o gravador para recompactação. Quando o aplicativo terminar de modificar os quadros especificados, ele poderá dizer ao leitor para começar a entregar quadros compactados novamente.

A funcionalidade mais básica do objeto leitor síncrono pode ser dividida nas etapas a seguir. Nestas etapas, "o aplicativo" refere-se ao programa que você escreve usando o SDK de Formato de Mídia do Windows.

  1. O aplicativo passa para o leitor síncrono o nome de um arquivo a ser lido. Quando o leitor síncrono abre o arquivo, ele atribui um número de saída a cada fluxo. Se o arquivo usar exclusão mútua, o leitor atribuirá uma única saída para todos os fluxos mutuamente exclusivos.
  2. O aplicativo obtém informações sobre a configuração das várias saídas do leitor. As informações coletadas permitirão que o aplicativo renderize corretamente exemplos de mídia.
  3. O aplicativo começa a solicitar exemplos, um de cada vez, do leitor síncrono. O leitor síncrono fornece cada amostra em um objeto de buffer para o qual ele fornece a interface INSSBuffer .
  4. O aplicativo é responsável por renderizar dados depois que eles são entregues pelo leitor. O SDK do Windows Media Format não fornece nenhuma rotina de renderização. Normalmente, os aplicativos usarão outros SDKs para renderizar dados, como o SDK do Microsoft Direct X ou as funções multimídia do Microsoft SDK da Plataforma Windows.

Essas etapas são ilustradas no aplicativo de exemplo WMSyncReader. Para obter mais informações, consulte Aplicativos de exemplo.

O leitor síncrono também dá suporte a funcionalidades mais avançadas. O leitor síncrono permite que você faça o seguinte:

  • Especifique um intervalo de exemplos a serem recuperados por tempo ou por número de quadro.
  • Controle a seleção de fluxo para fluxos mutuamente exclusivos.
  • Abra um arquivo usando a interface COM padrão, IStream.
  • Ler dados de perfil do cabeçalho do arquivo.
  • Ler metadados do cabeçalho do arquivo.
  • Alternar entre amostras de fluxo e saída durante a reprodução.
  • Alternar entre amostras de fluxo compactadas e descompactadas durante a reprodução.

As seções a seguir descrevem o uso do objeto leitor síncrono em detalhes.

Código de exemplo

O código de exemplo a seguir mostra como ler exemplos de um arquivo ASF usando o leitor síncrono. Ele especifica por número de quadro um intervalo de amostras a serem entregues.

IWMSyncReader* pSyncReader = NULL;
INSSBuffer*    pMyBuffer   = NULL;

QWORD cnsSampleTime = 0;
QWORD cnsSampleDuration = 0;
DWORD dwFlags = 0;
DWORD dwOutputNumber;
HRESULT hr = S_OK;

// Initialize COM.
hr = CoInitialize(NULL);

// Create a synchronous reader.
hr = WMCreateSyncReader(NULL, WMT_RIGHT_PLAYBACK, &pSyncReader);

// Open an ASF file.
hr = pSyncReader->Open(L"c:\\somefile.wmv");

// TODO: Identify the properties for each output. This works 
// exactly as it does with the asynchronous reader.

// Specify a playback range from frame number 100 of the video 
// stream to the end of the file. Assume that the video stream 
// is stream number 2.
hr = pSyncReader->SetRangeByFrame(2, 100, 0);

// Loop through all the samples in the specified range.
do
{
   // Get the next sample, regardless of its stream number.
   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));

pSyncReader->Release();
pSyncReader = NULL;

IWMSyncReader Interface

Lendo arquivos ASF

Objeto de leitor síncrono