示例程序提供了here来运行视频文件。我正在使用“avi”格式文件在Visual Studio 2015中使用DShow API。
请参阅完整代码:
#include<dshow.h>
#include<iostream>
using namespace std;
int CALLBACK WinMain(
_In_ HINSTANCE hInstance,
_In_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow
)
{
IGraphBuilder *pGraph = NULL;
IMediaControl *pControl = NULL;
IMediaEvent *pEvent = NULL;
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
cout << "ERROR - Could not initialize COM library"<<endl;
return -1;
}
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);
if (FAILED(hr))
{
cout << "EROR - Could not create the Filter Graph Manager";
return -1 ;
}
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent);
hr = pGraph->RenderFile(L"C:\\Users\\sunil\\Documents\\Ramp\\output.avi", NULL);
if (SUCCEEDED(hr))
{
hr = pControl->Run();
if (SUCCEEDED(hr))
{
long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);
}
}
pControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();
return 0;
}
构建成功但是当我运行它时会弹出一个标题为“ActiveMovie window”的窗口。 但窗口中没有视频。
我提到同一页面上的评论和许多其他人面临同样的问题。然而,一些人能够成功运行该计划。
我做错了什么?
我的问题来自另一个类似的问题。我不能在那个问题上发表评论因为我是Stack Overflow的新手。
答案 0 :(得分:0)
代码是正确的(按我的原样播放)。代码的典型问题包括:
WaitForCompletion
调用阻塞了线程上的执行,并且你同时负责调度那里的窗口消息,因为你把COM初始化为STA。找出#2是否有问题的简单方法是在MessageBox
和Run
之间进行WaitForCompletion
来电。 MessageBox
会为您发送消息,只要您打开包装盒,视频就会播放(或者即使在关闭包装盒后也能继续播放并继续播放)。正确的解决方案是在同一时间(WaitDispatchingMessages
,this SO question或类似)等待和替换消息。