Элементы управления камерой вручную для записи видео

В этой статье показано, как использовать элементы управления устройствами вручную для включения расширенных сценариев захвата видео, включая видео и приоритет воздействия HDR.

Элементы управления видеоустройства, рассмотренные в этой статье, добавляются в приложение с помощью одного шаблона. Сначала проверьте, поддерживается ли элемент управления на текущем устройстве, на котором работает ваше приложение. Если элемент управления поддерживается, задайте нужный режим для элемента управления. Как правило, если определенный элемент управления не поддерживается на текущем устройстве, следует отключить или скрыть элемент пользовательского интерфейса, позволяющий пользователю включить эту функцию.

Все API управления устройствами, рассмотренные в этой статье, являются членами пространства имен Windows.Media.Devices.

using Windows.Media.Devices;

Примечание.

В этой статье рассматриваются основные понятия и код, описанные в разделе "Базовый" фото, видео и аудиозапись с помощью MediaCapture, в котором описаны шаги по реализации базового фото и видеозахвата. Рекомендуется ознакомиться с основным шаблоном захвата мультимедиа в этой статье, прежде чем перейти к более сложным сценариям захвата. В коде этой статьи предполагается, что приложение уже имеет экземпляр MediaCapture, который был правильно инициализирован.

Видео HDR

Функция видео с высоким динамическим диапазоном (HDR) применяет обработку HDR к видеопотоку устройства захвата. Определите, поддерживается ли видео HDR, выбрав свойство HdrVideoControl.Supported.

Элемент управления видео HDR поддерживает три режима: включено, выключение и автоматическое, что означает, что устройство динамически определяет, улучшит ли обработка видео HDR запись мультимедиа и, если да, включает видео HDR. Чтобы определить, поддерживается ли определенный режим на текущем устройстве, проверьте, содержит ли коллекция HdrVideoControl.SupportedModes нужный режим.

Включите или отключите обработку видео HDR, задав hdrVideoControl.Mode требуемому режиму. Для этого элемента управления требуется, чтобы поток был остановлен до установки режима, см . 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 позволяет приложению определить, поддерживается ли темпоральная деноизация на текущем устройстве и если да, то какие режимы деноизации поддерживаются. Доступные режимы деноизации: Off, On и Auto. Устройство может не поддерживать все режимы, но каждое устройство должно поддерживать функцию авто или отключение.

В следующем примере используется простой пользовательский интерфейс для предоставления переключателей, позволяющих пользователю переключаться между режимами деноизации.

<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;
        }
    }

}

Когда приложение включает обработку кадров, он устанавливает режим деноизации в значение Off , если этот режим поддерживается таким образом, чтобы обработка кадров могли использовать необработанные кадры, которые не были удалены.

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.