用于播放视频的DShow示例代码不播放视频

时间:2016-02-25 10:08:41

标签: c++ winapi video com directshow

示例程序提供了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的新手。

1 个答案:

答案 0 :(得分:0)

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

  1. 存在编解码器问题,您正在尝试播放具有特定编码的文件,该文件未被拾取或处理被其他第三方软件覆盖(可能单独使用但与#2一起产生问题)下文)。
  2. 你忽略了这样一个事实:WaitForCompletion调用阻塞了线程上的执行,并且你同时负责调度那里的窗口消息,因为你把COM初始化为STA。
  3. 找出#2是否有问题的简单方法是在MessageBoxRun之间进行WaitForCompletion来电。 MessageBox会为您发送消息,只要您打开包装盒,视频就会播放(或者即使在关闭包装盒后也能继续播放并继续播放)。正确的解决方案是在同一时间(WaitDispatchingMessagesthis SO question或类似)等待和替换消息。