Partilhar via


Lendo arquivos com o leitor síncrono

[A funcionalidade associada a esta página, Windows Media Format 11 SDK, é uma funcionalidade herdada. Foi substituído por Source Reader e Sink Writer. O Source Reader e o Sink Writer foram otimizados para o Windows 10 e o Windows 11. A Microsoft recomenda vivamente que o novo código utilize o Leitor de Fonte e o Escritor de Sumidouro em vez do SDK do Windows Media Format 11 , sempre que 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 leitor. 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 fornece suporte para usar o IStream interface COM 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. As amostras entregues pelo número de fluxo podem ser comprimidas ou descomprimidas. O leitor síncrono também pode alternar entre entrega compactada e não compactada durante a reprodução; esse recurso é conhecido como "edição rápida". Esta funcionalidade permite que um aplicativo de edição leia o conteúdo baseado em Windows Media e o passe diretamente para o gravador até que um quadro desejado seja alcançado. Nesse ponto, a aplicação pode instruir o leitor a começar a transmitir conteúdo não compactado, que a aplicação pode então modificar e passar para o escritor para recompressão. Quando a aplicação terminar de modificar os quadros especificados, poderá instruir o leitor a retomar a entrega de quadros compactados.

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 Windows Media Format SDK.

  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 usa exclusão mútua, o leitor atribui 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 amostras de mídia corretamente.
  3. O aplicativo começa a solicitar amostras, uma de cada vez, do leitor síncrono. O leitor síncrono entrega cada amostra em um objeto buffer para o qual ele fornece a interface INSSBuffer.
  4. O aplicativo é responsável por renderizar os dados depois que eles são entregues pelo leitor. O SDK do Windows Media Format não fornece rotinas 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 SDK da Plataforma Microsoft Windows.

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

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

  • Especifique um intervalo de amostras para recuperar por tempo ou por número de quadro.
  • Controle a seleção de fluxos para fluxos mutuamente exclusivos.
  • Abra um arquivo usando a interface COM padrão, IStream.
  • Leia os dados do perfil a partir do cabeçalho do arquivo.
  • Leia os metadados do cabeçalho do arquivo.
  • Alterne entre fluxo e amostras de saída durante a reprodução.
  • Alterne entre amostras de fluxo comprimido e não comprimido durante a reprodução.

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

Exemplo de código

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;

Interface IWMSyncReader

Lendo arquivos ASF

objeto leitor síncrono