天天看點

50行代碼實作的一個最簡單的基于 DirectShow 的視訊播放器

本文介紹一個最簡單的基于 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

繼續閱讀