DirectShow之介面實戰篇(二) (轉)
DirectShow之介面實戰篇(二)
大體說來,一般使用DirectShow介面無非3個步驟,初始化介面,利用介面中的控制使用控制操作,最後釋放介面。(當然這裡假定你已經擁有了directshow.pas等必須單元,如果沒有的話請在網上查詢或者向我索要)(注:以下變數沒有定義,需自己定義使用)
1) 初始化介面部分
首先,需要定義需要使用的介面變數
GraphBuilder: IGraphBuilder;
MediaControl: IMediaControl;
MediaSeeking: IMediaSeeking;
MediaPosition: IMediaPosition;
MediaEventEx: IMediaEvent;
BasicAudio: IBasicAudio;
BasicVo: IBasicVideo;
VideoWindow: IVideoWindow;
SampleGrabber: ISampleGrabber;
VideoFrameStep: IVideoFrameStep;
(1)然後需要使用CoCreateInstance函式建立一個Filter Graph Manager 例項,CoCreateInstance(TGUID(CLSID_FilterGraph),nil, CLSCTX_INPROC_SERVER,
TGUID(IID_IGraphBuilder),GraphBuilder)
因為需要抓圖使用IsampleGrabber介面,需要建立SampleGrabber例項,
var Filter: IBaseFilter;
CoCreateInstance(CLSID_SampleGrabber, nil, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, Filter);
(2) QueryInterface函式獲取來獲取指標,好以後操作控制
Filter.QueryInterface(IID_ISampleGrabber, SampleGrabber);
GraphBuilder.AddFilter(Filter, 'Grabber');
GraphBuilder.QueryInterface(IID_IMediaControl, MediaControl);
GraphBuilder.QueryInterface(IID_IMediaPosition, MediaPosition);
GraphBuilder.QueryInterface(IID_IMediaSeeking, MediaSeeking);
GraphBuilder.QueryInterface(IID_IMediaEventEx, MediaEventEx);
GraphBuilder.QueryInterface(IID_IVideoFrameStep, VideoFrameStep);
GraphBuilder.QueryInterface(IID_IBasicAudio, BasicAudio);
GraphBuilder.QueryInterface(IID_IBasicVideo, BasicVideo);
GraphBuilder.QueryInterface(IID_IVideoWindow, VideoWindow);
當然為了起見,可以對以上每個過程進行是否成功判斷,給出資訊,否則很有可能出現問題找不到頭緒。好了,一切準備成功,就可以進入第三步,開始我們的控制操作了。
(3)透過介面提供的函式開始控制
哦,差點忘記一件重要的事情,在上面呼叫QueryInterface之前,還有兩件重要的事情要做,第一,要建立一個Unicode(wide character)字串,儲存名。
var _wfile: array[0..MAX_PATH - 1] of wchar;
MultiByteToWideChar(CP_ACP, 0, pChar(檔名), -1, @_wfile, MAX_PATH);
然後需要成功RenderFile才可以控制操作GraphBuilder.RenderFile(_wfile, nil);
:namespace prefix = o ns = "urn:schemas--com::office" />
當然在顯示的時候要把顯示窗體和關連起來,這裡需要透過IvideoWindow介面方法,VideoWindow. put_Owner(Edit1.Handle);
VideoWindow. put_tyle(DSVIDEO_WINDOW_CHILD_STYLE);
VideoWindow.SetWindowPosition(0,0, Edit1.ClientWidth, Edit1.ClientHeight);
得到圖象的一些必要資訊,使用IbasicVideo介面中的方法,一些變數自己定義,
BasicVideo.GetVideoSize(VideoWidth, VideoHeight);
BasicVideo.get_BitRate(VideoBitRate);
BasicVideo.get_AvgTimePerFrame(PerFrame);
得到當前檔案的總時間以及播放時間,需要使用ImediaSeeking介面方法,
MediaSeeking.GetDuration(Duration);//得到總時間
MediaSeeking.GetCurrentPosition(CurrentPos);//得到當前播放時間
也可以透過IMediaSeeking::SetPositions方法設定開始和結束時間。
哦,這裡得到的單位好像是毫米級的,可以自己轉化為秒級的.
還有,如果想以後能夠單幀控制播放,在這裡也需要設定播放格式為按幀播放。
MediaSeeking.SetTimeFormat(Time_Format_Frame);
播放,停止,暫停等控制
這些需要使用ImediaControl介面的方法,控制起來很簡單,分別為
MediaControl.Play;
MediaControl.Stop;
MediaControl.Pause;
未完待續
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-956601/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- DirectShow之介面實戰篇(一) (轉)
- DirectShow之介面實戰篇(三) (轉)
- DirectShow系列講座之二——Filter原理 (轉)Filter
- JBuilder9.0+Weblogic7.0實戰篇之Session Bean篇 (轉)UIWebSessionBean
- JBuilder9+Weblogic7實戰篇之工具篇(JDK) (轉)UIWebJDK
- DirectShow系列講座之一——DirectShow系統概述 (轉)
- 機器學習實戰之開篇機器學習
- 足球戰術之Builder篇 (轉)UI
- JBuilder9+Weblogic7實戰篇之工具篇(Weblogic) (轉)UIWeb
- JBuilder9+Weblogic7實戰篇之Filter運用篇 (轉)UIWebFilter
- JBuilder9+Weblogic7實戰篇之工具篇(JDBC 2) (轉)UIWebJDBC
- JBuilder9+Weblogic7實戰篇之工具篇(JDBC 1) (轉)UIWebJDBC
- 【GNU/Linux實戰手記之Emacs篇 上】 (轉)LinuxMac
- GNU/Linux實戰手記之基本操作篇 (轉)Linux
- Flutter實戰之動畫實現篇Flutter動畫
- Java 8 Stream之實戰篇Java
- JBuilder9.0+Weblogic7.0實戰篇之JSP+SERVLET篇 (轉)UIWebJSServlet
- JBuilder9+Weblogic7實戰篇之JSP使用JDBC篇 (轉)UIWebJSJDBC
- 足球戰術之adapter篇 (轉)APT
- Ant實戰篇 (一)(3) (轉)
- Ant實戰篇 (一)(4) (轉)
- 【GNU/Linux實戰手記之安裝配置篇】 (轉)Linux
- SpringCloud-OAuth2(二):實戰篇SpringGCCloudOAuth
- App專案實戰之路(二):API篇APPAPI
- JBuilder9+Weblogic7實戰篇之Entity Bean運用篇(一) (轉)UIWebBean
- JBuilder9+Weblogic7實戰篇Entity Bean運用(二) (轉)UIWebBean
- Flutter實戰之畫布使用篇Flutter
- Flutter實戰之基本佈局篇Flutter
- shiro實戰系列(二)之入門實戰續
- 實戰篇:如何做好SOAP介面效能測試?
- 介面自動化實戰之框架搭建框架
- Flutter完整開發實戰詳解(二、快速開發實戰篇)Flutter
- 足球戰術之observer及memento篇 (轉)Server
- .Net微服務實戰之DevOps篇微服務dev
- kubernetes實戰篇之dashboard搭建
- Docker小白到實戰之開篇概述Docker
- JBuilder9+Weblogic7實戰篇之工具篇(ORACLE9i安裝) (轉)UIWebOracle
- DirectShow Utility