DirectShow 常見問題

本文會回答 Microsoft DirectShow 的許多常見問題。

DirectShow 支援哪些作業系統?

DirectShow 適用于所有支援的 Windows 版本。

我需要多少 COM 知識才能使用 DirectShow 進行程式設計?

針對應用程式開發,您必須瞭解使用 COM 物件的基本概念:如何具現化、存取它們公開的介面,以及管理這些介面上的參考計數。 篩選開發需要更多 COM 知識。

DirectShow 支援哪些格式?

是否有 DirectShow 硬體相容性清單 (HCL) ?

不會。 DirectShow 會使用 Microsoft DirectDraw 和 Microsoft DirectSound 硬體功能。 沒有特殊硬體可用時,DirectShow 會使用 GDI 來繪製視訊和 waveOut * 多媒體 API 來播放音訊。

我可以使用哪些語言來撰寫 DirectShow 應用程式?

DirectShow 主要是針對 C++ 開發所設計。 DirectShow API 的小型子集會透過 Visual Basic 6.0 公開;不過,此功能已被取代。

DirectShow 是否可透過 Managed 程式碼存取?

Microsoft 目前沒有實作受控 DirectShow API 的計畫。

DirectShow 開發需要哪些編譯器?

一旦編譯器的環境正確設定,任何能夠產生元件物件模型 (COM) 物件的編譯器都應該正常運作。

DirectShow 如何與 Microsoft DirectX 相關?

在內部,DirectShow 會在硬體支援 DirectSound 和 DirectDraw 時使用。 視訊轉譯器和重迭混音器篩選準則使用 DirectDraw 3 和 DirectDraw 5 表面。 視訊混合轉譯器 7 (Windows XP 僅) 使用 DirectDraw 7 表面。 影片混合轉譯器 9 和增強式視訊轉譯器會使用最新的 Microsoft Direct3D API。 您不需要使用其他 DirectX API 來撰寫 DirectShow 應用程式,雖然可以將它們合併。

DirectShow 如何與 Microsoft ActiveMovie 相關?

ActiveMovie 是 DirectShow 的原始名稱。 不再使用 ActiveMovie 一詞。

GraphEdit 公用程式的原始程式碼是否可用? GraphEdit 可以轉散發嗎?

否,來源無法使用,Graphedt.exe無法轉散發。

DMOs 是否取代 DirectShow 篩選?

Microsoft DirectX Media Objects (DMO) 可用於 DirectShow 應用程式中。 針對編碼器、解碼器和效果,建議您撰寫 DMO,而不是 DirectShow 篩選準則。 (注意:如果您想要在解碼器中使用 DirectX 視訊加速,您必須將它實作為 filter.) 針對其他用途,DirectShow 篩選可能更適當。 如需 DMO 的詳細資訊,請參閱 DirectX 媒體物件

我正在使用 Windows 媒體播放機 播放 AVI 格式檔案。 我可以聽到音訊,但似乎沒有任何視訊,我只會看到黑色。 出了什麼問題?

檔案可能是使用系統上不存在的編解碼器進行編碼。 雖然 AVI 檔案格式很常見,但可以使用許多不同的壓縮格式來建立 AVI 檔案, (編解碼器) 。 如果您嘗試播放使用不支援編解碼器的 AVI 檔案,您可能會聽到音訊元件,但視訊會顯示為黑色畫面,或螢幕內容會保持不變。

注意

Windows 媒體播放機通常會在系統上沒有編解碼器時,嘗試下載並安裝編解碼器。

 

如何?建置我的應用程式嗎? 我需要哪些程式庫和標頭檔?

請參閱 設定組建環境

GraphEdit 會顯示許多未記載的篩選準則。 這些篩選準則是什麼?

GraphEdit 會列舉在篩選類別中註冊于系統上的所有篩選。 這可能包括協力廠商應用程式所安裝的篩選,或由其他 Microsoft 技術安裝,例如 Windows Media 或 NetMeeting。 此外,某些 DirectShow 篩選會作為編解碼器或硬體裝置的包裝函式,而每個編解碼器或裝置都會顯示為不同的篩選準則。 NetMeeting 會使用 Microsoft H.263 Video Codec,且 DirectShow 不再支援。 如需詳細資訊,請參閱 列舉裝置和篩選

我在以程式設計方式建置自訂圖形時遇到問題。

請先嘗試使用 GraphEdit 建置篩選圖表。 此工具可讓您快速模擬許多可能性。 在嘗試使用原始程式碼建置圖形之前,GraphEdit 一律是測試圖形的絕佳位置。

如需圖形建置的詳細資訊,請參閱下列文章:

如何偵測是否已在指定的電腦上安裝 DirectShow?

呼叫 CoCreateInstance 以建立 Filter Graph 管理員的實例。 如果此呼叫成功,則會在電腦上安裝 DirectShow。 下列程式碼示範如何執行這項作業:

IGraphBuilder *pGraph;

HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
    NULL, CLSCTX_INPROC_SERVER,
    IID_IGraphBuilder, (void **) &pGraph);

如何?變更篩選準則的設定,而不顯示內容頁?

大部分篩選都會公開一或多個介面,以在篩選上設定屬性。 如需有問題的篩選,請參閱參考頁面。 (請參閱 DirectShow Filters.)

我可以使用 GraphEdit 測試篩選嗎?

當您開發篩選時,GraphEdit 可協助您視覺化篩選之間的連線。 它也可以提供篩選功能的快速測試。 不過,它並非強固的測試平臺。

篩選會執行哪些許可權通道?

篩選會在通道 3 執行,雖然有些篩選會控制在通道 0 上執行的串流裝置。 如需詳細資訊,請參閱 硬體裝置如何參與篩選圖表

我需要使用核心偵錯工具嗎?

這取決於您的特定專案。 安裝 DirectX 偵錯執行時間程式庫表示您正在安裝偵錯驅動程式和其他核心模式元件,而且如果您的應用程式在這些元件中造成偵錯判斷提示,除非您有連結至進程的核心偵錯工具,否則您的電腦會自動重新開機。

當我在偵錯工具中執行應用程式時,它會當機。

有些解碼器是設計為無法在應用程式附加至偵錯工具時運作。 請嘗試在偵錯工具外部執行應用程式。

DEFINE\_GUID 宏如何運作?

DEFINE_GUID宏可解決在原始程式碼中宣告 extern GUID 值參考的問題。 例如,假設您的專案有三個原始程式檔,Src1.cpp、Src2.cpp 和 Src3.cpp,而這三個檔案都使用您已定義的特定 GUID 值。 GUID 值必須在專案中確切定義一次,而其他原始程式檔必須宣告 extern 它的參考。 透過 DEFINE_GUID 宏,您可以針對這兩個用途使用相同的標頭檔。 在您的標頭檔中,宣告 GUID,如下所示:

DEFINE_GUID(CLSID_MyObject, 
0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);

(此範例有零時,請將實際的 GUID 值放入 。) 您可以使用 Guidgen.exe 公用程式來建立新的 GUID,並以 DEFINE_GUID 格式貼到標頭檔中。 在每個參考 GUID 的原始程式檔中包含此標頭檔。 在剛好其中一個原始程式檔中,在標頭檔之前包含標頭檔 Initguid.h。 例如:

// Src1.cpp
#include <initguid.h>
#include "MyGuids.h"

// Src2.cpp
#include "MyGuids.h"

// Src3.cpp
#include "MyGuids.h"

不論未包含 Initguid.h 標頭檔的位置, DEFINE_GUID 宏會 extern 建立 GUID 值的參考。 包含 Initguid.h 標頭檔時,它會重新定義 DEFINE_GUID 宏,以便 DEFINE_GUID 建立 GUID 的定義宣告。

如果您未在任何原始程式檔中包含 Initguid.h,您會收到連結錯誤「未解析的外部符號」。如果您針對相同的 GUID 包含 Initguid.h 兩次,您將會收到編譯錯誤「redefinition;多個初始化。」若要解決這些錯誤,請確定 Initguid.h 只包含一次。 此外,請勿在先行編譯標頭檔中包含 Initguid.h,因為實際上,先行編譯標頭檔會包含在每個原始程式檔中。

DirectShow 簡介