首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# DirectShow 開發環境建置:COM 元件轉換與核心介面速查

     編輯:關於C#

前言

DirectShow 是 Windows 多媒體串流架構,核心元件位於 C:\Windows\System32\quartz.dll。C# 專案需將此 COM 類型庫轉換為 .NET 組件(Interop 組件)才能引用。本文記錄完整建置步驟與常用介面對照表。

一、環境建置步驟

1. 使用 TlbImp.exe 轉換類型庫

工具路徑(視 VS 安裝位置而定):

D:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\TlbImp.exe

2. 執行轉換指令

TlbImp C:\Windows\System32\quartz.dll /out:QuartzDirectShow.dll
  • 在「開發人員命令提示字元」或設定好 PATH 的 CMD 執行
  • 成功會在當前目錄產生 QuartzDirectShow.dll

3. 專案加入參考

  1. VS 選單:專案 → 加入參考
  2. 選擇 瀏覽 索引標籤,定位至 QuartzDirectShow.dll
  3. 確定加入

4. 程式碼引入命名空間

using QuartzDirectShow; // 或 quartzDriectShow(視轉換時大小寫)

二、DirectShow 核心介面速查表

介面用途關鍵方法/屬性
IFilterGraph基本濾鏡圖管理AddFilter, RemoveFilter, Connect, EnumFilters
IFilterGraph2增強版濾鏡圖AddSourceFilterForMoniker, ReconnectEx
IGraphBuilder手動/自動建構濾鏡圖RenderFile, Render, ConnectDirect
IMediaControl串流播放控制Run, Stop, Pause, GetState
IMediaEvent播放事件通知GetEventHandle, WaitForCompletion, FreeEventParams
IMediaEventEx擴展事件視窗SetNotifyWindow, SetNotifyFlags
IMediaPosition時間基準位置/速度控制CurrentPosition, StopTime, Rate, put_CurrentPosition
IMediaSeeking進階位置/速度控制SetPositions, GetDuration, GetCurrentPosition, SetRate
IBasicAudio音量/平衡控制Volume, Balance
IBasicVideo影像屬性查詢VideoWidth, VideoHeight, BitRate, BitErrorRate
IVideoWindow視訊視窗控制Owner, WindowStyle, SetWindowPosition, put_Caption
ISampleGrabber影格擷取/截圖SetCallback, GetCurrentBuffer, SetBufferSamples
IVideoFrameStep單步幀控制Step, CanStep, CancelStep

三、開發三步驟法

  1. 初始化介面:CoCreateInstance 建立 Filter Graph Manager,QueryInterface 取得所需介面
  2. 呼叫控制函式:透過介面方法操作串流(載入檔案、播放、暫停、求位、截圖等)
  3. 釋放介面:Marshal.ReleaseComObject 或 RCW 自然回收,確保資源釋放

四、常見陷阱與提示

  • x64 相容性:DirectShow 為 32 位元元件,專案需設定 Prefer 32-bit 或目標平台 x86
  • 編解碼器:播放特定格式需系統安裝對應解碼器(如 LAV Filters、ffdshow)
  • 事件處理:IMediaEvent 需配合視窗訊息迴圈或 WaitForCompletion 取得事件
  • 替代方案:現代專案建議考慮 MediaFoundation、LibVLCSharp、FFmpeg.NET 等跨平台庫

五、最小化播放範例架構

// 1. 建立 Graph Builder
IGraphBuilder graph = (IGraphBuilder)new FilterGraph();

// 2. 載入媒體檔
graph.RenderFile(@"C:\Video\sample.mp4", null);

// 3. 取得控制介面
IMediaControl control = (IMediaControl)graph;
IVideoWindow vw = (IVideoWindow)graph;

// 4. 設定視訊視窗
vw.Owner = this.Handle; // WinForm 控制項 Handle
vw.WindowStyle = 0x40000000 | 0x10000000; // WS_CHILD | WS_CLIPCHILDREN
vw.SetWindowPosition(0, 0, this.Width, this.Height);

// 5. 播放
control.Run();

// 6. 釋放(FormClosing 事件中)
control.Stop();
Marshal.ReleaseComObject(vw);
Marshal.ReleaseComObject(control);
Marshal.ReleaseComObject(graph);

提示: 實際專務建議封裝為 IDisposable 元件,統一管理 COM 物件生命週期。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved