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 的新手。

代码大致正确(按原样为我播放)。代码的典型问题包括:

  1. 存在编解码器问题,您正在尝试播放具有特定编码的文件,该文件未被拾取或处理被另一个第三方软件覆盖(它本身可能没问题,但与#2 下面)。
  2. 您忽略了 WaitForCompletion 调用阻塞线程执行的事实,并且您同时负责在那里调度 window 消息,因为您将 COM 初始化为 STA。

查明问题是否出在 #2 上的一个简单方法是在 RunWaitForCompletion 之间放置 MessageBox 调用。 MessageBox 会为您发送消息,只要您保持盒子打开,视频也会播放(或者开始播放效果很好,即使在您关闭盒子后也能继续播放)。正确的解决方案是同时等待和发送消息(WaitDispatchingMessages, this SO question 或类似的)。