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.
- 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.
- 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.
- 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 .
- 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.
- Para criar um leitor síncrono e abrir um arquivo
- Para localizar números de fluxo e números de saída
- Para recuperar exemplos de mídia com o leitor síncrono
- Para buscar por tempo usando o leitor síncrono
- Para buscar por número de quadro usando o leitor síncrono
- Para buscar por código de hora SMPTE usando o leitor síncrono
- Para recuperar exemplos de fluxo com o leitor síncrono
- Para recuperar exemplos compactados com o leitor síncrono
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;
Tópicos relacionados