Leer archivos ASF en DirectShow (SDK de Windows Media Format 11)
[La característica asociada a esta página, SDK de Windows Media Format 11, es una característica heredada. Se ha reemplazado por lector de origen y escritor receptor. El lector de origen y el sistema de escritura receptor se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use lector de origen y escritor receptor en lugar del SDK de Windows Media Format 11, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.
La reproducción de archivos ASF se controla mediante el filtro lector de ASF wm . Cuando el Lector ASF wm lee un archivo, crea automáticamente un pin de salida para cada secuencia, incluidos flujos web, secuencias de comandos de script y cualquier otro tipo de secuencia arbitraria. En el caso de varios archivos de velocidad de bits, solo se crean patillas para las secuencias seleccionadas actualmente.
El lector ASF wm admite la interfaz IMediaSeeking de DirectShow, que permite a las aplicaciones realizar búsquedas temporales dentro del archivo. Sin embargo, no se admite la reproducción a velocidades distintas de 1.0 (como se especifica en IMediaSeeking::SetRate).
El filtro también expone varias interfaces del SDK de Windows Media Format, como se describe en la tabla siguiente.
Interfaz | Cómo se expone | Comentarios |
---|---|---|
IWMDRMReader | A través de IServiceProvider en el filtro | Se proporciona para las aplicaciones que necesitan reproducir contenido protegido por Digital Rights Management (DRM). Esta interfaz también se puede usar para obtener otras interfaces directamente en el objeto Reader. |
IWMHeaderInfo | QueryInterface en el filtro | Se proporciona para que las aplicaciones puedan leer atributos de archivo y contenido, así como información de marcadores y scripts y metadatos. |
IWMReaderAdvanced | QueryInterface en el filtro | Se implementa parcialmente en el filtro para que las aplicaciones puedan acceder a los métodos informativos en el objeto WM Reader. |
IWMReaderAdvanced2 | QueryInterface en el filtro | Implementado parcialmente en el filtro para que las aplicaciones puedan acceder a los métodos informativos en el objeto Reader. |
El filtro WM ASF Reader se puso a disposición por primera vez en DirectShow 8.0. La versión del filtro que se incluye con DirectShow 8.1 y 9.0 admite la versión 7. x del SDK de Windows Media Format. La versión más reciente del filtro, junto con los demás componentes de QASF, incluye y admite el SDK de la serie Windows Media Format 9 y versiones posteriores, y reemplaza el filtro en DirectX 9.0. Si instala el SDK de Windows Media Format después de instalar DirectX 8. x o 9. x SDK, sobrescribirá la versión de DirectX de qasf.dll con la versión de la serie 9. Esto no debe presentar ningún problema excepto posiblemente en un escenario en el que dará lugar a un comportamiento diferente en el método IGraphBuilder::RenderFile de DirectShow. La versión del SDK de la serie 9 de Windows Media Format del lector ASF de WM es el filtro de origen predeterminado para las extensiones de nombre de archivo .asf, .wmv y .wma. Esto significa que el Lector ASF de WM se crea y agrega automáticamente al gráfico de filtros mediante el Administrador de gráficos de filtros en métodos como IGraphBuilder::RenderFile o IGraphBuilder::AddSourceFilter cuando se especifica un archivo de este tipo. En DirectX 9.0 y versiones anteriores, y Windows XP Service Pack 1 y versiones anteriores, el método RenderFile usa el filtro de origen de Windows Media anterior. Este comportamiento se mantuvo para garantizar la compatibilidad con versiones anteriores con las aplicaciones que usaban el Reproductor multimedia de Windows 6.4. Para obtener más información sobre el filtro de origen de Windows Media heredado, consulte la documentación del SDK de DirectShow.
Para reproducir un archivo ASF con contenido basado en Windows Media mediante el Lector ASF wm, los tres pasos principales son crear una instancia del Administrador de gráficos de filtros, llamar a IGraphBuilder::RenderFile para crear el grafo y, a continuación, llamar a IMediaControl::Run para reproducir el archivo. El ejemplo de código siguiente es un programa completo que reproduce un archivo ASF mediante DirectShow. Para ejecutar este ejemplo, debe tener instalado el SDK de DirectX y el entorno de compilación debe configurarse según las instrucciones del tema de documentación del SDK de DirectShow "Configuración del entorno de compilación". Además, debe especificar un archivo en el equipo en la llamada a 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();
}
Tenga en cuenta que el código de la aplicación de este ejemplo sencillo nunca hace referencia específicamente al lector ASF de WM. Ese filtro se crea, conecta, ejecuta y, finalmente, lo libera el Administrador de gráficos de filtros. Sin embargo, en muchos escenarios, es posible que quiera configurar el Lector ASF wm antes de comenzar la reproducción.