本文介紹一個最簡單的基于 DirectShow 的視訊播放器。該播放器對于初學者來說是十分有用的,它包含了使用 DirectShow 播放視訊所有必備的函數。
直接貼上代碼,具體代碼的含義都寫在注釋中了:
/* 雷霄骅
* 中國傳媒大學/數字電視技術
* [email protected]
*
*/
// aviplayer.cpp : 定義控制台應用程式的入口點。
#include "stdafx.h"
#include <dshow.h>
// 用到的DirectShow SDK連結庫
#pragma comment(lib,"strmiids.lib")
int _tmain(int argc, _TCHAR* argv[])
{
IGraphBuilder *pGraph = NULL;
IMediaControl *pControl = NULL;
IMediaEvent *pEvent = NULL;
// 初始化COM庫.
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
printf("錯誤 - 無法初始化 COM 元件");
return -1;
}
// 建立濾波器圖表管理器
hr=CoCreateInstance(CLSID_FilterGraph, NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder, (void **)&pGraph);
if (FAILED(hr))
{
printf("錯誤 - 無法建立 Filter Graph Manager.");
return -1;
}
// 查詢媒體控制和媒體事件接口
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
// 建立圖表,在這裡你可以更改待播放的檔案名稱
hr = pGraph->RenderFile(L"E:\\movie\\外婆.VOB", NULL);
if (SUCCEEDED(hr))
{
// 運作圖表.
hr = pControl->Run();
if (SUCCEEDED(hr))
{
//等待回放結束事件.
long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);
// 切記: 在實際應用當中,不能使用INFINITE辨別, 因為它會不确定的阻塞程式
}
}
// 釋放所有資源和關閉COM庫
pControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();
return 0;
}
源代碼下載下傳(VC2010): http://download.csdn.net/detail/leixiaohua1020/6456581