視訊擷取的手動相機控制項
本文示範如何使用手動裝置控制項來啟用增強的影片擷取案例,包括 HDR 影片和曝光優先順序。
本文所討論的影片裝置控制項全都會使用相同的模式新增至您的應用程式。 首先,請檢查您的應用程式執行所在的目前裝置是否支援控制項。 如果支援控制項,請設定控制項所需的模式。 一般而言,如果目前裝置不支援特定控制項,您應該停用或隱藏允許使用者啟用功能的 UI 元素。
本文所討論的所有裝置控制 API 都是 Windows.Media.Devices 命名空間的成員。
using Windows.Media.Devices;
注意
本文以使用 MediaCapture 進行基本相片、視訊和音訊的擷取中所討論的概念和程式碼為基礎,說明實作基本相片和視訊擷取的步驟。 我們建議您先熟悉該文章中的基本媒體擷取模式後,再繼續進行更進階的擷取案例。 本文中的程式碼假設您的應用程式已經有已正確初始化的 MediaCapture 執行個體。
HDR 視訊
高動態範圍 (HDR) 影片功能會將 HDR 處理套用至擷取裝置的影片串流。 透過選取 HdrVideoControl.Supported 屬性來決定是否支援 HDR 影片。
HDR 影片控制項支援三種模式:開啟、關閉和自動,這表示裝置會動態判斷 HDR 影片處理是否會改善媒體擷取,如果是的話,會啟用 HDR 影片。 若要確定目前裝置是否支援特定模式,請檢查 HdrVideoControl.SupportedModes 集合是否包含所需的模式。
透過將 HdrVideoControl.Mode 設定為所需模式來啟用或停用 HDR 影片處理。 此控制項要求在設定模式之前串流處於停止狀態,請參閱 KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOHDR。
private void SetHdrVideoMode(HdrVideoMode mode)
{
if (!_mediaCapture.VideoDeviceController.HdrVideoControl.Supported)
{
ShowMessageToUser("HDR Video not available");
return;
}
var hdrVideoModes = _mediaCapture.VideoDeviceController.HdrVideoControl.SupportedModes;
if (!hdrVideoModes.Contains(mode))
{
ShowMessageToUser("HDR Video setting not supported");
return;
}
_mediaCapture.VideoDeviceController.HdrVideoControl.Mode = mode;
}
曝光優先順序
ExposurePriorityVideoControl 啟用後,會評估來自擷取裝置的影片畫面幀,以確定影片是否正在擷取低光場景。 如果是,控制項會降低所擷取影片的畫面速率,以增加每個畫面的曝光時間,並改善所擷取視訊的視覺品質。
透過檢查 ExposurePriorityVideoControl.Supported 屬性來確定目前裝置是否支援曝光優先順序控制項。
透過將 ExposurePriorityVideoControl.Enabled 設定為所需模式來啟用或停用曝光優先順序控制項。
if (!_mediaCapture.VideoDeviceController.ExposurePriorityVideoControl.Supported)
{
ShowMessageToUser("Exposure priority not available");
return;
}
_mediaCapture.VideoDeviceController.ExposurePriorityVideoControl.Enabled = true;
時間去雜訊
從 Windows 10 版本 1803 開始,您可以針對支援 Windows 10 的裝置上的影片啟用時間去雜訊。 這項功能會即時將來自多個相鄰畫面的影像資料融合在一起,以產生較少視覺雜訊畫面。
VideoTemporalDenoisingControl 讓您的應用程式確定目前裝置是否支援時間去雜訊,如果支援,則支援哪些去雜訊模式。 可用的去雜訊模式有關閉、開啟和自動。裝置可能不支援所有模式,但每個裝置都必須支援自動或開和關。
下列範例會使用簡單的 UI 來提供選項按鈕,讓使用者在去雜訊模式之間切換。
<StackPanel Orientation="Vertical" HorizontalAlignment="Right" >
<StackPanel x:Name="denoiseControls" Visibility="Collapsed">
<TextBlock>Temporal Denoising</TextBlock>
<RadioButton x:Name="denoiseOffButton" Checked="denoiseButton_Checked"
GroupName="Denoise Group" Content="Off"/>
<RadioButton x:Name="denoiseOnButton" Checked="denoiseButton_Checked"
GroupName="Denoise Group" Content="On" Visibility="Collapsed"/>
<RadioButton x:Name="denoiseAutoButton" Checked="denoiseButton_Checked"
GroupName="Denoise Group" Content="Auto" Visibility="Collapsed"/>
</StackPanel>
</StackPanel>
在以下方法中,檢查 VideoTemporalDenoisingControl.Supported 屬性以查看目前裝置是否支援時間去雜訊。 如果是這樣,那麼我們檢查以確保支援關和自動或開,在這種情況下,我們使選項按鈕可見。 接下來,如果支援這些方法,自動和開按鈕將變得可見。
private void UpdateDenoiseCapabilities()
{
if (_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Supported)
{
IReadOnlyList<VideoTemporalDenoisingMode> modes = _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes;
if(modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Off) &&
(modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.On) ||
modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Auto)))
{
denoiseControls.Visibility = Visibility.Visible;
if (modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.On))
{
denoiseOnButton.Visibility = Visibility.Visible;
}
if (modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Auto))
{
denoiseAutoButton.Visibility = Visibility.Visible;
}
}
}
}
在選項按鈕的 Checked 事件處理常式中,會檢查按鈕的名稱,並透過設定 VideoTemporalDenoisingControl.Mode 屬性來設定對應的模式。
private void denoiseButton_Checked(object sender, RoutedEventArgs e)
{
var button = sender as RadioButton;
if(button.Name == "denoiseOffButton")
{
_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.Off;
}
else if (button.Name == "denoiseOnButton")
{
_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.On;
}
else if (button.Name == "denoiseAutoButton")
{
_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.Auto;
}
}
在處理畫面時停用時間去雜訊
使用時間去雜訊處理的影片可以更悅目。 但是,由於時間去雜訊會影響影像一致性並減少畫面中的詳細資料數量,因此對畫面執行影像處理 (例如註冊或光學字元辨識) 的應用程式可能希望在啟用影像處理時以程式設計方式停用去雜訊。
下列範例會決定支援哪些去雜訊模式,並將這項資訊儲存在一些類別變數中。
private bool _isVideoTemporalDenoisingOffSupported = false;
private bool _isProcessing = false;
private Windows.Media.Devices.VideoTemporalDenoisingMode? _videoDenoisingEnabledMode = null;
private void ConfigureDenoiseForFrameProcessing()
{
if (_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Supported)
{
// Query support for the VideoTemporalDenoising control Off mode
_isVideoTemporalDenoisingOffSupported = _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Off);
// Query support for a mode that would enable VideoTemporalDenoising (On or Auto) and toggle it if supported
if (_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.On))
{
_videoDenoisingEnabledMode = Windows.Media.Devices.VideoTemporalDenoisingMode.On;
_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
}
else if (_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Auto))
{
_videoDenoisingEnabledMode = Windows.Media.Devices.VideoTemporalDenoisingMode.Auto;
_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
}
}
}
當應用程式啟用畫面處理時,如果支援該模式,它會將去雜訊模式設為關閉,以便畫面處理可以使用尚未去雜訊的原始畫面。
public void EnableFrameProcessing()
{
// Toggle Off VideoTemporalDenoising
if (_isVideoTemporalDenoisingOffSupported)
{
_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.Off;
}
_isProcessing = true;
}
當應用程式停用畫面處理時,它會根據支援的模式,將取消通知模式設定為 On 或 Auto。
public void DisableFrameProcessing()
{
_isProcessing = false;
// If a VideoTemporalDenoising mode to enable VideoTemporalDenoising is supported, toggle it
if (_videoDenoisingEnabledMode != null)
{
_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
}
}
有關獲取影片畫面以進行影像處理的更多資訊,請參閱使用 MediaFrameReader 處理媒體畫面。