用于视频捕获的手动相机控件

本文介绍如何使用手动设备控件实现增强的视频捕获方案,包括 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 起,可在支持临时降噪的设备上为视频启用此功能。 此功能实时融合来自多个相邻帧的图像数据,生成视觉噪音较少的视频帧。

应用可通过 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;
}

应用禁用帧处理后,会根据设备支持的模式将降噪模式设置为自动

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 处理媒体帧