2. DirectShow-Hello-World

#include "dshow.h"
#include <cassert>
#pragma comment(lib,"Strmiids.lib")
int main()
{

    HRESULT hr = CoInitialize(NULL);
    if (FAILED(hr))
    {
        // Add error-handling code here. (Omitted for clarity.)
        return -1;
    }
    IGraphBuilder* pGraph;
    hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph);
    assert(SUCCEEDED(hr));
    // CLSID_FilterGraph CLSID类标识符。 Filter Graph 管理器由进程内 DLL 提供,因此执行上下文 CLSCTX_INPROC_SERVER。
    // 调用 CoCreateInstance 将返回 IGraphBuilder 接口,该接口主要包含用于生成 Filter Graph 的方法。
    IMediaControl* pControl;
    IMediaEvent* pEvent;
    hr = pGraph->QueryInterface(IID_IMediaControl, (void**)&pControl); 
    assert(SUCCEEDED(hr));
    hr = pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent); 
    assert(SUCCEEDED(hr));
    // 此示例需要另外两个接口:
    // IMediaControl 控件流式处理。 它包含用于停止和启动 Filter Graph 的方法。
    // IMediaEvent 具有从 Filter Graph 管理器获取事件的方法。 
    // 在此示例中, 接口用于等待播放完成。
    //不能播放mp4文件,缺少相应的库,只能播放avi
    hr = pGraph->RenderFile(L"D:/example.avi", NULL); 
    assert(SUCCEEDED(hr));
    // 现在,可以生成 Filter Graph。 对于文件播放,这是通过RenderFile完成的
    hr = pControl->Run(); 
    assert(SUCCEEDED(hr));
    // 筛选器图现在已准备好播放。 运行它。
    long evCode = 0;
    pEvent->WaitForCompletion(INFINITE, &evCode);
    // 筛选器图运行时,数据在筛选器中移动,并呈现为视频和音频。 
    // 播放发生在单独的线程上。 可以通过调用 IMediaEvent::WaitForCompletion 方法等待播放完成
    // 值 INFINITE 表示应用程序无限期地阻止,直到文件播放完毕。
    pControl->Release();
    pEvent->Release();
    pGraph->Release();
    CoUninitialize();
    // 应用程序完成后,释放接口指针并关闭 COM 库
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容