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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SpringCloud-OAuth2(二):實戰篇SpringGCCloudOAuth
- kubernetes實戰篇之dashboard搭建
- Java 8 Stream之實戰篇Java
- shiro實戰系列(二)之入門實戰續
- Flutter實戰之動畫實現篇Flutter動畫
- Flutter實戰之基本佈局篇Flutter
- .Net微服務實戰之DevOps篇微服務dev
- Flutter實戰之畫布使用篇Flutter
- kubernetes實戰篇之helm完整示例
- kubernetes實戰篇之helm使用技巧
- kubernetes實戰篇之helm安裝
- 介面自動化實戰之框架搭建框架
- 實戰篇:如何做好SOAP介面效能測試?
- Flutter完整開發實戰詳解(二、快速開發實戰篇)Flutter
- Docker小白到實戰之開篇概述Docker
- 持續整合之 Spring Boot 實戰篇Spring Boot
- aardio爬蟲) 實戰篇:逆向有道翻譯web介面爬蟲Web
- 基於 abp vNext 和 .NET Core 開發部落格專案 - 部落格介面實戰篇(二)
- 基於Python的介面自動化實戰-基礎篇之讀寫配置檔案Python
- 自定義View事件篇進階篇(二)-自定義NestedScrolling實戰View事件
- F5 api介面開發實戰手冊(二)API
- Java開發者的Python快速實戰指南:實用工具之PDF轉DOCX文件(視覺化介面)JavaPython視覺化
- 轉:AMS之dumpsys篇
- nginx基礎篇之虛擬主機實戰Nginx
- Flutter實戰之瞭解外掛(Plugins)功能篇FlutterPlugin
- python:實戰篇Python
- Flutter完整開發實戰詳解(二、 快速開發實戰篇) | 掘金技術徵文Flutter
- 資料分析從零開始實戰 | 基礎篇(二)
- 基於Python的介面自動化實戰-基礎篇之pymysql模組運算元據庫PythonMySql
- spring4.1.8擴充套件實戰之二:Aware介面揭祕Spring套件
- Python爬蟲入門實戰之貓眼電影資料抓取(實戰篇)Python爬蟲
- 淺談RASP技術攻防之實戰[程式碼實現篇]
- Java之實現多執行緒的方式二:實現Runnable介面Java執行緒
- Nuxt3實戰系列之網路請求篇UX
- 【進階篇】Redis實戰之Jedis使用技巧詳解Redis
- Linux效能優化實戰CPU篇之總結(四)Linux優化
- kubernetes實戰篇之docker映象的打包與載入Docker
- kubernetes實戰篇之helm填坑與基本命令
- 介面測試之DDT,純程式碼實戰,學起來