#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 库
}
2. DirectShow-Hello-World
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 2.1输出一个Hello World 学习编程的第一步,就是写一个最简单的程序,先让它跑起来,运行起来,然后再不断...
- 一.视图组件 GLSurfaceView Android上用于显示OpenGL视图,一般是使用GLSurfaceV...
- 1. 新建测试程序(官网提供): `consthttp=require('http') consthostname...
- function与procedure的区别 在Oracle的function中是只能读取table中的数据,不能修...
- Task 2. Hello World 学习目标 初步接触 Linux/Python/Flask 学会使用 Lin...