Lecture de fichiers ASF dans DirectShow (SDK Windows Media Format 11)

[La fonctionnalité associée à cette page, le Kit de développement logiciel (SDK) Windows Media Format 11, est une fonctionnalité héritée. Il a été remplacé par lecteur source et enregistreur récepteur. Le lecteur source et l’enregistreur récepteur ont été optimisés pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise le lecteur source et l’enregistreur récepteur au lieu du Kit de développement logiciel (SDK) Windows Media Format 11, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

La lecture des fichiers ASF est gérée par le filtre Lecteur ASF WM . Lorsque le lecteur ASF WM lit un fichier, il crée automatiquement une broche de sortie pour chaque flux, y compris les flux Web, les flux de commande de script et tout autre type de flux arbitraire. Dans le cas de plusieurs fichiers à débit binaire, les broches sont créées uniquement pour les flux actuellement sélectionnés.

Le lecteur WM ASF prend en charge l’interface IMediaSeeking DirectShow, qui permet aux applications d’effectuer une recherche temporelle dans le fichier. Toutefois, la lecture à des vitesses autres que 1.0 (comme spécifié dans IMediaSeeking::SetRate) n’est pas prise en charge.

Le filtre expose également plusieurs interfaces du Kit de développement logiciel (SDK) au format Windows Media, comme décrit dans le tableau suivant.

Interface Quelle est l’exposition Commentaires
IWMDRMReader Via IServiceProvider sur le filtre Fourni pour les applications qui doivent lire du contenu protégé par la gestion des droits numériques (DRM). Cette interface peut également être utilisée pour obtenir d’autres interfaces directement sur l’objet Reader.
IWMHeaderInfo QueryInterface sur le filtre Fourni pour que les applications puissent lire les attributs de fichier et de contenu, ainsi que les informations et métadonnées de marqueur et de script.
IWMReaderAdvanced QueryInterface sur le filtre Partiellement implémenté sur le filtre afin que les applications puissent accéder aux méthodes d’information sur l’objet Lecteur WM.
IWMReaderAdvanced2 QueryInterface sur le filtre Implémenté partiellement sur le filtre afin que les applications puissent accéder aux méthodes d’information de l’objet Reader.

 

Le filtre lecteur WM ASF a été mis à disposition pour la première fois dans DirectShow 8.0. La version du filtre fournie avec DirectShow 8.1 et 9.0 prend en charge la version 7. x du Kit de développement logiciel (SDK) au format Windows Media. La version la plus récente du filtre, ainsi que les autres composants QASF, est fournie avec et prend en charge le Kit de développement logiciel (SDK) Windows Media Format 9 et versions ultérieures, et remplace le filtre dans DirectX 9.0. Si vous installez le Kit de développement logiciel (SDK) au format Windows Media après avoir installé DirectX 8. x ou 9. x KIT de développement logiciel (SDK), vous remplacerez la version DirectX de qasf.dll par la version de la série 9. Cela ne doit pas présenter de problèmes, sauf peut-être dans un scénario où cela entraîne un comportement différent dans la méthode DirectShow IGraphBuilder::RenderFile . La version du Kit de développement logiciel (SDK) de la série Windows Media Format 9 du lecteur ASF WM est le filtre source par défaut pour les extensions de nom de fichier .asf, .wmv et .wma. Cela signifie que le lecteur ASF WM est automatiquement créé et ajouté au graphe de filtre par le Gestionnaire de graphes de filtres dans des méthodes telles que IGraphBuilder::RenderFile ou IGraphBuilder::AddSourceFilter lorsqu’un fichier de ce type est spécifié. Dans DirectX 9.0 et versions antérieures et Windows XP Service Pack 1 et versions antérieures, la méthode RenderFile utilise l’ancien filtre source Windows Media. Ce comportement a été maintenu pour garantir la compatibilité descendante avec les applications qui utilisaient le Lecteur multimédia Windows 6.4. Pour plus d’informations sur le filtre de source Windows Media hérité, consultez la documentation du Kit de développement logiciel (SDK) DirectShow.

Pour lire un fichier ASF avec du contenu Windows Media à l’aide du lecteur WM ASF, les trois étapes principales sont de créer un instance du Gestionnaire de graphes de filtre, d’appeler IGraphBuilder::RenderFile pour créer le graphique, puis d’appeler IMediaControl::Run pour lire le fichier. L’exemple de code suivant est un programme complet qui lit un fichier ASF à l’aide de DirectShow. Pour exécuter cet exemple, vous devez avoir installé le Kit de développement logiciel (SDK) DirectX et votre environnement de build doit être configuré conformément aux instructions de la rubrique de documentation du Kit de développement logiciel (SDK) DirectShow « Configuration de l’environnement de build ». En outre, vous devez spécifier un fichier sur votre ordinateur dans l’appel à 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();
}

Notez que le code d’application de cet exemple simple ne fait jamais référence au lecteur ASF WM spécifiquement. Ce filtre est créé, connecté, exécuté et finalement libéré par le Gestionnaire de graphes de filtre. Toutefois, dans de nombreux scénarios, vous pouvez configurer le lecteur ASF WM avant de commencer la lecture.