我正在使用Direct Show在程序中播放媒体文件,并且我能够使用以下代码一次播放媒体文件。

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没有成员名为Loop。

有帮助吗?

解决方案

没有内置的方式来做到这一点。一旦实现此目的,就可以在完成完成事件时,而不是退出您的功能,而是寻求文件的开始再次开始播放。事件处理上的以下链接可能会有所帮助: 学习何时发生事件. EC_COMPLETE 流式传输完成后发出事件/通知。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top