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