【问题标题】:DShow Sample Code for playing video does not play the videoDShow 播放视频的示例代码不播放视频
【发布时间】:2016-06-08 01:01:25
【问题描述】:

示例程序提供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 窗口”。 但是窗口中没有视频。

我在同一页面上提到了 cmets,许多其他人也面临同样的问题。然而,少数人能够成功运行该程序。

我做错了什么?

我的问题来自另一个类似的问题。我无法对这个问题发表评论,因为我是 Stack Overflow 的新手。

【问题讨论】:

  • windows media player可以在同一台电脑上播放视频吗? .avi 文件可以包含许多不同格式的视频。 Dshow 仅限于与 windows 媒体播放器相同的文件格式和编解码器。如果没有,您可能缺少编解码器或文件可能已损坏。

标签: c++ winapi video com directshow


【解决方案1】:

代码是正确的(对我来说就是这样)。代码的典型问题包括:

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

找出#2 是否是问题的一种简单方法是将MessageBox 调用置于RunWaitForCompletion 之间。 MessageBox 为您发送消息,只要您保持盒子打开,视频也会播放(或者即使在您关闭盒子后也能正常播放并继续播放)。正确的解决方案是同时等待和发送消息(WaitDispatchingMessagesthis SO question 或类似的)。

【讨论】:

  • 感谢 Roman R。我在几次点击和试验后发现的问题是我的 avi 文件是用“x264”编码器编码的。此代码能够播放原始 avi 文件。 DirectShow 无法播放由“x264”编码器编码的视频。
  • DirectShow 对 x264 生成的内容没有任何问题,无论是 AVI、MP4、MKV 等。但是您安装的组件可能存在冲突,例如编解码器包。
猜你喜欢
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
相关资源
最近更新 更多