Manuelle Kamerasteuerelemente für die Videoaufnahme
In diesem Artikel erfahren Sie, wie Sie manuelle Gerätesteuerelemente verwenden, um erweiterte Videoaufnahmeszenarien zu ermöglichen, einschließlich HDR-Video und Belichtungspriorität.
Die in diesem Artikel beschriebenen Videogerätesteuerelemente werden ihrer App mit demselben Muster hinzugefügt. Prüfen Sie zunächst, ob das Steuerelement auf dem aktuellen Gerät, auf dem Ihre Anwendung ausgeführt wird, unterstützt wird. Wenn die Steuerung unterstützt wird, stellen Sie den gewünschten Modus für die Steuerung ein. Wenn ein bestimmtes Steuerelement auf dem aktuellen Gerät nicht unterstützt wird, sollten Sie das Oberflächenelement, mit dem der Benutzer die Funktion aktivieren kann, in der Regel deaktivieren oder ausblenden.
Alle in diesem Artikel besprochenen Gerätesteuerungs-APIs sind Mitglieder des Namespace Windows.Media.Devices.
using Windows.Media.Devices;
Hinweis
Dieser Artikel baut auf Konzepten und Code auf, die unter Allgemeine Foto-, Video- und Audioaufnahme mit „MediaCapture“ erläutert werden. Dort werden die Schritte für die Implementierung einer grundlegenden Foto- und Videoaufnahme beschrieben. Wir empfehlen Ihnen, sich mit dem grundlegenden Medienaufnahmemuster in diesem Artikel vertraut zu machen, bevor Sie sich komplexeren Aufnahmeszenarien zuwenden. Der Code in diesem Artikel setzt voraus, dass Ihre App bereits über eine korrekt initialisierte MediaCapture-Instanz verfügt.
HDR-Video
Die HDR-Videofunktion (High Dynamic Range) wendet DIE HDR-Verarbeitung auf den Videostream des Aufnahmegeräts an. Ermitteln Sie, ob HDR-Video unterstützt wird, indem Sie die HdrVideoControl.Supported-Eigenschaft auswählen.
Das HDR-Videosteuerelement unterstützt drei Modi: "Ein", "Aus" und "Automatisch", was bedeutet, dass das Gerät dynamisch bestimmt, ob die HDR-Videoverarbeitung die Medienaufnahme verbessern würde und wenn ja, HDR-Video aktiviert. Um festzustellen, ob ein bestimmter Modus auf dem aktuellen Gerät unterstützt wird, überprüfen Sie, ob die HdrVideoControl.SupportedModes-Auflistung den gewünschten Modus enthält.
Aktivieren oder deaktivieren Sie die HDR-Videoverarbeitung, indem Sie hdrVideoControl.Mode auf den gewünschten Modus festlegen. Für dieses Steuerelement muss der Datenstrom angehalten werden, bevor der Modus festgelegt wird, siehe 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;
}
Gefährdungspriorität
Das ExposurePriorityVideoControl-Steuerelement wertet die Videoframes vom Aufnahmegerät aus, um festzustellen, ob das Video eine Szene mit geringem Licht erfasst. Wenn ja, verringert das Steuerelement die Bildfrequenz des aufgenommenen Videos, um die Belichtungszeit für jeden Frame zu erhöhen und die visuelle Qualität des aufgenommenen Videos zu verbessern.
Ermitteln Sie, ob das Steuerelement für die Belichtungspriorität auf dem aktuellen Gerät unterstützt wird, indem Sie die ExposurePriorityVideoControl.Supported-Eigenschaft überprüfen.
Aktivieren oder deaktivieren Sie das Steuerelement für die Belichtungspriorität, indem Sie " ExposurePriorityVideoControl.Enabled " auf den gewünschten Modus festlegen.
if (!_mediaCapture.VideoDeviceController.ExposurePriorityVideoControl.Supported)
{
ShowMessageToUser("Exposure priority not available");
return;
}
_mediaCapture.VideoDeviceController.ExposurePriorityVideoControl.Enabled = true;
Zeitliche Entleerung
Ab Windows 10, Version 1803, können Sie die zeitliche Verweigerung von Videos auf Geräten aktivieren, die sie unterstützen. Mit diesem Feature werden die Bilddaten aus mehreren angrenzenden Frames in Echtzeit zusammengeführt, um Videoframes mit weniger visuellem Rauschen zu erzeugen.
Mit VideoTemporalDenoisingControl kann Ihre App ermitteln, ob die zeitliche Entgrenzung auf dem aktuellen Gerät unterstützt wird, und wenn ja, welche Denoisierungsmodi unterstützt werden. Die verfügbaren Entleerungsmodi sind "Aus", "Ein" und "Auto". Ein Gerät unterstützt möglicherweise nicht alle Modi, aber jedes Gerät muss entweder "Auto" oder "Ein" und "Aus" unterstützen.
Im folgenden Beispiel wird eine einfache Benutzeroberfläche verwendet, um Optionsfelder bereitzustellen, mit denen der Benutzer zwischen Denoising-Modi wechseln kann.
<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>
In der folgenden Methode wird die VideoTemporalDenoisingControl.Supported-Eigenschaft überprüft, um festzustellen, ob die zeitliche Verweigerung überhaupt auf dem aktuellen Gerät unterstützt wird. Wenn dies der Fall ist, überprüfen wir, ob "Aus" und "Auto" oder "Ein" unterstützt wird. In diesem Fall machen wir unsere Optionsfelder sichtbar. Als Nächstes werden die Schaltflächen "Auto" und "Ein " angezeigt, wenn diese Methoden unterstützt werden.
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;
}
}
}
}
Im Checked-Ereignishandler für die Optionsfelder wird der Name der Schaltfläche aktiviert, und der entsprechende Modus wird durch Festlegen der VideoTemporalDenoisingControl.Mode-Eigenschaft festgelegt.
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;
}
}
Deaktivieren der zeitlichen Entleerung während der Verarbeitung von Frames
Video, das mit zeitlicher Entschlässung verarbeitet wurde, kann für das menschliche Auge angenehmer sein. Da die zeitliche Entschlässung jedoch die Bildkonsistenz beeinträchtigen und die Anzahl der Details im Frame verringern kann, können Apps, die die Bildverarbeitung auf den Frames durchführen, wie z. B. registrierung oder optische Zeichenerkennung, programmgesteuert deaktivieren, wenn die Bildverarbeitung aktiviert ist.
Im folgenden Beispiel wird ermittelt, welche Denoisingmodi unterstützt werden, und speichert diese Informationen in einigen Klassenvariablen.
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;
}
}
}
Wenn die App die Frameverarbeitung aktiviert, wird der Entleerungsmodus auf "Aus " festgelegt, wenn dieser Modus unterstützt wird, sodass die Frameverarbeitung rohe Frames verwenden kann, die nicht entsent wurden.
public void EnableFrameProcessing()
{
// Toggle Off VideoTemporalDenoising
if (_isVideoTemporalDenoisingOffSupported)
{
_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.Off;
}
_isProcessing = true;
}
Wenn die App die Frameverarbeitung deaktiviert, wird der Entsentungsmodus abhängig vom unterstützten Modus auf "Ein " oder "Auto" festgelegt.
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;
}
}
Weitere Informationen zum Abrufen von Videoframes für die Bildverarbeitung finden Sie unter Verarbeiten von Medienframes mit MediaFrameReader.