DirectShow之介面實戰篇(二) (轉)

amyz發表於2007-08-14
DirectShow之介面實戰篇(二) (轉)[@more@]

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章