c++ - 使用direct show c++使媒体循环多次

标签 c++ mp3 directshow multimedia

我在我的程序中使用 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 的成员。

最佳答案

没有内置的方法可以做到这一点。实现这一点的一种方法是,当您获得完成事件时,您不会退出您的功能,而是寻找文件的开头再次开始播放。 以下有关事件处理的链接可能会有所帮助:Learning When an Event Occurs . EC_COMPLETE 流式传输完成时发出事件/通知。

关于c++ - 使用direct show c++使媒体循环多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19834776/

相关文章:

具有静态分配节点的 C++ std::list

c++ - 哈希函数

http - 从 mp3/ogg 中删除精确的时间范围

c# - 将DirectShow与OpenCV结合

directshow - 我们如何确定 Lync 用于捕获和呈现音频的 API?

c++ - 在二维数组中嵌套for循环

c++ - 尝试将二维数组作为参数传递时 undefined reference

ios - 借助 iOS 中的 AudioQueueServices 示例将音频线性 pcm 转换为 mp3(使用 LAME)

java - 如何解决Java IOException : Negative Seek Offset?(Java ID3标签库)

c++ - 如何使用 DirectShow 检测 PAL 或 NTSC 信号的存在?