Lendo arquivos ASF no DirectShow (SDK do Windows Media Format 11)
[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.]
A reprodução de arquivos ASF é tratada pelo filtro Leitor asf do WM . Quando o Leitor do ASF do WM lê um arquivo, ele cria automaticamente um pin de saída para cada fluxo, incluindo fluxos da Web, fluxos de comando de script e qualquer outro tipo de fluxo arbitrário. No caso de vários arquivos de taxa de bits, os pinos são criados apenas para os fluxos selecionados no momento.
O Leitor do ASF do WM dá suporte à interface IMediaSeeking do DirectShow , que permite que os aplicativos executem a busca temporal dentro do arquivo. No entanto, não há suporte para reprodução em velocidades diferentes de 1,0 (conforme especificado em IMediaSeeking::SetRate).
O filtro também expõe várias interfaces do SDK do Windows Media Format, conforme descrito na tabela a seguir.
Interface | Como exposto | Comentários |
---|---|---|
IWMDRMReader | Por meio de IServiceProvider no filtro | Fornecido para aplicativos que precisam reproduzir conteúdo protegido pelo DRM (Gerenciamento de Direitos Digitais). Essa interface também pode ser usada para obter outras interfaces diretamente no Objeto Leitor. |
IWMHeaderInfo | QueryInterface no filtro | Fornecido para que os aplicativos possam ler atributos de arquivo e conteúdo, bem como informações e metadados de marcador e script. |
IWMReaderAdvanced | QueryInterface no filtro | Parcialmente implementado no filtro para que os aplicativos possam acessar os métodos informativos no objeto Leitor do WM. |
IWMReaderAdvanced2 | QueryInterface no filtro | Parcialmente implementado no filtro para que os aplicativos possam acessar os métodos informativos no Objeto Reader. |
O filtro leitor do ASF do WM foi disponibilizado pela primeira vez no DirectShow 8.0. A versão do filtro fornecida com o DirectShow 8.1 e 9.0 dá suporte à versão 7. x do SDK do Windows Media Format. A versão mais recente do filtro, juntamente com os outros componentes do QASF, é fornecida com e dá suporte ao SDK do Windows Media Format 9 Series e versões posteriores e substitui o filtro no DirectX 9.0. Se você instalar o SDK do Windows Media Format depois de instalar o DirectX 8. x ou 9. X SDK, você substituirá a versão DirectX do qasf.dll pela versão da Série 9. Isso não deve apresentar nenhum problema, exceto possivelmente em um cenário em que resultará em um comportamento diferente no método DirectShow IGraphBuilder::RenderFile . A versão do SDK do Windows Media Format 9 Series do Leitor do ASF do WM é o filtro de origem padrão para as extensões de nome de arquivo .asf, .wmv e .wma. Isso significa que o Leitor de ASF do WM é criado e adicionado automaticamente ao grafo de filtro pelo Gerenciador de Grafo de Filtro em métodos como IGraphBuilder::RenderFile ou IGraphBuilder::AddSourceFilter quando um arquivo desse tipo é especificado. No DirectX 9.0 e versões anteriores e no Windows XP Service Pack 1 e versões anteriores, o método RenderFile usa o filtro de origem mais antigo do Windows Media. Esse comportamento foi mantido para garantir a compatibilidade com versões anteriores com aplicativos que usaram o Reprodutor Multimídia do Windows 6.4. Para obter mais informações sobre o Filtro de Origem do Windows Media herdado, consulte a Documentação do SDK do DirectShow.
Para reproduzir um arquivo ASF com conteúdo baseado em Windows Media usando o Leitor do ASF do WM, as três etapas principais são criar uma instância do Gerenciador de Grafo de Filtro, chamar IGraphBuilder::RenderFile para criar o grafo e, em seguida, chamar IMediaControl::Run para reproduzir o arquivo. O exemplo de código a seguir é um programa completo que reproduz um arquivo ASF usando o DirectShow. Para executar este exemplo, você deve ter o SDK do DirectX instalado e seu ambiente de build deve ser configurado de acordo com as instruções no tópico de documentação do SDK do DirectShow "Configurando o ambiente de build". Além disso, você deve especificar um arquivo em seu computador na chamada para RenderFile.
#include <dshow.h>
#include <stdio.h>
void main(void)
{
IGraphBuilder *pGraph = NULL;
IMediaControl *pControl = NULL;
IMediaEvent *pEvent = NULL;
// Initialize the COM library.
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
printf("ERROR - Could not initialize COM library");
return;
}
// Create the Filter Graph Manager and query for interfaces.
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
if (FAILED(hr))
{
printf("ERROR - Could not create the Filter Graph Manager.");
return;
}
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
// Build the graph. IMPORTANT: Change this string to a file
// on your system.
hr = pGraph->RenderFile(L"test.wmv", NULL);
if (SUCCEEDED(hr))
{
// Run the graph.
hr = pControl->Run();
if (SUCCEEDED(hr))
{
// Wait for completion.
long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);
// Note: Do not use INFINITE in a real application, because it
// can block indefinitely.
}
}
pControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();
}
Observe que o código do aplicativo para este exemplo simples nunca faz referência especificamente ao Leitor do ASF do WM. Esse filtro é criado, conectado, executado e, eventualmente, liberado pelo Gerenciador de Grafo de Filtros. Em muitos cenários, no entanto, convém configurar o Leitor do ASF do WM antes de iniciar a reprodução.