Manuella kamerakontroller för videoinspelning
Den här artikeln visar hur du använder manuella enhetskontroller för att aktivera förbättrade videoinspelningsscenarier, inklusive HDR-video och exponeringsprioritet.
De videoenhetskontroller som beskrivs i den här artikeln läggs alla till i din app med samma mönster. Kontrollera först om kontrollen stöds på den aktuella enhet som appen körs på. Om kontrollen stöds anger du önskat läge för kontrollen. Om en viss kontroll inte stöds på den aktuella enheten bör du vanligtvis inaktivera eller dölja användargränssnittselementet som gör att användaren kan aktivera funktionen.
Obs
Den här artikeln bygger på begrepp och kod som beskrivs i Grundläggande bild-, video- och ljudinspelning med MediaCapture, som beskriver stegen för att implementera grundläggande foto- och videoinspelning. Vi rekommenderar att du bekanta dig med det grundläggande medieupptagningsmönstret i den artikeln innan du går vidare till mer avancerade inspelningsscenarier. Koden i den här artikeln förutsätter att appen redan har en instans av MediaCapture- som har initierats korrekt.
HDR-video
HdR-videofunktionen (High Dynamic Range) tillämpar HDR-bearbetning på videoströmmen på inspelningsenheten. Kontrollera om HDR-video stöds genom att välja egenskapen HdrVideoControl.Supported.
HDR-videokontrollen stöder tre lägen: på, av och automatiskt, vilket innebär att enheten dynamiskt avgör om HDR-videobearbetning skulle förbättra medieinspelningen och i så fall aktiverar HDR-video. Kontrollera om ett visst läge stöds på den aktuella enheten genom att kontrollera om HdrVideoControl.SupportedModes samling innehåller önskat läge.
Aktivera eller inaktivera HDR-videobearbetning genom att ange HdrVideoControl.Mode till önskat läge. Den här kontrollen kräver att strömmen är i ett stoppat tillstånd innan läget har angetts, se 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;
}
Exponeringsprioritet
ExposurePriorityVideoControl, när det är aktiverat, utvärderar videorutorna från inspelningsenheten för att avgöra om videon fångar en lågljusscen. I så fall sänker kontrollen bildfrekvensen för den inspelade videon för att öka exponeringstiden för varje bildruta och förbättra den insamlade videons visuella kvalitet.
Kontrollera om prioritetskontrollen för exponering stöds på den aktuella enheten genom att kontrollera egenskapen ExposurePriorityVideoControl.Supported.
Aktivera eller inaktivera exponeringsprioritetskontrollen genom att ställa in ExposurePriorityVideoControl.Enabled till önskat läge.
if (!m_mediaCapture.VideoDeviceController.ExposurePriorityVideoControl.Supported)
{
tbStatus.Text = "Exposure priority not available";
return;
}
m_mediaCapture.VideoDeviceController.ExposurePriorityVideoControl.Enabled = true;
Tidsmässig brusreducering
Från och med Windows 10, version 1803, kan du aktivera temporal denoising för video på enheter som stöder det. Den här funktionen kombinerar bilddata från flera intilliggande bildrutor i realtid för att skapa videoramar som har mindre visuellt brus.
Med VideoTemporalDenoisingControl kan din app avgöra om tidsbaserad brusreducering stöds på den aktuella enheten, och i så fall vilka brusreduceringslägen som stöds. Tillgängliga lägen för brusreducering är Av, Påoch Auto. En enhet kanske inte stöder alla lägen, men varje enhet måste stödja antingen Auto eller både På och Av.
I följande exempel används ett enkelt användargränssnitt för att tillhandahålla alternativknappar som låter användaren växla mellan brusreduceringslägen.
<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>
I följande metod kontrolleras egenskapen VideoTemporalDenoisingControl.Supported för att se om temporal denoising stöds alls på den aktuella enheten. I så fall kontrollerar vi att Av och Auto eller På stöds. I så fall gör vi våra radioknappar synliga. Därefter visas knapparna Auto och På om dessa metoder stöds.
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;
}
}
}
}
I händelsehanteraren Checked för alternativknapparna kontrolleras namnet på knappen, och motsvarande läge anges genom att ställa in egenskapen 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;
}
}
Inaktivera temporal denoising vid bearbetning av bildrutor
Video som har bearbetats med temporal denoising kan vara mer tilltalande för det mänskliga ögat. Men eftersom temporal denoising kan påverka bildkonsekvensen och minska mängden information i ramen, kan appar som utför bildbearbetning på bildrutorna, till exempel registrering eller optisk teckenigenkänning, vilja inaktivera denoising programmatiskt när bildbearbetning är aktiverat.
I följande exempel avgörs vilka denoising-lägen som stöds och lagrar den här informationen i vissa klassvariabler.
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;
}
}
}
När appen aktiverar bildrutebearbetning ställer den in läget för att Av om det läget stöds så att bildrutebearbetningen kan använda råa bildrutor som inte har denoiserats.
public void EnableFrameProcessing()
{
// Toggle Off VideoTemporalDenoising
if (_isVideoTemporalDenoisingOffSupported)
{
m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.Off;
}
_isProcessing = true;
}
När appen inaktiverar bildrutebearbetning, sätter den brusreduceringsläget på På eller Automatiskt, beroende på vilket läge som stöds.
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;
}
}
Mer information om hur du hämtar bildrutor för bildbearbetning finns i Bearbeta medieramar med MediaFrameReader.
Relaterade ämnen
Windows developer