DirectShow 制作在Unity3D中可以設置進度的視頻播放插件


     如果想在Unity3D中去播放視頻文件,那么最方便的方法就是使用它自帶的MovieTexture. 可以實現簡單的視頻播放功能. Play Pause Stop. 有也只有這三個功能,  如果你想要一個進度條,並且可以隨意的拖拽視頻的進度的話, 那就不能滿足你的需求了.  所以想使用 DirectShow 這個視頻開發包.來實現我們的想法.

     這東西是基於COM組件的一套 C++ 開發庫. 所以花了兩天時間,各種Google. 把這個功能實現了, 在這里把流程記錄一下,做為備忘.

   DirectShow 是由各種的 過慮器(Filter) 及 接口(Interface) 組成的. 處理過程就是 根據你的需求,構建 Filter圖表,然后 使用 IMediaControl->Run() 方法.運行這個圖表,就可以了.我們這里的 圖表是這樣的 :

 

使用 FilterGraphManager 做為總的管理類.   所以一切的開始都要先 構建一個 IGraphBuilder : 創建 的方法與創建 IBaseFilter的方法相同 是這樣的:

1     // Initialize COM Libs *初始化COM庫 別忘了*
2     hr = CoInitialize(NULL);
3     // Filter Graph
4     hr = CoCreateInstance(
5         CLSID_FilterGraph,     // CLSID
6         NULL,
7         CLSCTX_INPROC_SERVER,  // SERVER
8         IID_IFilterGraph,      // IID (Interface ID)
9         (void**)&pGraph);      // var's Ptr


從過濾器(Filter)中,獲得接口的方法是這樣的:

 1 // Sample Grabber Filter 這是構建 ISampleGrabber 過濾器
 2     hr = CoCreateInstance(
 3         CLSID_SampleGrabber,     // 注意 CLSID的變化
 4         NULL,
 5         CLSCTX_INPROC_SERVER,
 6         IID_IBaseFilter,                // IID 為 IBaseFilter 
 7         (void**)&pGrabberF);
 8     // *將視頻捕捉Filter加入圖表*
 9     pGraph->AddFilter(pGrabberF,L"Sample Grabber");
10     
11         // *得到接口*
12     pGrabberF->QueryInterface(IID_ISampleGrabber,(void**)&pGrabber);

這是從FilterGraph 構建SourceFilter 也就是得到 源文件過濾器:

1 // 媒體文件 我們傳入的是 char* 字符串,這里需要轉化WCHAR 寬字節
2     TCHAR _fileName[MAX_PATH];
3     memset(_fileName,0,sizeof(_fileName));
4     MultiByteToWideChar(CP_ACP,0,fileName,strlen(fileName)+1,_fileName, sizeof(_fileName)/sizeof(_fileName[0]));  
5         // 這是 構建 源文件過濾器 Filter
6     hr = pGraph->AddSourceFilter(_fileName,L"Source Filter",&pSrc);

記錄的流程與代碼先寫這么多。。 自己寫的一個 VideoCapture 類,已經同步到百度雲了。 以后如果有疑問可以翻出來看看~~    都是記憶碎片呀~~ ^_^
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM