Windows Vista 中的 DVD 播放增強功能

[與此頁面相關聯的功能, DirectShow 是舊版功能。 它已被媒體播放程式 、IMFMediaEngine 媒體基金會 的音訊/視訊擷取所取代 。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft 強烈建議新程式碼盡可能使用 Media Foundation 中的 MediaPlayer IMFMediaEngine 音訊/視訊擷取,而不是 DirectShow 。 Microsoft 建議將使用舊版 API 的現有程式碼重寫為盡可能使用新的 API。]

本節說明 Windows Vista 中 DVD 播放和流覽的改善。

指定解碼器

在舊版 DirectShow 中,建置 DVD 播放圖形時,很難指定特定的 MPEG-2 解碼器。 從 Windows Vista 開始,應用程式可以指定解碼器,如下所示:

  1. 在呼叫 IDvdGraphBuilder::RenderDvdVideoVolume 之前,將解碼器新增至圖形。
  2. 呼叫 RenderDvdVideoVolume 並設定AM_DVD_DO_NOT_CLEAR旗標。 DVD 導覽器會提供您新增之解碼器的喜好設定。

支援增強式視訊轉譯器

建議針對 Windows Vista 或更新版本撰寫的應用程式使用 增強式視訊轉譯器 (EVR) 來播放視訊。 若要在 DVD 播放應用程式中使用 EVR,請在呼叫 RenderDvdVideoVolume 時設定AM_DVD_EVR_ONLY旗標。

若要在建置圖形之前設定 EVR,請呼叫 IDvdGraphBuilder::GetDvdInterface 並查詢 IEVRFilterConfig IMFVideoRenderer 介面。 (這些介面記載于 Media Foundation SDK 檔中。如需在 DVD 播放圖形中設定視訊轉譯器的詳細資訊,請參閱 建置 DVD 篩選圖形

除非解碼器的 IAMDecoderCaps::GetDecoderCaps 方法傳回AM_GETDECODERCAP_QUERY_EVR_SUPPORT旗標,否則 DVD 導覽器將不會使用 EVR。 此旗標已定義,以確保應用程式與現有的解碼器相容。 如果 RenderDvdVideoVolume 使用AM_DVD_EVR_ONLY旗標失敗,請再次呼叫 方法而不使用 旗標,回到另一個視訊轉譯器。

平滑反向播放

DVD 導覽器現在可以執行順暢的反向播放。 在順暢的反向播放中,DVD 導覽器會將整個視訊物件單位 (VOU) 傳送至解碼器,解碼器會以反向順序發出畫面。 此功能需要解碼器支援順暢的反向播放。

當應用程式將播放速度設定為負值時,DVD 導覽器會查詢AM_RATE_ReverseMaxFullDataRate 屬性的 解碼器。 這個屬性的值是最大反向速度 x 10000 的絕對值。 例如,如果反向速度上限為 -2.0,則值為 20000。

如果視訊解碼器支援 屬性,DVD 導覽器會使用平滑反向播放。 如果音訊解碼器支援 屬性,則會反向播放音訊資料流程;否則,音訊資料流程會設為靜音。 如果視訊解碼器不支援 屬性,或播放速率超過視訊解碼器的最大反向速率,DVD 導覽器會切換為 掃描模式 。 在掃描模式中,DVD 導覽器只會將 I 畫面傳送至解碼器,並卸載所有 B 和 P 畫面格。

在順暢的反向播放期間,DVD 導覽器會將完整的 VOBU 傳送至解碼器。 DVD 導覽器會以反向順序傳送 VOBU,但會以一般轉寄順序傳送每個 VOBU 內的畫面。 在每個 VOBU 開始時,DVD 導覽器會在範例上設定AM_ReverseBlockStart旗標。 在 VOBU 結尾,DVD 導覽器會傳送具有 AM_ReverseBlockEnd 旗標的空白範例。 若要擷取這些旗標,請在範例上呼叫 IMediaSample2::GetProperties 旗標是在 AM_SAMPLE2_PROPERTIES 結構的 dwTypeSpecificFlags 成員中 設定。

解碼器會快取影片資料,直到它收到具有 AM_ReverseBlockEnd 旗標的範例為止。 此時,解碼器會以反向順序傳遞解碼的畫面。 例如,如果 VOBU 1 包含畫面 1-4,而 VOBU 2 包含畫面 5-8,DVD 導覽器會依下列順序傳送畫面:

(封鎖開始)F5 F6 F7 F8 (區塊結束) (區塊開始) F1 F2 F3 F4 (區塊結束)

解碼器應該處理框架,如下所示:

  1. 解碼 VOBU 2。
  2. 輸出畫面:F8 F7 F6 F5
  3. 解碼 VOBU 1。
  4. 輸出畫面:F4 F3 F2 F1

DVD 導覽器會在此範例中設定 VOBU 第一個範例的時間戳記(在此範例中為 F1 和 F5),但時間戳記包含區塊開頭的呈現時間,因此解碼器應該將此時間套用至區塊中的最後一個樣本(F4 和 F8)。 在反向播放期間,簡報時間增加。

VOBU 通常最多包含 42 個畫面格,而且可能包含一組以上的圖片 (GOP)。 若要讓整個 VOBU 解碼,解碼器應該快取解碼的 I 和 P 畫面格。 DVD 上的 VOB 不是關閉 GOP,因此 GOP 內的 B 框架可能需要解碼先前 GOP 中的所有參考畫面。 如果解碼器沒有足夠的表面來保存所有已解碼的畫面,可能需要重新解碼選取的畫面。

速率變更

根據預設,DVD 導覽器會在速率變更之間排清圖表。 不過,如果解碼器支援 AM_RATE_ResetOnTimeDisc 屬性,DVD 導覽器將不會排清圖形,導致播放速率之間的轉換更順暢。

不論實際播放速度為何,DVD 導覽器一律會以 1 倍的速度播放時間戳記範例。 解碼器必須調整已解碼樣本上的時間戳記,以符合實際播放速度。 (如需詳細資訊,請參閱 AM_RATE_SimpleRateChange 屬性 。)因此,當以 1 倍以外的速度播放時,已解碼畫面格上的時間戳記會與編碼畫面上的時間戳記相去。 每當 DVD 導覽器在範例上設定AM_SAMPLE_TIMEDISCONTINUITY旗標時,解碼器應該重新同步處理其時間戳記。 換句話說,解碼的框架應該具有與輸入框架相同的時間戳記。 若要擷取AM_SAMPLE_TIMEDISCONTINUITY旗標,請在範例上呼叫 IMediaSample2::GetProperties 旗標是在 AM_SAMPLE2_PROPERTIES 結構的 dwSampleFlags 成員中 設定。

電源管理

在 Windows Vista 中,DVD 導覽器可讓您改善電源管理:

  • 較高的計時器解析度
  • 較大的資料快取

計時器解析度 :應用程式可以藉由呼叫 timeBeginPeriod 函式來要求最小計時器解析度。 更高解析度(較短的期間)會增加系統對定期事件的回應性,例如逾時,但也會增加執行緒內容切換的頻率。

根據預設,DirectShow 中的參考時鐘會將計時器解析度設定為 1 毫秒。 在該解決方案中,CPU 將不會進入任何省電模式。 從 Windows Vista 開始,DVD 導覽器會藉由在參考時鐘上呼叫 IReferenceClockTimerControl::SetDefaultTimerResolution 來覆寫參考時鐘的預設行為。 這會移除 1 毫秒計時器解析度的時鐘要求。 這可能會讓 CPU 進入省電模式。

計時器解析是全域設定;Windows 會挑選要求最低的值。 影片混合轉譯器 (VMR) 篩選器 (VMR-7 和 VMR-9) 會將計時器解析度設定為 1 毫秒。 EVR 通常會根據桌面組合是否啟用,以及 EVR 是否處於全螢幕模式,將解析度設定為介於 4 到 8 毫秒之間的值。 其他應用程式也可能設定解析度。

快取大小 :應用程式可以在 IDvdControl2::SetOption 方法中 設定 DVD_CacheSizeInMB 選項,以指定 DVD 導覽器快取的資料量。 如果應用程式將此旗標設定為較大的值( > 50 MB),DVD 磁片磁碟機可能會在初始預先擷取後加速,視硬體而定,這可能會降低耗電量。

DVD 應用程式