刚接触 DirectShow ,现在正在开始学习,将一些学习过程中的体会和学习过程记录下来,方便以后查看。
其中有什么错误的地方,希望大家多多指教。
第一个程序:一个简单的 win32 控制台应用程序,实现功能为播放指定的视频文件,如无法播放视频,请修改播放文件。
程序中三个注意的地方:1.确保已安装 DirectShow ,我的是 win7 ,系统默认自带了 DirectShow 。
2.程序为 Debug 版本,请确保以 Debug 方式编译 BaseClasses (Samples\C++\DirectShow\BaseClasses)工程,并将生成的 strmbasd.lib拷贝 到工程目录下,也可以去以下地址下载:
http://download.youkuaiyun.com/detail/wangchao1988ok/6026803
3.修改播放文件路径
源代码:
#include <DShow.h>
#pragma comment(lib, "strmbasd.lib")
#define SAFE_RELEASE(filter) { if(NULL != filter) { filter->Release(); filter = NULL; } }
void main()
{
IGraphBuilder *pGraphBuilder = NULL; //Filter graph管理器
IMediaControl *pMediaControl = NULL; //控制视频/音频的播放、暂停与停止
IMediaEvent *pMediaEvent = NULL; //捕获播放过程中的事件
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraphBuilder);
if(FAILED(hr)) { printf("CoCreateInstance Failed!\n"); goto __exit; }
hr = pGraphBuilder->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);
if(FAILED(hr)) { printf("Query Media Control Interface Failed!\n"); goto __exit; }
hr = pGraphBuilder->QueryInterface(IID_IMediaEvent, (void **)&pMediaEvent);
if(FAILED(hr)) { printf("Query Media Event Interface Failed!\n"); goto __exit; }
hr = pGraphBuilder->RenderFile(L"D:\\test.avi", NULL); //自行修改待播放的视频文件
if(FAILED(hr)) { printf("RenderFile Failed!\n"); goto __exit; }
hr = pMediaControl->Run();
if(FAILED(hr)) { printf("Run Failed!\n"); goto __exit; }
long code = 0;
hr = pMediaEvent->WaitForCompletion(INFINITE, &code); //等待视频播放完毕
if(FAILED(hr)) { printf("WaitForCompletion Failed!\n"); goto __exit; }
__exit:
SAFE_RELEASE(pMediaEvent);
SAFE_RELEASE(pMediaControl);
SAFE_RELEASE(pGraphBuilder);
CoUninitialize();
system("pause");
}