視訊功能
[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]
IAMStreamConfig::GetStreamCaps方法會在一組AM_MEDIA_TYPE和VIDEO_STREAM_CONFIG_CAPS結構中呈現視訊功能。 您可以使用這個來公開針腳上支援的所有格式和解析度,如下所述。
如需 GetStreamCaps的音訊相關範例,請參閱 音訊功能。
假設您的擷取卡支援 JPEG 格式,解析度介於 160 x 120 圖元到 320 x 240 圖元之間。包含。 支援解析度之間的差異在此案例中是一種,因為您新增或減去每個支援解析度的一個圖元,以取得下一個支援的解析度。 支援的解析度差異稱為資料細微性。
假設您的卡片也支援 640 x 480 的大小。 以下說明這個單一解析度和上述解析度範圍, (160 x 120 圖元到 320 x 240 圖元之間的所有大小) 。
此外,假設它支援 24 位色彩 RGB 格式,解析度介於 160 x 120 和 320 x 240 之間,但細微性為 8。 下圖顯示此案例中的一些有效大小。
若要將其設為另一種方式,並列出更多解析度,以下是有效解析度的清單。
- 160 x 120
- 168 x 120
- 168 x 128
- 176 x 128
- 176 x 136
- ...其他解析度...
- 312 x 232
- 320 x 240
使用 GetStreamCaps 來公開這些色彩格式和維度功能,方法是提供 320 x 240 JPEG (的媒體類型,如果這是您的預設大小或慣用大小) 搭配最小功能 160 x 120、最大 320 x 240 的功能,以及 1 的細微性。 您使用 GetStreamCaps 公開的下一個配對是 640 x 480 JPEG 的媒體類型,結合至少 640 x 480,且最大為 640 x 480 且細微性為 0。 第三組包含 320 x 240、24 位 RGB 的媒體類型,最小功能為 160 x 120、最大功能為 320 x 240,以及 8 的細微性。 如此一來,您幾乎可以發佈卡片可能支援的每個格式和功能。 必須知道您提供哪些壓縮格式的應用程式可以取得所有配對,並列出媒體類型的所有唯一子類型。
篩選會分別從 VIDEOINFOHEADER 結構的 rcSource 和 rcTarget 成員取得其媒體類型來源和目標矩形。 篩選不需要支援來源和目標矩形。
在 IAMStreamConfig檔中描述的裁剪矩形,與輸出針腳的VIDEOINFOHEADER結構的rcSource矩形相同。
整個 IAMStreamConfig檔中所述的輸出矩形與輸出針腳的 BITMAPINFOHEADER結構的biWidth和biHeight成員相同, (請參閱AVI 檔案格式的 DV 資料。) 。
如果篩選的輸出釘選連接到具有無空來源和目標矩形的媒體類型,則需要您的篩選,才能將輸入格式的來源子物件延伸至輸出格式的目標子物件。 來源子目錄會儲存在 VIDEO_STREAM_CONFIG_CAPS 結構的 InputSize 成員中。
例如,請考慮下列視訊壓縮案例:輸入影像採用 RGB 格式,大小為 160 x 120 圖元。 來源矩形的左上角是座標 (20,20) ,而右下角則位於 (30,30) 。 輸出影像採用 MPEG 格式,大小為 320 x 240。 目標矩形的左上角位於 (0,0) ,而右下角則位於 (100,100) 。 在此情況下,篩選應該採用 10 x 10 x 10 的 160 x 120 RGB 來源點陣圖,並使它填滿 320 x 240 點陣圖的前 100 x 100 個區域,讓其餘的 320 x 240 點陣圖保持不變。 下圖顯示此案例。
篩選準則可能不支援此專案,而且無法與 rcSource 和 rcTarget 不是空的媒體類型連線。
VIDEOINFOHEADER結構會公開篩選資料速率功能的相關資訊。 例如,假設您已將輸出釘選連接到具有特定媒體類型的下一個篩選, (直接或使用 CMediaType::SetFormat 函式所傳遞的媒體類型) 。 查看該媒體類型VIDEOINFOHEADER格式結構的dwBitRate成員,以查看您應該壓縮視訊的資料速率。 如果您在 VIDEOINFOHEADER 結構的 AvgTimePerFrame 成員中,將每一畫面的時間單位單位數乘以 dwBitRate 成員中的資料速率,並將 10,000,000 (每秒的單位數) ,您可以找出每個畫面應該有多少個位元組。 您可以產生較小的框架,但永遠不會產生較大的框架。 若要判斷視訊設備或擷取篩選器的畫面播放速率,請使用輸出釘選媒體類型的 AvgTimePerFrame 。