Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
[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.
- 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.
- 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.
- 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.
- 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.
- Para criar um leitor síncrono e abrir um arquivo
- para encontrar números de fluxo e números de saída
- Para obter amostras de média com o leitor síncrono
- Procurar por tempo usando o Leitor Síncrono
- Procurar Pelo Número do Quadro Usando o Leitor Síncrono
- Procurar por Código de Tempo SMPTE Usando o Leitor Síncrono
- para recuperar amostras de fluxo com o leitor síncrono
- para recuperar amostras compactadas com o leitor síncrono
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;
Tópicos relacionados