DShow Sample Code for playing video 不播放视频
DShow Sample Code for playing video does not play the video
示例程序提供了 here 到 运行 一个视频文件。我在 Visual Studio 2015 年使用 "avi" 格式文件来玩 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;
}
构建成功,但是当我 运行 它弹出 windows 标题 "ActiveMovie window"。
但是window.
里面没有视频
我参考了同一页面上的评论,许多其他人也遇到了同样的问题。然而,少数人能够成功 运行 该计划。
我做错了什么?
我的问题来自另一个类似的问题。我无法对该问题发表评论,因为我是 Stack Overflow 的新手。
代码大致正确(按原样为我播放)。代码的典型问题包括:
- 存在编解码器问题,您正在尝试播放具有特定编码的文件,该文件未被拾取或处理被另一个第三方软件覆盖(它本身可能没问题,但与#2 下面)。
- 您忽略了
WaitForCompletion
调用阻塞线程执行的事实,并且您同时负责在那里调度 window 消息,因为您将 COM 初始化为 STA。
查明问题是否出在 #2 上的一个简单方法是在 Run
和 WaitForCompletion
之间放置 MessageBox
调用。 MessageBox
会为您发送消息,只要您保持盒子打开,视频也会播放(或者开始播放效果很好,即使在您关闭盒子后也能继续播放)。正确的解决方案是同时等待和发送消息(WaitDispatchingMessages
, this SO question 或类似的)。
示例程序提供了 here 到 运行 一个视频文件。我在 Visual Studio 2015 年使用 "avi" 格式文件来玩 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;
}
构建成功,但是当我 运行 它弹出 windows 标题 "ActiveMovie window"。 但是window.
里面没有视频我参考了同一页面上的评论,许多其他人也遇到了同样的问题。然而,少数人能够成功 运行 该计划。
我做错了什么?
我的问题来自另一个类似的问题。我无法对该问题发表评论,因为我是 Stack Overflow 的新手。
代码大致正确(按原样为我播放)。代码的典型问题包括:
- 存在编解码器问题,您正在尝试播放具有特定编码的文件,该文件未被拾取或处理被另一个第三方软件覆盖(它本身可能没问题,但与#2 下面)。
- 您忽略了
WaitForCompletion
调用阻塞线程执行的事实,并且您同时负责在那里调度 window 消息,因为您将 COM 初始化为 STA。
查明问题是否出在 #2 上的一个简单方法是在 Run
和 WaitForCompletion
之间放置 MessageBox
调用。 MessageBox
会为您发送消息,只要您保持盒子打开,视频也会播放(或者开始播放效果很好,即使在您关闭盒子后也能继续播放)。正确的解决方案是同时等待和发送消息(WaitDispatchingMessages
, this SO question 或类似的)。