使用直接显示 c++ 多次使媒体循环

Make media loop many times with direct show c++

本文关键字:媒体 循环 显示 c++      更新时间:2023-10-16

我正在使用直接显示在我的程序中播放媒体文件,并且我已经能够使用以下代码播放一次媒体文件。

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;
}

然后我的问题变成了如何使文件继续播放并重复给定的次数,或者如果我愿意,可以无限重复。 IMediaControl 没有名为循环的成员。

没有内置的方法可以做到这一点。实现这一点的一次方法是,在获取完成事件时,您不是退出函数,而是寻求文件的开头再次开始播放。以下有关事件处理的链接可能会有所帮助:了解事件发生时的情况。 流式传输完成后发出EC_COMPLETE事件/通知。