Lettura di file ASF in DirectShow (Windows Media Format 11 SDK)

[La funzionalità associata a questa pagina, Windows Media Format 11 SDK, è una funzionalità legacy. È stata sostituita dal lettore di origine e dal writer sink. Lettore di origine e writer sink sono stati ottimizzati per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi lettore di origine e writer sink anziché Windows Media Format 11 SDK, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

La riproduzione dei file ASF viene gestita dal filtro lettore ASF WM . Quando il lettore ASF WM legge un file, crea automaticamente un pin di output per ogni flusso, inclusi flussi Web, flussi dei comandi di script e qualsiasi altro tipo di flusso arbitrario. Nel caso di più file di velocità in bit, i pin vengono creati solo per i flussi attualmente selezionati.

WM ASF Reader supporta l'interfaccia IMediaSeeking DirectShow, che consente alle applicazioni di eseguire la ricerca temporale all'interno del file. Tuttavia, la riproduzione a velocità diverse da 1,0 (come specificato in IMediaSeeking::SetRate) non è supportata.

Il filtro espone anche diverse interfacce di Windows Media Format SDK, come descritto nella tabella seguente.

Interfaccia Modalità di esposizione Commenti
IWMDRMReader Tramite IServiceProvider al filtro Fornito per le applicazioni che devono riprodurre contenuto protetto da Digital Rights Management (DRM). Questa interfaccia può essere usata anche per ottenere altre interfacce direttamente sull'oggetto Reader.
IWMHeaderInfo QueryInterface per il filtro Fornito in modo che le applicazioni possano leggere gli attributi di file e contenuto, nonché le informazioni e i metadati degli script e degli indicatori.
IWMReaderAdvanced QueryInterface per il filtro Implementato parzialmente nel filtro in modo che le applicazioni possano accedere ai metodi informativi nell'oggetto Lettore WM.
IWMReaderAdvanced2 QueryInterface per il filtro Implementato parzialmente nel filtro in modo che le applicazioni possano accedere ai metodi informativi nell'oggetto Reader.

 

Il filtro lettore ASF WM è stato reso disponibile per la prima volta in DirectShow 8.0. La versione del filtro fornita con DirectShow 8.1 e 9.0 supporta la versione 7. x di Windows Media Format SDK. La versione più recente del filtro, insieme agli altri componenti QASF, viene fornita con e supporta Windows Media Format 9 Series SDK e versioni successive e sostituisce il filtro in DirectX 9.0. Se si installa Windows Media Format SDK dopo l'installazione di DirectX 8. x o 9. x SDK, si sovrascriverà la versione DirectX di qasf.dll con la versione serie 9. Questo non dovrebbe presentare problemi, tranne probabilmente in uno scenario in cui comporterà un comportamento diverso nel metodo DirectShow IGraphBuilder::RenderFile . La versione di Windows Media Format 9 Series SDK del lettore ASF WM è il filtro di origine predefinito per le estensioni di file .asf, .wmv e wma. Ciò significa che il lettore ASF WM viene creato e aggiunto automaticamente al grafico del filtro da Filter Graph Manager nei metodi come IGraphBuilder::RenderFile o IGraphBuilder::AddSourceFilter quando viene specificato un file di questo tipo. In DirectX 9.0 e versioni precedenti e Windows XP Service Pack 1 e versioni precedenti, il metodo RenderFile usa il filtro origine multimediale Windows precedente. Questo comportamento è stato mantenuto per garantire la compatibilità con le versioni precedenti con le applicazioni che hanno usato il Lettore multimediale Windows 6.4. Per altre informazioni sul filtro origine multimediale Windows legacy, vedere la documentazione di DirectShow SDK.

Per riprodurre un file ASF con contenuto basato su Windows Media usando il lettore ASF WM, i tre passaggi principali sono creare un'istanza di Filter Graph Manager, chiamare IGraphBuilder::RenderFile per creare il grafo e quindi chiamare IMediaControl::Run per riprodurre il file. L'esempio di codice seguente è un programma completo che riproduce un file ASF usando DirectShow. Per eseguire questo esempio, è necessario che DirectX SDK sia installato e che l'ambiente di compilazione sia configurato in base alle istruzioni riportate nell'argomento della documentazione di DirectShow SDK "Configurazione dell'ambiente di compilazione". Inoltre, è necessario specificare un file nel computer nella chiamata 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();
}

Si noti che il codice dell'applicazione per questo semplice esempio non fa mai riferimento al lettore ASF WM in modo specifico. Tale filtro viene creato, connesso, eseguito e infine rilasciato da Filter Graph Manager. In molti scenari, tuttavia, è consigliabile configurare il lettore ASF WM prima di iniziare la riproduzione.