Поделиться через


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

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

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

Замечание

В этой статье рассматриваются основные понятия и код, описанные в разделе "Базовый" фото, видео и аудиозапись с помощью 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 (!m_mediaCapture.VideoDeviceController.HdrVideoControl.Supported)
    {
        tbStatus.Text = "HDR Video not available";
        return;
    }

    var hdrVideoModes = m_mediaCapture.VideoDeviceController.HdrVideoControl.SupportedModes;

    if (!hdrVideoModes.Contains(mode))
    {
        tbStatus.Text = "HDR Video setting not supported";
        return;
    }

    m_mediaCapture.VideoDeviceController.HdrVideoControl.Mode = mode;
}

Приоритет воздействия

Функция ExposurePriorityVideoControl, если включена, оценивает видеокадры с устройства захвата, чтобы определить, захватывает ли видео низкую световую сцену. Если это так, элемент управления снижает частоту кадров захваченного видео, чтобы увеличить время экспозиции для каждого кадра и улучшить визуальное качество захваченного видео.

Определите, поддерживается ли элемент управления приоритетом экспозиции на текущем устройстве, проверив свойство ExposurePriorityVideoControl.Supported .

Включите или отключите элемент управления приоритетом экспозиции, установив параметр ExposurePriorityVideoControl.Enabled в нужном режиме.

if (!m_mediaCapture.VideoDeviceController.ExposurePriorityVideoControl.Supported)
{
    tbStatus.Text = "Exposure priority not available";
    return;
}
m_mediaCapture.VideoDeviceController.ExposurePriorityVideoControl.Enabled = true;

Временное шумоподавление

Начиная с Windows 10 версии 1803, вы можете включить временное снижение шумов видео на тех устройствах, которые поддерживают эту функцию. Эта функция сливает данные изображения из нескольких смежных кадров в режиме реального времени, чтобы создавать видеокадры с меньшим визуальным шумом.

VideoTemporalDenoisingControl позволяет вашему приложению определить, поддерживается ли временная очистка видео от шумов на текущем устройстве, и если да, то какие режимы очистки поддерживаются. Доступные режимы деноизации: Off, On и Auto. Устройство может не поддерживать все режимы, но каждое устройство должно поддерживать либо авто или вкл, и выкл.

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

<StackPanel Orientation="Vertical" HorizontalAlignment="Right" >
    <StackPanel x:Name="spDenoise" Visibility="Collapsed">
        <TextBlock>Temporal Denoising</TextBlock>
        <RadioButton x:Name="rbDenoiseOff" Checked="rbDenoise_Checked"
            GroupName="Denoise Group" Content="Off"/>
        <RadioButton x:Name="rbDenoiseOn" Checked="rbDenoise_Checked"
            GroupName="Denoise Group" Content="On" Visibility="Collapsed"/>
        <RadioButton x:Name="rbDenoiseAuto" Checked="rbDenoise_Checked"
            GroupName="Denoise Group" Content="Auto" Visibility="Collapsed"/>
    </StackPanel>
</StackPanel>

В следующем методе проверяется свойство VideoTemporalDenoisingControl.Supported, чтобы узнать, поддерживается ли временное шумоподавление на текущем устройстве. Если это так, то мы проверяем, поддерживаются ли Выключено, Автоматически или Включено, и в этом случае делаем наши переключатели видимыми. Затем кнопки авто и включения отображаются, если эти методы поддерживаются.

private void bUpdateDenoiseCapabilities_Click(object sender, RoutedEventArgs e)
{
    if (m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Supported)
    {
         IReadOnlyList<VideoTemporalDenoisingMode> modes = m_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)))
        {
            spDenoise.Visibility = Visibility.Visible;

            if (modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.On))
            {
                rbDenoiseOn.Visibility = Visibility.Visible;
            }
            if (modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Auto))
            {
                rbDenoiseAuto.Visibility = Visibility.Visible;
            }
        }
    }
}

В обработчике событий Checked для переключателей проверяется имя кнопки и устанавливается соответствующий режим через свойство VideoTemporalDenoisingControl.Mode.

private void rbDenoise_Checked(object sender, RoutedEventArgs e)
{
    var button = sender as RadioButton;
    if(button.Name == "denoiseOffButton")
    {
        m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.Off;
    }
    else if (button.Name == "denoiseOnButton")
    {
        m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.On;
    }
    else if (button.Name == "denoiseAutoButton")
    {
        m_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 (m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Supported)
    {
        // Query support for the VideoTemporalDenoising control Off mode
        _isVideoTemporalDenoisingOffSupported = m_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 (m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.On))
        {
            _videoDenoisingEnabledMode = Windows.Media.Devices.VideoTemporalDenoisingMode.On;
            m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
        }
        else if (m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Auto))
        {
            _videoDenoisingEnabledMode = Windows.Media.Devices.VideoTemporalDenoisingMode.Auto;
            m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
        }
    }

}

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

public void EnableFrameProcessing()
{
    // Toggle Off VideoTemporalDenoising
    if (_isVideoTemporalDenoisingOffSupported)
    {
        m_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)
    {
        m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
    }
}

Дополнительные сведения о получении видеокадров для обработки изображений см. в разделе "Обработка кадров мультимедиа" с помощью MediaFrameReader.