Question

J'utilise Direct Show pour lire des fichiers multimédias dans mon programme, et j'ai pu lire un fichier multimédia une seule fois en utilisant le code suivant.

void main()
{
    IGraphBuilder *pGraph = NULL;
    IMediaControl *pControl = NULL;
    IMediaEvent   *pEvent = NULL;
    HRESULT hr = CoInitialize(NULL);

    if (FAILED(hr))
    {
        printf("ERROR - Could not initialize COM library");
    }

    hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);

    if (FAILED(hr))
    {
        printf("ERROR - Could not create the Filter Graph Manager.");
    }

    hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
    hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
    hr = pGraph->RenderFile(L"C:\\Example.mp3", NULL);

    if (SUCCEEDED(hr))
    {
        hr = pControl->Run();

        if (SUCCEEDED(hr))
        {
            long evCode;
            pEvent->WaitForCompletion(INFINITE, &evCode);
        }
    }

    pControl->Release();
    pEvent->Release();
    pGraph->Release();
    CoUninitialize();
    return;
}

Ma question devient alors comment faire en sorte que le fichier continue de jouer et de se répéter un nombre de fois donné, ou infiniment si je le souhaitais. ImEdiaControl n'a pas de membre nommé membre.

Était-ce utile?

La solution

Il n'y a pas de manière intégrée pour ce faire. Une fois la façon d'implémenter cela est qu'au lieu de sortir de votre fonction lorsque vous obtenez l'événement d'achèvement, vous cherchez au début du fichier une lecture de démarrage. Le lien suivant sur la gestion des événements peut aider: Apprendre quand un événement se produit. EC_COMPLETE L'événement / la notification est émis lorsque le streaming est terminé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top